diff --git a/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityAttributesFiltersUiDefinitionController.groovy b/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityAttributesFiltersUiDefinitionController.groovy index ffd3ee3ab..556adb962 100644 --- a/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityAttributesFiltersUiDefinitionController.groovy +++ b/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityAttributesFiltersUiDefinitionController.groovy @@ -41,7 +41,7 @@ class EntityAttributesFiltersUiDefinitionController { ResponseEntity getUiDefinitionJsonSchema() { try { def parsedJson = jacksonObjectMapper.readValue(this.jsonSchemaLocation.url, Map) - jsonSchemaBuilderService.addReleaseAttributesToJson(parsedJson['properties']['attributeRelease']['widget']) + jsonSchemaBuilderService.addReleaseAttributesToJson(parsedJson['properties']['attributeRelease']['items']) jsonSchemaBuilderService.addRelyingPartyOverridesToJson(parsedJson['properties']['relyingPartyOverrides']) jsonSchemaBuilderService.addRelyingPartyOverridesCollectionDefinitionsToJson(parsedJson["definitions"]) return ResponseEntity.ok(parsedJson) diff --git a/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataSourcesUiDefinitionController.groovy b/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataSourcesUiDefinitionController.groovy index 6fa503fcc..bf685db05 100644 --- a/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataSourcesUiDefinitionController.groovy +++ b/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataSourcesUiDefinitionController.groovy @@ -46,7 +46,7 @@ class MetadataSourcesUiDefinitionController { try { def parsedJson = jacksonObjectMapper.readValue(this.jsonSchemaLocation.url, Map) jsonSchemaBuilderService.hideServiceEnabledFromNonAdmins(parsedJson) - jsonSchemaBuilderService.addReleaseAttributesToJson(parsedJson['properties']['attributeRelease']['widget']) + jsonSchemaBuilderService.addReleaseAttributesToJson(parsedJson['properties']['attributeRelease']['items']) jsonSchemaBuilderService.addRelyingPartyOverridesToJson(parsedJson['properties']['relyingPartyOverrides']) jsonSchemaBuilderService.addRelyingPartyOverridesCollectionDefinitionsToJson(parsedJson["definitions"]) return ResponseEntity.ok(parsedJson) diff --git a/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JsonSchemaBuilderService.groovy b/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JsonSchemaBuilderService.groovy index ab3ae6fda..3a84fce4f 100644 --- a/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JsonSchemaBuilderService.groovy +++ b/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JsonSchemaBuilderService.groovy @@ -20,8 +20,8 @@ class JsonSchemaBuilderService { } void addReleaseAttributesToJson(Object json) { - json['data'] = customPropertiesConfiguration.getAttributes().collect { - [key: it['name'], label: it['displayName']] + json['enum'] = customPropertiesConfiguration.getAttributes().collect { + it['name'] } } @@ -36,12 +36,8 @@ class JsonSchemaBuilderService { property = [title : it['displayName'], description: it['helpText'], - type : it['displayType']] - if (it['displayType'] == 'boolean') { - property['default'] = Boolean.valueOf(it['defaultValue']) - } else { - property['default'] = it['defaultValue'] - } + type : it['displayType'], + examples : it['examples']] } properties[(String) it['name']] = property } @@ -64,7 +60,7 @@ class JsonSchemaBuilderService { def items = [type : 'string', minLength: 1, // TODO: should this be configurable? maxLength: 255] //TODO: or this? - items.widget = [id: 'datalist', data: it['defaultValues']] + items.examples = it['examples'] definition['items'] = items json[(String) it['name']] = definition @@ -76,7 +72,7 @@ class JsonSchemaBuilderService { if (currentUser != null && currentUser.role != 'ROLE_ADMIN') { // user isn't an admin, so hide 'ServiceEnabled' Map serviceEnabled = (HashMap) json['properties']['serviceEnabled'] - serviceEnabled['widget'] = 'hidden' + serviceEnabled['readOnly'] = true serviceEnabled.remove('title') serviceEnabled.remove('description') } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/RootUiViewController.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/RootUiViewController.java index 333f5c8c9..5aef3d9e2 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/RootUiViewController.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/RootUiViewController.java @@ -35,7 +35,7 @@ public void indexHtml(HttpServletRequest request, HttpServletResponse response) .lines() .collect(Collectors.joining("\n")); - content = content.replaceFirst("", ""); + content = content.replaceFirst("]+>", ""); response.setContentType("text/html"); try (OutputStream writer = response.getOutputStream()) { writer.write(content.getBytes()); diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/RelyingPartyOverrideProperty.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/RelyingPartyOverrideProperty.java index 1808ab6ef..c28a290e8 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/RelyingPartyOverrideProperty.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/RelyingPartyOverrideProperty.java @@ -16,7 +16,7 @@ public class RelyingPartyOverrideProperty { private String displayType; private String defaultValue; private String helpText; - private List defaultValues; + private List examples; private String persistType; private String persistValue; private String attributeName; @@ -33,7 +33,7 @@ public String toString() { + ", \nhelpText='" + helpText + '\'' + ", \npersistType='" + persistType + '\'' + ", \npersistValue='" + persistValue + '\'' - + ", \ndefaultValues=" + defaultValues + + ", \nexamples=" + examples + ", \nattributeName='" + attributeName + '\'' + ", \nattributeFriendlyName='" + attributeFriendlyName + '\'' + "\n}"; diff --git a/backend/src/main/resources/application.yml b/backend/src/main/resources/application.yml index fd5224758..ea5222d05 100644 --- a/backend/src/main/resources/application.yml +++ b/backend/src/main/resources/application.yml @@ -68,14 +68,12 @@ custom: - name: signAssertion displayName: label.sign-the-assertion displayType: boolean - defaultValue: false helpText: tooltip.sign-assertion attributeName: http://shibboleth.net/ns/profiles/saml2/sso/browser/signAssertions attributeFriendlyName: signAssertions - name: dontSignResponse displayName: label.dont-sign-the-response displayType: boolean - defaultValue: false helpText: tooltip.dont-sign-response attributeName: http://shibboleth.net/ns/profiles/saml2/sso/browser/signResponses attributeFriendlyName: signResponses @@ -83,7 +81,6 @@ custom: - name: turnOffEncryption displayName: label.turn-off-encryption-of-response displayType: boolean - defaultValue: false helpText: tooltip.turn-off-encryption attributeName: http://shibboleth.net/ns/profiles/encryptAssertions attributeFriendlyName: encryptAssertions @@ -91,7 +88,6 @@ custom: - name: useSha displayName: label.use-sha1-signing-algorithm displayType: boolean - defaultValue: false helpText: tooltip.usa-sha-algorithm persistType: string persistValue: shibboleth.SecurityConfiguration.SHA1 @@ -100,7 +96,6 @@ custom: - name: ignoreAuthenticationMethod displayName: label.ignore-any-sp-requested-authentication-method displayType: boolean - defaultValue: false helpText: tooltip.ignore-auth-method persistType: string persistValue: 0x1 @@ -109,7 +104,6 @@ custom: - name: omitNotBefore displayName: label.omit-not-before-condition displayType: boolean - defaultValue: false helpText: tooltip.omit-not-before-condition attributeName: http://shibboleth.net/ns/profiles/includeConditionsNotBefore attributeFriendlyName: includeConditionsNotBefore @@ -117,7 +111,6 @@ custom: - name: responderId displayName: label.responder-id displayType: string - defaultValue: null helpText: tooltip.responder-id attributeName: http://shibboleth.net/ns/profiles/responderId attributeFriendlyName: responderId @@ -125,7 +118,7 @@ custom: displayName: label.nameid-format-to-send displayType: set helpText: tooltip.nameid-format - defaultValues: + examples: - urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified - urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress - urn:oasis:names:tc:SAML:2.0:nameid-format:persistent @@ -136,7 +129,7 @@ custom: displayName: label.authentication-methods-to-use displayType: set helpText: tooltip.authentication-methods-to-use - defaultValues: + examples: - https://refeds.org/profile/mfa - urn:oasis:names:tc:SAML:2.0:ac:classes:TimeSyncToken - urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport @@ -145,7 +138,6 @@ custom: - name: forceAuthn displayName: label.force-authn displayType: boolean - defaultValue: false helpText: tooltip.force-authn attributeName: http://shibboleth.net/ns/profiles/forceAuthn attributeFriendlyName: forceAuthn \ No newline at end of file diff --git a/backend/src/main/resources/dynamic-http-metadata-provider.schema.json b/backend/src/main/resources/dynamic-http-metadata-provider.schema.json index 035e8d4e0..7d799784b 100644 --- a/backend/src/main/resources/dynamic-http-metadata-provider.schema.json +++ b/backend/src/main/resources/dynamic-http-metadata-provider.schema.json @@ -10,30 +10,13 @@ "name": { "title": "label.metadata-provider-name-dashboard-display-only", "description": "tooltip.metadata-provider-name-dashboard-display-only", - "type": "string", - "widget": { - "id": "string", - "help": "message.must-be-unique" - } + "type": "string" }, "@type": { "title": "label.metadata-provider-type", "description": "tooltip.metadata-provider-type", - "placeholder": "label.select-metadata-type", "type": "string", - "readOnly": true, - "widget": { - "id": "select", - "disabled": true - }, - "oneOf": [ - { - "enum": [ - "DynamicHttpMetadataResolver" - ], - "description": "value.dynamic-http-metadata-provider" - } - ] + "default": "DynamicHttpMetadataResolver" }, "enabled": { "title": "label.enable-provider-upon-saving", @@ -53,6 +36,48 @@ "@type", "content" ], + "dependencies": { + "@type": { + "oneOf": [ + { + "properties": { + "@type": { + "enum": [ + "Regex" + ] + }, + "match": { + "title": "label.match", + "description": "tooltip.match", + "type": "string", + "widget": { + "id": "string", + "required": true + } + } + }, + "required": [ + "@type", + "content", + "match" + ] + }, + { + "properties": { + "@type": { + "enum": [ + "MetadataQueryProtocol" + ] + } + }, + "required": [ + "@type", + "content" + ] + } + ] + } + }, "properties": { "@type": { "title": "label.md-request-type", @@ -61,99 +86,62 @@ "widget": { "id": "select" }, - "oneOf": [ - { - "enum": [ - "MetadataQueryProtocol" - ], - "description": "value.md-query-protocol" - }, - { - "enum": [ - "Regex" - ], - "description": "value.regex" - } + "enum": [ + "MetadataQueryProtocol", + "Regex" ] }, "content": { "title": "label.md-request-value", "description": "tooltip.md-request-value", "type": "string" - }, - "match": { - "title": "label.match", - "description": "tooltip.match", - "type": "string", - "widget": { - "id": "string", - "required": true - }, - "visibleIf": { - "@type": [ - "Regex" - ] - } } } }, "requireValidMetadata": { "title": "label.require-valid-metadata", "description": "tooltip.require-valid-metadata", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ] + "type": "boolean" }, "failFastInitialization": { "title": "label.fail-fast-init", "description": "tooltip.fail-fast-init", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ] + "type": "boolean" }, "dynamicMetadataResolverAttributes": { "type": "object", + "dependencies": { + "initializeFromPersistentCacheInBackground": { + "oneOf": [ + { + "properties": { + "initializeFromPersistentCacheInBackground": { + "enum": [true] + }, + "backgroundInitializationFromCacheDelay": { + "title": "label.background-init-from-cache-delay", + "description": "tooltip.background-init-from-cache-delay", + "type": "string", + "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" + } + } + }, + { + "properties": { + "initializeFromPersistentCacheInBackground": { + "enum": [false] + } + } + } + ] + } + }, "properties": { "refreshDelayFactor": { "title": "label.refresh-delay-factor", "description": "tooltip.refresh-delay-factor", "type": "number", - "widget": { - "id": "float", - "help": "message.real-number", - "step": 0.01 - }, - "placeholder": "label.real-number", + "multipleOf": 0.01, "minimum": 0.001, "maximum": 0.999 }, @@ -161,106 +149,29 @@ "title": "label.min-cache-duration", "description": "tooltip.min-cache-duration", "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" }, "maxCacheDuration": { "title": "label.max-cache-duration", "description": "tooltip.max-cache-duration", "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" }, "maxIdleEntityData": { "title": "label.max-idle-entity-data", "description": "tooltip.max-idle-entity-data", "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" }, "removeIdleEntityData": { "title": "label.remove-idle-entity-data", "description": "tooltip.remove-idle-entity-data", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ] + "type": "boolean" }, "cleanupTaskInterval": { "title": "label.cleanup-task-interval", "description": "tooltip.cleanup-task-interval", "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" }, "persistentCacheManagerDirectory": { @@ -272,50 +183,7 @@ "initializeFromPersistentCacheInBackground": { "title": "label.initialize-from-persistent-cache-in-background", "description": "tooltip.initialize-from-persistent-cache-in-background", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ] - }, - "backgroundInitializationFromCacheDelay": { - "title": "label.background-init-from-cache-delay", - "description": "tooltip.background-init-from-cache-delay", - "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "visibleIf": { - "initializeFromPersistentCacheInBackground": [ - true - ] - }, - "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" + "type": "boolean" } } }, @@ -377,37 +245,18 @@ "disregardTLSCertificate": { "type": "boolean", "title": "label.disregard-tls-cert", - "description": "tooltip.disregard-tls-cert", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "True" - }, - { - "enum": [ - false - ], - "description": "False" - } - ] + "description": "tooltip.disregard-tls-cert" }, "httpClientRef": { "type": "string", "title": "", "description": "", - "placeholder": "", "widget": "hidden" }, "connectionRequestTimeout": { "type": "string", "title": "label.connection-request-timeout", "description": "tooltip.connection-request-timeout", - "placeholder": "label.duration", "widget": { "id": "datalist", "data": [ @@ -428,7 +277,6 @@ "type": "string", "title": "label.connection-timeout", "description": "tooltip.connection-timeout", - "placeholder": "label.duration", "widget": { "id": "datalist", "data": [ @@ -449,7 +297,6 @@ "type": "string", "title": "label.socket-timeout", "description": "tooltip.socket-timeout", - "placeholder": "label.duration", "widget": { "id": "datalist", "data": [ @@ -469,46 +316,37 @@ "tlsTrustEngineRef": { "type": "string", "title": "", - "description": "", - "placeholder": "", - "widget": "hidden" + "description": "" }, "httpClientSecurityParametersRef": { "type": "string", "title": "", - "description": "", - "placeholder": "", - "widget": "hidden" + "description": "" }, "proxyHost": { "type": "string", "title": "label.proxy-host", - "description": "tooltip.proxy-host", - "placeholder": "" + "description": "tooltip.proxy-host" }, "proxyPort": { "type": "string", "title": "label.proxy-port", - "description": "tooltip.proxy-port", - "placeholder": "" + "description": "tooltip.proxy-port" }, "proxyUser": { "type": "string", "title": "label.proxy-user", - "description": "tooltip.proxy-user", - "placeholder": "" + "description": "tooltip.proxy-user" }, "proxyPassword": { "type": "string", "title": "label.proxy-password", - "description": "tooltip.proxy-password", - "placeholder": "" + "description": "tooltip.proxy-password" }, "httpCaching": { "type": "string", "title": "label.http-caching", "description": "tooltip.http-caching", - "placeholder": "label.select-caching-type", "widget": { "id": "select" }, @@ -536,21 +374,18 @@ "httpCacheDirectory": { "type": "string", "title": "label.http-caching-directory", - "description": "tooltip.http-caching-directory", - "placeholder": "" + "description": "tooltip.http-caching-directory" }, "httpMaxCacheEntries": { "type": "integer", "title": "label.http-max-cache-entries", "description": "tooltip.http-max-cache-entries", - "placeholder": "", "minimum": 0 }, "httpMaxCacheEntrySize": { "type": "integer", "title": "label.max-cache-entry-size", "description": "tooltip.max-cache-entry-size", - "placeholder": "", "minimum": 0 } } @@ -560,7 +395,6 @@ "title": "", "description": "", "type": "array", - "additionalItems": true, "items": [ { "$id": "RequiredValidUntil", @@ -570,25 +404,14 @@ "id": "fieldset" }, "properties": { + "@type": { + "type": "string", + "default": "RequiredValidUntil" + }, "maxValidityInterval": { "title": "label.max-validity-interval", "description": "tooltip.max-validity-interval", "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" } } @@ -601,6 +424,10 @@ "id": "fieldset" }, "properties": { + "@type": { + "type": "string", + "default": "SignatureValidation" + }, "requireSignedRoot": { "title": "label.require-signed-root", "description": "tooltip.require-signed-root", @@ -612,29 +439,29 @@ "type": "string" } }, - "anyOf": [ - { - "properties": { - "requireSignedRoot": { - "enum": [ - true + "dependencies": { + "requireSignedRoot": { + "oneOf": [ + { + "properties": { + "requireSignedRoot": { + "enum": [true] + } + }, + "required": [ + "certificateFile" ] + }, + { + "properties": { + "requireSignedRoot": { + "enum": [false] + } + } } - }, - "required": [ - "certificateFile" ] - }, - { - "properties": { - "requireSignedRoot": { - "enum": [ - false - ] - } - } } - ] + } }, { "$id": "EntityRoleWhiteList", @@ -644,6 +471,10 @@ "id": "fieldset" }, "properties": { + "@type": { + "type": "string", + "default": "EntityRoleWhiteList" + }, "retainedRoles": { "title": "label.retained-roles", "description": "tooltip.retained-roles", @@ -653,19 +484,13 @@ "id": "select" }, "type": "string", - "oneOf": [ - { - "enum": [ - "SPSSODescriptor" - ], - "description": "value.spdescriptor" - }, - { - "enum": [ - "AttributeAuthorityDescriptor" - ], - "description": "value.attr-auth-descriptor" - } + "enum": [ + "SPSSODescriptor", + "AttributeAuthorityDescriptor" + ], + "enumNames": [ + "value.spdescriptor", + "value.attr-auth-descriptor" ] } }, @@ -684,4 +509,4 @@ ] } } -} +} \ No newline at end of file diff --git a/backend/src/main/resources/entity-attributes-filters-ui-schema.json b/backend/src/main/resources/entity-attributes-filters-ui-schema.json index fa64d5abb..1db03af99 100644 --- a/backend/src/main/resources/entity-attributes-filters-ui-schema.json +++ b/backend/src/main/resources/entity-attributes-filters-ui-schema.json @@ -1,34 +1,20 @@ { - "title": "EntityAttributes Filter", "type": "object", "properties": { "name": { "title": "label.filter-name", "description": "tooltip.filter-name", - "type": "string", - "widget": { - "id": "string", - "help": "message.must-be-unique" - } + "type": "string" }, "@type": { "type": "string", - "widget": { - "id": "hidden" - }, "default": "EntityAttributes" }, "resourceId": { - "type": "string", - "widget": { - "id": "hidden" - } + "type": "string" }, "version": { - "type": "integer", - "widget": { - "id": "hidden" - } + "type": "integer" }, "filterEnabled": { "title": "label.enable-filter", @@ -40,46 +26,25 @@ "title": "label.search-criteria", "description": "tooltip.search-criteria", "type": "object", - "widget": { - "id": "filter-target", - "target": "entityAttributesFilterTargetType" - }, "properties": { "entityAttributesFilterTargetType": { "title": "label.filter-target-type", "type": "string", "default": "ENTITY", - "oneOf": [ - { - "enum": [ - "ENTITY" - ], - "description": "value.entity-id" - }, - { - "enum": [ - "REGEX" - ], - "description": "value.regex" - }, - { - "enum": [ - "CONDITION_SCRIPT" - ], - "description": "value.script" - } + "enum": [ + "ENTITY", + "REGEX", + "CONDITION_SCRIPT" + ], + "enumNames": [ + "value.entity-id", + "value.regex", + "value.script" ] }, "value": { "title": "label.filter-target-value", "type": "array", - "buttons": [ - { - "id": "preview", - "label": "action.preview", - "widget": "icon-button" - } - ], "minItems": 1, "uniqueItems": true, "items": { @@ -87,7 +52,10 @@ } } }, - "required": ["value", "entityAttributesFilterTargetType"] + "required": [ + "value", + "entityAttributesFilterTargetType" + ] }, "relyingPartyOverrides": { "type": "object", @@ -134,52 +102,44 @@ }, "nameIdFormats": { "title": "label.nameid-format-to-send", - "placeholder": "label.nameid-format", "description": "tooltip.nameid-format", "type": "array", "uniqueItems": true, "items": { - "title": "label.nameid-format", "type": "string", - "widget": { - "id": "datalist", - "data": [ - "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified", - "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress", - "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent", - "urn:oasis:names:tc:SAML:2.0:nameid-format:transient" - ] - } + "minLength": 1, + "maxLength": 255, + "examples": [ + "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified", + "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress", + "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent", + "urn:oasis:names:tc:SAML:2.0:nameid-format:transient" + ] } }, "authenticationMethods": { "title": "label.authentication-methods-to-use", "description": "tooltip.authentication-methods-to-use", "type": "array", - "placeholder": "label.authentication-method", "uniqueItems": true, "items": { "type": "string", - "title": "label.authentication-method", - "widget": { - "id": "datalist", - "data": [ - "https://refeds.org/profile/mfa", - "urn:oasis:names:tc:SAML:2.0:ac:classes:TimeSyncToken", - "urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport" - ] - } + "minLength": 1, + "maxLength": 255, + "examples": [ + "https://refeds.org/profile/mfa", + "urn:oasis:names:tc:SAML:2.0:ac:classes:TimeSyncToken", + "urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport" + ] } } } }, "attributeRelease": { + "title": "label.attribute-release", "type": "array", "description": "Attribute release table - select the attributes you want to release (default unchecked)", - "widget": { - "id": "checklist", - "dataUrl": "/customAttributes" - }, + "uniqueItems": true, "items": { "type": "string" } @@ -188,31 +148,6 @@ "required": [ "name" ], - "fieldsets": [ - { - "type": "group-lg", - "fields": [ - "name", - "@type", - "resourceId", - "version", - "entityAttributesFilterTarget" - ] - }, - { - "type": "group", - "fields": [ - "filterEnabled", - "relyingPartyOverrides" - ] - }, - { - "type": "group", - "fields": [ - "attributeRelease" - ] - } - ], "definitions": { } } \ No newline at end of file diff --git a/backend/src/main/resources/file-system-metadata-provider.schema.json b/backend/src/main/resources/file-system-metadata-provider.schema.json index b7b2292d9..f2ce9e7c3 100644 --- a/backend/src/main/resources/file-system-metadata-provider.schema.json +++ b/backend/src/main/resources/file-system-metadata-provider.schema.json @@ -19,21 +19,8 @@ "@type": { "title": "label.metadata-provider-type", "description": "tooltip.metadata-provider-type", - "placeholder": "label.select-metadata-type", "type": "string", - "readOnly": true, - "widget": { - "id": "select", - "disabled": true - }, - "oneOf": [ - { - "enum": [ - "FilesystemMetadataResolver" - ], - "description": "value.file-system-metadata-provider" - } - ] + "default": "FilesystemMetadataResolver" }, "xmlId": { "title": "label.xml-id", @@ -56,24 +43,7 @@ "doInitialization": { "title": "label.do-resolver-initialization", "description": "tooltip.do-resolver-initialization", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ] + "type": "boolean" }, "reloadableMetadataResolverAttributes": { "type": "object", @@ -82,54 +52,19 @@ "title": "label.min-refresh-delay", "description": "tooltip.min-refresh-delay", "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" }, "maxRefreshDelay": { "title": "label.max-refresh-delay", "description": "tooltip.max-refresh-delay", "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" }, "refreshDelayFactor": { "title": "label.refresh-delay-factor", "description": "tooltip.refresh-delay-factor", "type": "number", - "widget": { - "id": "float", - "help": "message.real-number", - "step": 0.01 - }, - "placeholder": "label.real-number", + "multipleOf": 0.01, "minimum": 0.001, "maximum": 0.999 } diff --git a/backend/src/main/resources/filebacked-http-metadata-provider.schema.json b/backend/src/main/resources/filebacked-http-metadata-provider.schema.json index ee27e6330..655ff5e0d 100644 --- a/backend/src/main/resources/filebacked-http-metadata-provider.schema.json +++ b/backend/src/main/resources/filebacked-http-metadata-provider.schema.json @@ -38,21 +38,8 @@ "@type": { "title": "label.metadata-provider-type", "description": "tooltip.metadata-provider-type", - "placeholder": "label.select-metadata-type", "type": "string", - "readOnly": true, - "widget": { - "id": "select", - "disabled": true - }, - "oneOf": [ - { - "enum": [ - "FileBackedHttpMetadataResolver" - ], - "description": "value.file-backed-http-metadata-provider" - } - ] + "default": "FileBackedHttpMetadataResolver" }, "enabled": { "title": "label.enable-service", @@ -75,24 +62,7 @@ "initializeFromBackupFile": { "title": "label.init-from-backup", "description": "tooltip.init-from-backup", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ] + "type": "boolean" }, "backingFile": { "title": "label.backing-file", @@ -103,179 +73,49 @@ "title": "label.backup-file-init-refresh-delay", "description": "tooltip.backup-file-init-refresh-delay", "type": "string", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" }, "requireValidMetadata": { "title": "label.require-valid-metadata", "description": "tooltip.require-valid-metadata", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ] + "type": "boolean" }, "failFastInitialization": { "title": "label.fail-fast-init", "description": "tooltip.fail-fast-init", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ] + "type": "boolean" }, "useDefaultPredicateRegistry": { "title": "label.use-default-predicate-reg", "description": "tooltip.use-default-predicate-reg", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ] + "type": "boolean" }, "satisfyAnyPredicates": { "$id": "satisfyAnyPredicates", "title": "label.satisfy-any-predicates", "description": "tooltip.satisfy-any-predicates", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ] + "type": "boolean" }, "httpMetadataResolverAttributes": { "$id": "httpMetadataResolverAttributes", "order": [], "type": "object", - "fieldsets": [ - { - "title": "label.http-connection-attributes", - "type": "section", - "fields": [ - "connectionRequestTimeout", - "connectionTimeout", - "socketTimeout" - ] - }, - { - "title": "label.http-security-attributes", - "type": "section", - "class": "col-12", - "fields": [ - "disregardTLSCertificate" - ] - }, - { - "title": "label.http-proxy-attributes", - "type": "section", - "class": "col-12", - "fields": [ - "proxyHost", - "proxyPort", - "proxyUser", - "proxyPassword" - ] - }, - { - "title": "label.http-caching-attributes", - "type": "section", - "class": "col-12", - "fields": [ - "httpCaching", - "httpCacheDirectory", - "httpMaxCacheEntries", - "httpMaxCacheEntrySize" - ] - }, - { - "title": "", - "type": "hidden", - "class": "col-12", - "fields": [ - "tlsTrustEngineRef", - "httpClientSecurityParametersRef", - "httpClientRef" - ] - } - ], "properties": { + "disregardTLSCertificate": { + "type": "boolean", + "title": "label.disregard-tls-cert", + "description": "tooltip.disregard-tls-cert" + }, "httpClientRef": { "type": "string", "title": "", "description": "", - "placeholder": "", "widget": "hidden" }, "connectionRequestTimeout": { "type": "string", "title": "label.connection-request-timeout", "description": "tooltip.connection-request-timeout", - "placeholder": "label.duration", "widget": { "id": "datalist", "data": [ @@ -296,7 +136,6 @@ "type": "string", "title": "label.connection-timeout", "description": "tooltip.connection-timeout", - "placeholder": "label.duration", "widget": { "id": "datalist", "data": [ @@ -317,7 +156,6 @@ "type": "string", "title": "label.socket-timeout", "description": "tooltip.socket-timeout", - "placeholder": "label.duration", "widget": { "id": "datalist", "data": [ @@ -334,71 +172,40 @@ }, "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" }, - "disregardTLSCertificate": { - "type": "boolean", - "title": "label.disregard-tls-cert", - "description": "tooltip.disregard-tls-cert", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "True" - }, - { - "enum": [ - false - ], - "description": "False" - } - ] - }, "tlsTrustEngineRef": { "type": "string", "title": "", - "description": "", - "placeholder": "", - "widget": "hidden" + "description": "" }, "httpClientSecurityParametersRef": { "type": "string", "title": "", - "description": "", - "placeholder": "", - "widget": "hidden" + "description": "" }, "proxyHost": { "type": "string", "title": "label.proxy-host", - "description": "tooltip.proxy-host", - "placeholder": "" + "description": "tooltip.proxy-host" }, "proxyPort": { "type": "string", "title": "label.proxy-port", - "description": "tooltip.proxy-port", - "placeholder": "" + "description": "tooltip.proxy-port" }, "proxyUser": { "type": "string", "title": "label.proxy-user", - "description": "tooltip.proxy-user", - "placeholder": "" + "description": "tooltip.proxy-user" }, "proxyPassword": { "type": "string", "title": "label.proxy-password", - "description": "tooltip.proxy-password", - "placeholder": "" + "description": "tooltip.proxy-password" }, "httpCaching": { "type": "string", "title": "label.http-caching", "description": "tooltip.http-caching", - "placeholder": "label.select-caching-type", "widget": { "id": "select" }, @@ -426,21 +233,18 @@ "httpCacheDirectory": { "type": "string", "title": "label.http-caching-directory", - "description": "tooltip.http-caching-directory", - "placeholder": "" + "description": "tooltip.http-caching-directory" }, "httpMaxCacheEntries": { "type": "integer", "title": "label.http-max-cache-entries", "description": "tooltip.http-max-cache-entries", - "placeholder": "", "minimum": 0 }, "httpMaxCacheEntrySize": { "type": "integer", "title": "label.max-cache-entry-size", "description": "tooltip.max-cache-entry-size", - "placeholder": "", "minimum": 0 } } @@ -453,54 +257,19 @@ "title": "label.min-refresh-delay", "description": "tooltip.min-refresh-delay", "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" }, "maxRefreshDelay": { "title": "label.max-refresh-delay", "description": "tooltip.max-refresh-delay", "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" }, "refreshDelayFactor": { "title": "label.refresh-delay-factor", "description": "tooltip.refresh-delay-factor", "type": "number", - "widget": { - "id": "float", - "help": "message.real-number", - "step": 0.01 - }, - "placeholder": "label.real-number", + "multipleOf": 0.01, "minimum": 0.001, "maximum": 0.999 } @@ -511,7 +280,6 @@ "title": "", "description": "", "type": "array", - "additionalItems": true, "items": [ { "$id": "RequiredValidUntil", @@ -521,25 +289,14 @@ "id": "fieldset" }, "properties": { + "@type": { + "type": "string", + "default": "RequiredValidUntil" + }, "maxValidityInterval": { "title": "label.max-validity-interval", "description": "tooltip.max-validity-interval", "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" } } @@ -552,6 +309,10 @@ "id": "fieldset" }, "properties": { + "@type": { + "type": "string", + "default": "SignatureValidation" + }, "requireSignedRoot": { "title": "label.require-signed-root", "description": "tooltip.require-signed-root", @@ -563,29 +324,29 @@ "type": "string" } }, - "anyOf": [ - { - "properties": { - "requireSignedRoot": { - "enum": [ - true + "dependencies": { + "requireSignedRoot": { + "oneOf": [ + { + "properties": { + "requireSignedRoot": { + "enum": [true] + } + }, + "required": [ + "certificateFile" ] + }, + { + "properties": { + "requireSignedRoot": { + "enum": [false] + } + } } - }, - "required": [ - "certificateFile" ] - }, - { - "properties": { - "requireSignedRoot": { - "enum": [ - false - ] - } - } } - ] + } }, { "$id": "EntityRoleWhiteList", @@ -595,6 +356,10 @@ "id": "fieldset" }, "properties": { + "@type": { + "type": "string", + "default": "EntityRoleWhiteList" + }, "retainedRoles": { "title": "label.retained-roles", "description": "tooltip.retained-roles", @@ -604,19 +369,13 @@ "id": "select" }, "type": "string", - "oneOf": [ - { - "enum": [ - "SPSSODescriptor" - ], - "description": "value.spdescriptor" - }, - { - "enum": [ - "AttributeAuthorityDescriptor" - ], - "description": "value.attr-auth-descriptor" - } + "enum": [ + "SPSSODescriptor", + "AttributeAuthorityDescriptor" + ], + "enumNames": [ + "value.spdescriptor", + "value.attr-auth-descriptor" ] } }, diff --git a/backend/src/main/resources/i18n/messages.properties b/backend/src/main/resources/i18n/messages.properties index 0032a25ed..50049f5cb 100644 --- a/backend/src/main/resources/i18n/messages.properties +++ b/backend/src/main/resources/i18n/messages.properties @@ -59,6 +59,10 @@ action.restore=Restore action.view-only-changes=View Only Changes action.user-role=User Role action.toggle-view=Toggle view +action.advanced=Advanced +action.add-new-attribute=Add new attribute +action.add-attribute=Add Attribute +action.custom-entity-attributes=Custom Entity Attributes value.enabled=Enabled value.disabled=Disabled @@ -97,6 +101,12 @@ value.local-dynamic-metadata-provider=LocalDynamicMetadataProvider value.md-query-protocol=MetadataQueryProtocol value.template=Template +value.string=String +value.boolean=Boolean +value.list=List +value.BOOLEAN=Boolean +value.SELECTION_LIST=List +value.STRING=String brand.header.title=Source Management brand.logo-link-label=Shibboleth @@ -111,13 +121,31 @@ brand.footer.links-label-3=Issue Tracker brand.footer.links-desc-3=Shibboleth.net open-source community issue tracker brand.footer.links-label-4=Mailing List brand.footer.links-desc-4=Shibboleth.net open-source community mailing list -brand.footer.copyright=Copyright \u00A9 Internet2 +brand.footer.copyright=Copyright \u00A9 {year} Internet2 brand.in-partnership-with=In partnership with brand.and=and heading.shibboleth=Shibboleth +label.source-configuration=Metadata Source Configuration +label.provider-configuration=Metadata Provider Configuration +label.entity-attribute-name=Custom Entity Attribute Name +tooltip.entity-attribute-name=Custom Entity Attribute Name +label.entity-attribute-type=Attribute Type +tooltip.entity-attribute-type=Attribute Type +label.entity-attribute-help=Help Text +tooltip.entity-attribute-help=Help Text +label.entity-attribute-default=Default Value +tooltip.entity-attribute-default=Default Value +label.entity-attribute-list-options=List options +tooltip.entity-attribute-list-options=List options + +label.entity-attributes=Entity Attributes +label.custom-entity-attributes=Custom Entity Attributes +label.help-text=Help text +label.default-value=Default Value + label.metadata-source=Metadata Source label.metadata-sources=Metadata Sources label.metadata-provider=Metadata Provider @@ -148,7 +176,7 @@ label.select-protocol=Select Protocol label.nameid-format=NameID Format label.nameid-formats=NameID Formats label.name-and-entity-id=Name and Entity ID -label.organization-information=Organization Information +label.organization-information=SP/Organization Information label.contact-information=Contact Information label.given-name=Given Name label.contact-type=Contact Type @@ -406,11 +434,12 @@ label.delete=Delete? label.title=Title label.enabled=Enabled +label.disabled=Disabled label.author=Author label.creation-date=Creation Date label.order=Order label.provider-type=Provider Type - +label.version-history=Version History label.metadata-resolver-history=Metadata resolver history label.metadata-version-history=Metadata Version History label.select-version=Select Version @@ -433,11 +462,17 @@ label.provider=Metadata Provider message.delete-user-title=Delete User? message.delete-user-body=You are requesting to delete a user. If you complete this process the user will be removed. This cannot be undone. Do you wish to continue? +message.delete-attribute-title=Delete Attribute? +message.delete-attribute-body=You are requesting to delete a custom attribute. If you complete this process the attribute will be removed. This cannot be undone. Do you wish to continue? + message.must-be-unique=Must be unique. +message.must-be-number=Must be a number. message.name-must-be-unique=Name must be unique. message.uri-valid-format=URI must be valid format. message.id-unique=ID must be unique. message.array-items-must-be-unique=Items in list must be unique. +message.valid-duration=Must be a valid duration. +message.required=Missing required property. message.org-name-required=Organization Name is required. message.org-displayName-required=Organization Name is required. @@ -492,6 +527,9 @@ message.invalid-regex-pattern=Invalid Regular Expression message.invalid-signing=Unless the response or the assertions are signed, SAML security is compromised and the service should reject the SAML response. (If it doesn\u0027t, investigate, as that is serious unless the HTTP-Artifact binding is in use.) +message.session-timeout-heading=Session timed out +message.session-timeout-body=Your session has timed out. Please login again. + tooltip.entity-id=Entity ID tooltip.service-provider-name=Service Provider Name (Dashboard Display Only) tooltip.force-authn=Disallows use (or reuse) of authentication results and login flows that don\u0027t provide a real-time proof of user presence in the login process @@ -515,8 +553,9 @@ tooltip.want-assertions-signed=Want Assertions Signed tooltip.certificate-name=Certificate Name tooltip.certificate-type=Certificate Type tooltip.certificate=Certificate -tooltip.logout-endpoints-url=Logout Endpoints Url -tooltip.logout-endpoints-binding-type=Logout Endpoints Binding Type +tooltip.logout-endpoints=Logout Endpoints +tooltip.url=Logout Endpoints Url +tooltip.binding-type=Logout Endpoints Binding Type tooltip.mdui-display-name=Typically, the IdP Display Name field will be presented on IdP discovery service interfaces. tooltip.mdui-information-url=The IdP Information URL is a link to a comprehensive information page about the IdP. This page should expand on the content of the IdP Description field. tooltip.mdui-description=The IdP Description is a brief description of the IdP service. On a well-designed discovery interface, the IdP Description will be presented to the user in addition to the IdP Display Name, and so the IdP Description helps disambiguate duplicate or similar IdP Display Names. diff --git a/backend/src/main/resources/i18n/messages_en.properties b/backend/src/main/resources/i18n/messages_en.properties index 9acefbf40..2fa33ffa9 100644 --- a/backend/src/main/resources/i18n/messages_en.properties +++ b/backend/src/main/resources/i18n/messages_en.properties @@ -99,7 +99,7 @@ brand.footer.links-label-3=Issue Tracker brand.footer.links-desc-3=Shibboleth.net open-source community issue tracker brand.footer.links-label-4=Mailing List brand.footer.links-desc-4=Shibboleth.net open-source community mailing list -brand.footer.copyright=Copyright \u00A9 Internet2 +brand.footer.copyright=Copyright \u00A9 {year} Internet2 brand.in-partnership-with=In partnership with brand.and=and diff --git a/backend/src/main/resources/local-dynamic-metadata-provider.schema.json b/backend/src/main/resources/local-dynamic-metadata-provider.schema.json index df9c432e4..07fcf7674 100644 --- a/backend/src/main/resources/local-dynamic-metadata-provider.schema.json +++ b/backend/src/main/resources/local-dynamic-metadata-provider.schema.json @@ -19,21 +19,8 @@ "@type": { "title": "label.metadata-provider-type", "description": "tooltip.metadata-provider-type", - "placeholder": "label.select-metadata-type", "type": "string", - "readOnly": true, - "widget": { - "id": "select", - "disabled": true - }, - "oneOf": [ - { - "enum": [ - "LocalDynamicMetadataResolver" - ], - "description": "value.local-dynamic-metadata-provider" - } - ] + "default": "LocalDynamicMetadataResolver" }, "xmlId": { "title": "label.xml-id", @@ -60,12 +47,7 @@ "title": "label.refresh-delay-factor", "description": "tooltip.refresh-delay-factor", "type": "number", - "widget": { - "id": "float", - "help": "message.real-number", - "step": 0.01 - }, - "placeholder": "label.real-number", + "multipleOf": 0.01, "minimum": 0.001, "maximum": 0.999 }, @@ -73,113 +55,32 @@ "title": "label.min-cache-duration", "description": "tooltip.min-cache-duration", "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT8H", - "PT12H", - "PT24H" - ] - }, "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" }, "maxCacheDuration": { "title": "label.max-cache-duration", "description": "tooltip.max-cache-duration", "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT8H", - "PT12H", - "PT24H" - ] - }, "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" }, "maxIdleEntityData": { "title": "label.max-idle-entity-data", "description": "tooltip.max-idle-entity-data", "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT8H", - "PT12H", - "PT24H" - ] - }, "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" }, "removeIdleEntityData": { "title": "label.remove-idle-entity-data", "description": "tooltip.remove-idle-entity-data", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ] + "type": "boolean" }, "cleanupTaskInterval": { "title": "label.cleanup-task-interval", "description": "tooltip.cleanup-task-interval", "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT8H", - "PT12H", - "PT24H" - ] - }, "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" } } } } -} +} \ No newline at end of file diff --git a/backend/src/main/resources/metadata-sources-ui-schema.json b/backend/src/main/resources/metadata-sources-ui-schema.json index 89a312a9f..09abb43c1 100644 --- a/backend/src/main/resources/metadata-sources-ui-schema.json +++ b/backend/src/main/resources/metadata-sources-ui-schema.json @@ -5,16 +5,16 @@ "entityId" ], "properties": { - "entityId": { - "title": "label.entity-id", - "description": "tooltip.entity-id", + "serviceProviderName": { + "title": "label.service-provider-name", + "description": "tooltip.service-provider-name", "type": "string", "minLength": 1, "maxLength": 255 }, - "serviceProviderName": { - "title": "label.service-provider-name", - "description": "tooltip.service-provider-name", + "entityId": { + "title": "label.entity-id", + "description": "tooltip.entity-id", "type": "string", "minLength": 1, "maxLength": 255 @@ -22,8 +22,7 @@ "serviceEnabled": { "title": "label.enable-this-service", "description": "tooltip.enable-this-service-upon-saving", - "type": "boolean", - "default": false + "type": "boolean" }, "organization": { "$ref": "#/definitions/Organization" @@ -44,87 +43,52 @@ "widget": { "id": "fieldset" }, - "fieldsets": [ - { - "type": "group", - "fields": [ - "x509CertificateAvailable", - "authenticationRequestsSigned", - "wantAssertionsSigned" - ] - }, - { - "type": "group", - "fields": [ - "x509Certificates" - ] - } - ], - "properties": { - "x509CertificateAvailable": { - "title": "label.is-there-a-x509-certificate", - "description": "tooltip.is-there-a-x509-certificate", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, + "dependencies": { + "authenticationRequestsSigned": { "oneOf": [ { - "enum": [ - true - ], - "description": "value.true" + "properties": { + "authenticationRequestsSigned": { + "enum": [true] + }, + "x509Certificates": { + "minItems": 1 + } + } }, { - "enum": [ - false - ], - "description": "value.false" + "properties": { + "authenticationRequestsSigned": { + "enum": [false] + }, + "x509Certificates": { + "minItems": 0 + } + } } ] + } + }, + "properties": { + "x509CertificateAvailable": { + "type": "boolean" }, "authenticationRequestsSigned": { "title": "label.authentication-requests-signed", "description": "tooltip.authentication-requests-signed", "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } + "enumNames": [ + "value.true", + "value.false" ] }, "wantAssertionsSigned": { "title": "label.want-assertions-signed", "description": "tooltip.want-assertions-signed", "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } + "enumNames": [ + "value.true", + "value.false" ] }, "x509Certificates": { @@ -146,24 +110,11 @@ }, "serviceProviderSsoDescriptor": { "type": "object", - "fieldsets": [ - { - "type": "group", - "fields": [ - "protocolSupportEnum", - "nameIdFormats" - ] - } - ], - "required": [ - "nameIdFormats" - ], "properties": { "protocolSupportEnum": { "title": "label.protocol-support-enumeration", "description": "tooltip.protocol-support-enumeration", "type": "string", - "placeholder": "label.select-protocol", "widget": { "id": "select" }, @@ -203,18 +154,14 @@ "type": "array", "title": "label.attribute-release", "description": "Attribute release table - select the attributes you want to release (default unchecked)", - "widget": { - "id": "checklist", - "dataUrl": "/customAttributes" - }, "items": { "type": "string" - } + }, + "uniqueItems": true } }, "definitions": { "Contact": { - "title": "label.contact", "type": "object", "required": [ "name", @@ -274,7 +221,6 @@ }, "Certificate": { "type": "object", - "title": "label.certificate", "required": [ "type", "value" @@ -288,7 +234,6 @@ }, "type": { "title": "label.certificate-type", - "description": "tooltip.certificate-type", "type": "string", "widget": { "id": "radio", @@ -326,7 +271,6 @@ }, "AssertionConsumerService": { "type": "object", - "title": "label.assertion-consumer-service-endpoint", "required": [ "locationUrl", "binding" @@ -395,7 +339,6 @@ } }, "LogoutEndpoint": { - "title": "label.new-endpoint", "description": "tooltip.new-endpoint", "type": "object", "fieldsets": [ @@ -518,13 +461,13 @@ "logoHeight": { "title": "label.logo-height", "description": "tooltip.mdui-logo-height", - "min": 0, + "minimum": 0, "type": "integer" }, "logoWidth": { "title": "label.logo-width", "description": "tooltip.mdui-logo-width", - "min": 0, + "minimum": 0, "type": "integer" } } @@ -576,4 +519,4 @@ } } } -} +} \ No newline at end of file diff --git a/backend/src/main/resources/nameid-filter.schema.json b/backend/src/main/resources/nameid-filter.schema.json index 0416092d0..d6d02c84f 100644 --- a/backend/src/main/resources/nameid-filter.schema.json +++ b/backend/src/main/resources/nameid-filter.schema.json @@ -1,25 +1,5 @@ { "type": "object", - "fieldsets": [ - { - "type": "group-lg", - "fields": [ - "name", - "nameIdFormatFilterTarget", - "filterEnabled", - "@type", - "resourceId", - "version", - "removeExistingFormats" - ] - }, - { - "type": "group", - "fields": [ - "formats" - ] - } - ], "required": [ "name" ], @@ -27,11 +7,7 @@ "name": { "title": "label.filter-name", "description": "tooltip.filter-name", - "type": "string", - "widget": { - "id": "string", - "help": "message.must-be-unique" - } + "type": "string" }, "filterEnabled": { "title": "label.enable-filter", @@ -43,45 +19,25 @@ "title": "label.search-criteria", "description": "tooltip.search-criteria", "type": "object", - "widget": { - "id": "filter-target", - "target": "nameIdFormatFilterTargetType" - }, "properties": { "nameIdFormatFilterTargetType": { "title": "", "type": "string", "default": "ENTITY", - "oneOf": [ - { - "enum": [ - "ENTITY" - ], - "description": "value.entity-id" - }, - { - "enum": [ - "REGEX" - ], - "description": "value.regex" - }, - { - "enum": [ - "CONDITION_SCRIPT" - ], - "description": "value.script" - } + "enum": [ + "ENTITY", + "REGEX", + "CONDITION_SCRIPT" + ], + "enumNames": [ + "value.entity-id", + "value.regex", + "value.script" ] }, "value": { + "title": "label.filter-target-value", "type": "array", - "buttons": [ - { - "id": "preview", - "label": "action.preview", - "widget": "icon-button" - } - ], "minItems": 1, "uniqueItems": true, "items": { @@ -96,22 +52,13 @@ }, "@type": { "type": "string", - "widget": { - "id": "hidden" - }, "default": "NameIDFormat" }, "version": { - "type": "integer", - "widget": { - "id": "hidden" - } + "type": "integer" }, "resourceId": { - "type": "string", - "widget": { - "id": "hidden" - } + "type": "string" }, "removeExistingFormats": { "type": "boolean", diff --git a/ui/src/favicon.ico b/backend/src/main/resources/static/favicon.ico similarity index 100% rename from ui/src/favicon.ico rename to backend/src/main/resources/static/favicon.ico diff --git a/ui/.browserslistrc b/ui/.browserslistrc deleted file mode 100644 index 3e39f66bd..000000000 --- a/ui/.browserslistrc +++ /dev/null @@ -1,12 +0,0 @@ -# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. -# For additional information regarding the format and rule options, please see: -# https://github.com/browserslist/browserslist#queries - -# You can see what browsers were selected by your queries by running: -# npx browserslist - -> 0.5% -last 2 versions -Firefox ESR -IE 11 -not IE 9-10 diff --git a/ui/.gitignore b/ui/.gitignore new file mode 100644 index 000000000..4d29575de --- /dev/null +++ b/ui/.gitignore @@ -0,0 +1,23 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/ui/README.md b/ui/README.md index 5e86acade..02aac3f6e 100644 --- a/ui/README.md +++ b/ui/README.md @@ -1,111 +1,70 @@ -# Angular +# Getting Started with Create React App -Angular is a complete framework for UI development, meaning that in addition to rendering a web application in a browser, it also provides additional tools for other important UI considerations such as Internationalization (i18n), Accessibility (a11y), HTML 5 push state routing, an http library for connecting with our REST endpoints, a tool for scaffolding new services, components, pages, etc, and extensive end-to-end and unit testing toolset. In comparison to other frameworks, we rely on fewer 3rd party libraries or frameworks to handle these other concerns. The Angular community provides an extensive documentation website with full API documentation, as well as examples/tutorials. This includes a style-guide with rules for formatting code, which we follow on the SHIB-UI project.Angular is actively maintained by Google and has a large community and ecosystem. +This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). -## License +## Available Scripts -Angular is [licensed](https://angular.io/license) under the MIT license. +In the project directory, you can run: -## Performance +### `yarn start` -Angular was designed for mobile from the ground up. Aside from limited processing power, mobile devices have other features and limitations that separate them from traditional computers. Touch interfaces, limited screen real estate, and mobile hardware have all been considered when developing the Angular framework. This has resulted in performance gains in Angular across the board, and makes it competitive with the many other UI frameworks available. +Runs the app in the development mode.\ +Open [http://localhost:3000](http://localhost:3000) to view it in the browser. -## Typescript +The page will reload if you make edits.\ +You will also see any lint errors in the console. -Angular uses [TypeScript](https://www.typescriptlang.org/), a superset of JavaScript that implements many new ESNext features as well as making JavaScript strongly typed. This makes errors and exceptions more likely to happen during compilation, resulting in fewer defects. +### `yarn test` -By focusing on making the framework easier for computers to process, Angular and TypeScript allow for a much richer development process. Tooling for TypeScript and Angular allows for immediate Angular-specific help and feedback with nearly every IDE and editor. Strong typing enables developers to use more productive development tools and practices like static checking when developing JavaScript applications. +Launches the test runner in the interactive watch mode.\ +See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. -However, developers can still write vanilla JavaScript for Angular that runs without transpilation. +### `yarn build` -## NGRX +Builds the app for production to the `build` folder.\ +It correctly bundles React in production mode and optimizes the build for the best performance. -The popular Redux state management system is implemented in SHIB-UI via the framework [NgRx](http://ngrx.github.io/). This provides reliable uni-directional data-flow in the UI which organizes the UI state in a clear and predictable way. One of NgRx's most important features is its simple testability since it is based primarily on pure functions. +The build is minified and the filenames include the hashes.\ +Your app is ready to be deployed! -# JSON-Schema +See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. -For Providers and Filters, the forms in SHIB-UI are built based on the standard [JSON-Schema](http://json-schema.org/). This makes the generation of forms in the editors and wizards of the application dynamic, so that if new properties are added to the specification for a Metadata Provider type, it can be added to the JSON-schema of the application without ever having to re-deploy the javascript code. Rendering of the forms is handled using [ngx-schema-form](https://github.com/makinacorpus/ngx-schema-form), a component library for connecting to a JSON-Schema to render Angular form components, and provides extensibility through support of custom components and validation rules. +### `yarn eject` -# Bootstrap +**Note: this is a one-way operation. Once you `eject`, you can’t go back!** -[Bootstrap](http://getbootstrap.com/) 4 is used for the css framework in SHIB-UI, and provides our base theme, a responsive grid system, consistent styling across all major browsers, and pre-styled components which are connected to Angular using ng-bootstrap, a 3rd party framework. +If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. -# Customizing UI +Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own. -Within the `ui > src` folder, there are two files which can be used to customize the user interface quickly. +You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it. -### Color Scheme -The `Brand.scss` contains the palette information used by bootstrap to color the user interface buttons and other components. Uncomment the color you wish to override and change the hex value accordingly and rebuild the user interface. +## Learn More -For example: +You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). -`// $blue: #00355f;` +To learn React, check out the [React documentation](https://reactjs.org/). -change to... +### Code Splitting -`$blue: #0000FF;` +This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting) -If you wish to change the __"primary"__ color or any other mapping according to Bootstrap's conventions, there is a block of mappings at the bottom of the `Brand.scss` file to accomodate this as well. Uncomment and change the value allocated to the corresponding aspect of the theme you wish to change. +### Analyzing the Bundle Size -The supported values are: +This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size) -`$brand-primary: $blue;` - The primary color used throughout the site. Default: dark blue. +### Making a Progressive Web App -`$brand-secondary: $gray-700;` - An accept color used throughout the site. Default: dark gray. +This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app) -`$brand-success: $green;` - Indicates success or some other positive action. Default: green. +### Advanced Configuration -`$brand-info: $light-blue;` - Indicates some sort of informative text or action for the user. Default: light blue. +This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration) -`$brand-warning: $yellow;` - Indicates a warning to the user. Default: yellow. +### Deployment -`$brand-danger: $red;` - Indicates a dangerous action or error. Default: red. +This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment) -`$brand-light: $light-grey;` - Color used for accents, text, etc throughout application. Default: light grey. +### `yarn build` fails to minify -`$brand-dark: $dark-grey;` - Color used for accents, text, etc throughout application. Default: dark grey. - -### Logos / Footer -The `Brand.ts` contains the links, text, and image paths to modify the logos, text, and links found within the header and footer. Override the values within this Typescript file and rebuild the user interface to view changes. If the local server should host these files, they should be added to the assets folder. - -For example: - -`export const brand = {};` - -change to... - -`export const brand = { - header: 'Metadata Management' -};` - - -# Development - -## Scaffolding - -This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 6.0.1. - -## Development server - -Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. - -## Code scaffolding - -Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. - -## Build - -Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `-prod` flag for a production build. - -## Running unit tests - -Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). - -## Running end-to-end tests - -Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). -Before running the tests make sure you are serving the app via `ng serve`. - -## Further help - -To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). +This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify) diff --git a/ui/angular.json b/ui/angular.json deleted file mode 100644 index d987a8f82..000000000 --- a/ui/angular.json +++ /dev/null @@ -1,138 +0,0 @@ -{ - "$schema": "./node_modules/@angular/cli/lib/config/schema.json", - "version": 1, - "newProjectRoot": "projects", - "projects": { - "ui": { - "root": "", - "projectType": "application", - "architect": { - "build": { - "builder": "@angular-devkit/build-angular:browser", - "options": { - "outputPath": "dist", - "index": "src/index.html", - "main": "src/main.ts", - "tsConfig": "src/tsconfig.app.json", - "polyfills": "src/polyfills.ts", - "assets": [ - { - "glob": "**/*", - "input": "src/assets", - "output": "/assets" - }, - { - "glob": "favicon.ico", - "input": "src", - "output": "/" - } - ], - "styles": [ - "src/styles.scss" - ], - "scripts": [], - "aot": true, - "allowedCommonJsDependencies": [ - "deep-object-diff", - "file-saver", - "jexl", - "z-schema" - ] - }, - "configurations": { - "production": { - "optimization": true, - "outputHashing": "bundles", - "namedChunks": false, - "aot": true, - "extractLicenses": true, - "vendorChunk": false, - "buildOptimizer": true, - "fileReplacements": [ - { - "replace": "src/environments/environment.ts", - "with": "src/environments/environment.prod.ts" - } - ], - "budgets": [ - { - "type": "anyComponentStyle", - "maximumWarning": "6kb" - } - ] - } - } - }, - "serve": { - "builder": "@angular-devkit/build-angular:dev-server", - "options": { - "browserTarget": "ui:build" - }, - "configurations": { - "production": { - "browserTarget": "ui:build:production" - } - } - }, - "extract-i18n": { - "builder": "@angular-devkit/build-angular:extract-i18n", - "options": { - "browserTarget": "ui:build" - } - }, - "test": { - "builder": "@angular-devkit/build-angular:karma", - "options": { - "main": "src/test.ts", - "karmaConfig": "./karma.conf.js", - "polyfills": "src/polyfills.ts", - "tsConfig": "src/tsconfig.spec.json", - "scripts": [], - "styles": [ - "src/styles.scss" - ], - "assets": [ - { - "glob": "**/*", - "input": "src/assets", - "output": "/assets" - }, - { - "glob": "favicon.ico", - "input": "src", - "output": "/" - } - ], - "codeCoverageExclude": [ - "src/polyfills.ts", - "**/*.stub.ts" - ] - } - }, - "lint": { - "builder": "@angular-devkit/build-angular:tslint", - "options": { - "tsConfig": [ - "src/tsconfig.app.json", - "src/tsconfig.spec.json" - ], - "exclude": [ - "**/node_modules/**" - ] - } - } - } - } - }, - "cli": {}, - "schematics": { - "@schematics/angular:component": { - "prefix": "app", - "styleext": "scss", - "style": "scss" - }, - "@schematics/angular:directive": { - "prefix": "app" - } - } -} \ No newline at end of file diff --git a/ui/build.gradle b/ui/build.gradle index 34827354e..606663890 100644 --- a/ui/build.gradle +++ b/ui/build.gradle @@ -13,15 +13,14 @@ npmInstall.setNpmCommand('ci') npm_run_build { inputs.dir 'src' - outputs.dir 'dist' - if (project.hasProperty('npm-args')) { - args = project.'npm-args'.tokenize() - } + inputs.dir 'public' + outputs.dir 'build' } npm_run_buildProd { inputs.dir 'src' - outputs.dir 'dist' + inputs.dir 'public' + outputs.dir 'build' } npm_run_start { @@ -32,5 +31,5 @@ npm_run_start { clean.doFirst { file('node_modules').deleteDir() - file('dist').deleteDir() + file('build').deleteDir() } diff --git a/ui/build.js b/ui/build.js index e68d3d848..4ae5f4721 100644 --- a/ui/build.js +++ b/ui/build.js @@ -1,20 +1,10 @@ const fs = require('fs-extra'); -fs.ensureDir('./dist/unsecured').then(function () { +fs.ensureDir('./build/unsecured').then(function () { try { - fs.copySync('./src/error.html', './dist/unsecured/error.html') - console.log('copy error page success!') - } catch (err) { - console.error(err) - } - - try { - fs.copySync('./node_modules/font-awesome/fonts', './dist/unsecured'); + fs.copySync('./node_modules/@fortawesome/fontawesome-free/webfonts', './build/unsecured'); console.log('copy fonts success!') } catch (err) { console.log(err); } }); - - - diff --git a/ui/e2e/app.e2e-spec.ts b/ui/e2e/app.e2e-spec.ts deleted file mode 100644 index 0721bdae1..000000000 --- a/ui/e2e/app.e2e-spec.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { AppPage } from './app.po'; - -describe('ui App', () => { - let page: AppPage; - - beforeEach(() => { - page = new AppPage(); - }); - - it('should display welcome message', () => { - page.navigateTo(); - expect(page.getParagraphText()).toEqual('Welcome to app!'); - }); -}); diff --git a/ui/e2e/app.po.ts b/ui/e2e/app.po.ts deleted file mode 100644 index 82ea75ba5..000000000 --- a/ui/e2e/app.po.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { browser, by, element } from 'protractor'; - -export class AppPage { - navigateTo() { - return browser.get('/'); - } - - getParagraphText() { - return element(by.css('app-root h1')).getText(); - } -} diff --git a/ui/e2e/tsconfig.e2e.json b/ui/e2e/tsconfig.e2e.json deleted file mode 100644 index 1d9e5edf0..000000000 --- a/ui/e2e/tsconfig.e2e.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "../tsconfig.json", - "compilerOptions": { - "outDir": "../out-tsc/e2e", - "baseUrl": "./", - "module": "commonjs", - "target": "es5", - "types": [ - "jasmine", - "jasminewd2", - "node" - ] - } -} diff --git a/ui/karma.conf.js b/ui/karma.conf.js deleted file mode 100644 index 347949dd4..000000000 --- a/ui/karma.conf.js +++ /dev/null @@ -1,52 +0,0 @@ -// Karma configuration file, see link for more information -// https://karma-runner.github.io/1.0/config/configuration-file.html -const path = require('path'); - -module.exports = function (config) { - config.set({ - basePath: '', - frameworks: ['jasmine', '@angular-devkit/build-angular'], - plugins: [ - require('karma-jasmine'), - require('karma-chrome-launcher'), - require('karma-jasmine-html-reporter'), - require('karma-coverage'), - require('karma-spec-reporter'), - require('@angular-devkit/build-angular/plugins/karma') - ], - client: { - clearContext: false // leave Jasmine Spec Runner output visible in browser - }, - coverageReporter: { - dir: require('path').join(__dirname, 'coverage'), reports: ['html', 'lcovonly', 'text-summary'], - fixWebpackSourcePaths: true, - skipFilesWithNoCoverage: false, - thresholds: { - emitWarning: true, - global: { - statements: 80, - branches: 80, - functions: 80, - lines: 80 - }, - each: { - statements: 30, - branches: 30, - functions: 30, - lines: 30, - overrides: {} - } - } - }, - angularCli: { - environment: 'dev' - }, - reporters: ['spec', 'coverage'], - port: 9876, - colors: true, - logLevel: config.LOG_WARN, - autoWatch: false, - browsers: ['ChromeHeadless'], - singleRun: true - }); -}; diff --git a/ui/package-lock.json b/ui/package-lock.json index 516c84556..ab86d547d 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -1,2711 +1,564 @@ { "name": "ui", - "version": "0.0.0", + "version": "0.1.0", "lockfileVersion": 1, "requires": true, "dependencies": { - "@angular-devkit/architect": { - "version": "0.1101.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1101.1.tgz", - "integrity": "sha512-oyzDIzI5owzYmgwGQLBbKOkTDc49dPosI2BiBf0oWtKH2L2sQ6jiad1k/Oq4/k7TYEN8neb/eZ1dpsHmZdYqaw==", + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/compat-data": { + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.15.tgz", + "integrity": "sha512-ltnibHKR1VnrU4ymHyQ/CXtNXI6yZC0oJThyW78Hft8XndANwi+9H+UIklBDraIjFEJzw8wmcM427oDd9KS5wA==", + "dev": true + }, + "@babel/core": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", + "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", "dev": true, "requires": { - "@angular-devkit/core": "11.1.1", - "rxjs": "6.6.3" + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.1", + "@babel/parser": "^7.12.3", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" }, "dependencies": { - "rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true } } }, - "@angular-devkit/build-angular": { - "version": "0.1101.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.1101.1.tgz", - "integrity": "sha512-ftGjlk1qkOGhjeusYhgKhZ6EejrLVTKsvuNdygCNyK/RjISsgXowgolFdm1Yysgxdr859QAIZzMQoArnWZ2+rQ==", - "dev": true, - "requires": { - "@angular-devkit/architect": "0.1101.1", - "@angular-devkit/build-optimizer": "0.1101.1", - "@angular-devkit/build-webpack": "0.1101.1", - "@angular-devkit/core": "11.1.1", - "@babel/core": "7.12.10", - "@babel/generator": "7.12.11", - "@babel/plugin-transform-runtime": "7.12.10", - "@babel/preset-env": "7.12.11", - "@babel/runtime": "7.12.5", - "@babel/template": "7.12.7", - "@jsdevtools/coverage-istanbul-loader": "3.0.5", - "@ngtools/webpack": "11.1.1", - "ansi-colors": "4.1.1", - "autoprefixer": "10.2.1", - "babel-loader": "8.2.2", - "browserslist": "^4.9.1", - "cacache": "15.0.5", - "caniuse-lite": "^1.0.30001032", - "circular-dependency-plugin": "5.2.2", - "copy-webpack-plugin": "6.3.2", - "core-js": "3.8.2", - "critters": "0.0.6", - "css-loader": "5.0.1", - "cssnano": "4.1.10", - "file-loader": "6.2.0", - "find-cache-dir": "3.3.1", - "glob": "7.1.6", - "inquirer": "7.3.3", - "jest-worker": "26.6.2", - "karma-source-map-support": "1.4.0", - "less": "4.1.0", - "less-loader": "7.3.0", - "license-webpack-plugin": "2.3.11", - "loader-utils": "2.0.0", - "mini-css-extract-plugin": "1.3.3", - "minimatch": "3.0.4", - "open": "7.3.1", - "ora": "5.2.0", - "parse5-html-rewriting-stream": "6.0.1", - "pnp-webpack-plugin": "1.6.4", - "postcss": "8.2.4", - "postcss-import": "14.0.0", - "postcss-loader": "4.2.0", - "raw-loader": "4.0.2", - "regenerator-runtime": "0.13.7", - "resolve-url-loader": "3.1.2", - "rimraf": "3.0.2", - "rollup": "2.36.1", - "rxjs": "6.6.3", - "sass": "1.32.4", - "sass-loader": "10.1.1", - "semver": "7.3.4", - "source-map": "0.7.3", - "source-map-loader": "1.1.3", - "source-map-support": "0.5.19", - "speed-measure-webpack-plugin": "1.3.3", - "style-loader": "2.0.0", - "stylus": "0.54.8", - "stylus-loader": "4.3.2", - "terser": "5.5.1", - "terser-webpack-plugin": "4.2.3", - "text-table": "0.2.0", - "tree-kill": "1.2.2", - "webpack": "4.44.2", - "webpack-dev-middleware": "3.7.2", - "webpack-dev-server": "3.11.1", - "webpack-merge": "5.7.3", - "webpack-sources": "2.2.0", - "webpack-subresource-integrity": "1.5.2", - "worker-plugin": "5.0.0" + "@babel/generator": { + "version": "7.13.16", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.16.tgz", + "integrity": "sha512-grBBR75UnKOcUWMp8WoDxNsWCFl//XCK6HWTrBQKTr5SV9f5g0pNOjdyzi/DTBv12S9GnYPInIXQBTky7OXEMg==", + "dev": true, + "requires": { + "@babel/types": "^7.13.16", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" }, "dependencies": { - "@angular-devkit/architect": { - "version": "0.1101.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1101.1.tgz", - "integrity": "sha512-oyzDIzI5owzYmgwGQLBbKOkTDc49dPosI2BiBf0oWtKH2L2sQ6jiad1k/Oq4/k7TYEN8neb/eZ1dpsHmZdYqaw==", - "dev": true, - "requires": { - "@angular-devkit/core": "11.1.1", - "rxjs": "6.6.3" - } - }, - "@angular-devkit/core": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-11.1.1.tgz", - "integrity": "sha512-eQTRmcuVCgGE7mR3qyabjlvXlQCMDI+gDCkcAlzn161pJY9Yxmw0Q1rXN2sZlUdfZuc9sSg0m2MaQQFBSGp+XA==", - "dev": true, - "requires": { - "ajv": "6.12.6", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.6.3", - "source-map": "0.7.3" - } - }, - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", + "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz", + "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.13.16", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz", + "integrity": "sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.15", + "@babel/helper-validator-option": "^7.12.17", + "browserslist": "^4.14.5", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.13.11", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz", + "integrity": "sha512-ays0I7XYq9xbjCSvT+EvysLgfc3tOkwCULHjrnscGT3A9qD4sk3wXnJ3of0MAWsWGjdinFvajHU2smYuqXKMrw==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-member-expression-to-functions": "^7.13.0", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-replace-supers": "^7.13.0", + "@babel/helper-split-export-declaration": "^7.12.13" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz", + "integrity": "sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "regexpu-core": "^4.7.1" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.0.tgz", + "integrity": "sha512-JT8tHuFjKBo8NnaUbblz7mIu1nnvUDiHVjXXkulZULyidvo/7P6TY7+YqpV37IfF+KUFxmlK04elKtGKXaiVgw==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz", + "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==", + "dev": true, + "requires": { + "@babel/types": "^7.13.0" + } + }, + "@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.13.16", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.16.tgz", + "integrity": "sha512-1eMtTrXtrwscjcAeO4BVK+vvkxaLJSPFz1w1KLawz6HLNi9bPFGBNwwDyVfiu1Tv/vRRFYfoGaKhmAQPGPn5Wg==", + "dev": true, + "requires": { + "@babel/traverse": "^7.13.15", + "@babel/types": "^7.13.16" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", + "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "dev": true, + "requires": { + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-module-imports": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", + "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "dev": true, + "requires": { + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-module-transforms": { + "version": "7.13.14", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz", + "integrity": "sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-simple-access": "^7.13.12", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.12.11", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.13", + "@babel/types": "^7.13.14" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz", + "integrity": "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-wrap-function": "^7.13.0", + "@babel/types": "^7.13.0" + } + }, + "@babel/helper-replace-supers": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", + "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-simple-access": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", + "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", + "dev": true, + "requires": { + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", + "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz", + "integrity": "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" + } + }, + "@babel/helpers": { + "version": "7.13.17", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.17.tgz", + "integrity": "sha512-Eal4Gce4kGijo1/TGJdqp3WuhllaMLSrW6XcL0ulyUAQOuxHcCafZE8KHg9857gcTehsm/v7RcOx2+jp0Ryjsg==", + "dev": true, + "requires": { + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.17", + "@babel/types": "^7.13.17" + } + }, + "@babel/highlight": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "@babel/highlight": "^7.10.4" + "color-convert": "^1.9.0" } }, - "@babel/generator": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", - "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "@babel/types": "^7.12.11", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "color-name": "1.1.3" } }, - "@babel/parser": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", - "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "@babel/template": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", - "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7" - } - }, - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "has-flag": "^3.0.0" } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "cacache": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", - "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", - "dev": true, - "requires": { - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.0", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "core-js": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.8.2.tgz", - "integrity": "sha512-FfApuSRgrR6G5s58casCBd9M2k+4ikuu4wbW6pJyYU7bd9zvFc9qf7vr5xmrZOhT9nn+8uwlH1oRR9jTnFoA3A==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "magic-string": { - "version": "0.25.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", - "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.4" - } - }, - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "open": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/open/-/open-7.3.1.tgz", - "integrity": "sha512-f2wt9DCBKKjlFbjzGb8MOAW8LH8F0mrs1zc7KTjAJ9PZNQbfenzWbNP1VZJvw6ICMG9r14Ah6yfwPn7T7i646A==", - "dev": true, - "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, - "rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "ssri": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", - "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", - "dev": true, - "requires": { - "minipass": "^3.1.1" - } - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@angular-devkit/build-optimizer": { - "version": "0.1101.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1101.1.tgz", - "integrity": "sha512-kmzXmmjAOB0MdYFkx9gx+U80ZpVeKOHUCNPsR7/fNptP+O+anamSlT1vqQFkB+ykqYblXOzgJ06jMG7bFzTuxA==", - "dev": true, - "requires": { - "loader-utils": "2.0.0", - "source-map": "0.7.3", - "tslib": "2.1.0", - "typescript": "4.1.3", - "webpack-sources": "2.2.0" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - }, - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", - "dev": true - }, - "typescript": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.3.tgz", - "integrity": "sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg==", - "dev": true - } - } - }, - "@angular-devkit/build-webpack": { - "version": "0.1101.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1101.1.tgz", - "integrity": "sha512-IiZPM4Brs76fOar8WodXYChvKXW5fMbLKlxvTzFFfdhKukpXXNwmuAWRl4PZ/Xt6tpEASG/r4BgN6/iu4DtJ9w==", - "dev": true, - "requires": { - "@angular-devkit/architect": "0.1101.1", - "@angular-devkit/core": "11.1.1", - "rxjs": "6.6.3" - }, - "dependencies": { - "@angular-devkit/architect": { - "version": "0.1101.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1101.1.tgz", - "integrity": "sha512-oyzDIzI5owzYmgwGQLBbKOkTDc49dPosI2BiBf0oWtKH2L2sQ6jiad1k/Oq4/k7TYEN8neb/eZ1dpsHmZdYqaw==", - "dev": true, - "requires": { - "@angular-devkit/core": "11.1.1", - "rxjs": "6.6.3" - } - }, - "@angular-devkit/core": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-11.1.1.tgz", - "integrity": "sha512-eQTRmcuVCgGE7mR3qyabjlvXlQCMDI+gDCkcAlzn161pJY9Yxmw0Q1rXN2sZlUdfZuc9sSg0m2MaQQFBSGp+XA==", - "dev": true, - "requires": { - "ajv": "6.12.6", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.6.3", - "source-map": "0.7.3" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "magic-string": { - "version": "0.25.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", - "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.4" - } - }, - "rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "@angular-devkit/core": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-11.1.1.tgz", - "integrity": "sha512-eQTRmcuVCgGE7mR3qyabjlvXlQCMDI+gDCkcAlzn161pJY9Yxmw0Q1rXN2sZlUdfZuc9sSg0m2MaQQFBSGp+XA==", - "dev": true, - "requires": { - "ajv": "6.12.6", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.6.3", - "source-map": "0.7.3" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } - } - }, - "@angular-devkit/schematics": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-11.1.1.tgz", - "integrity": "sha512-XYbC0cGPChdXg0LD9EA08W24Rv5GPxGNGJNRQhUwlcU9L/szhOw9NEhr/l/DLijAxKv0J2eM5CuzKI1O/3tZYg==", - "dev": true, - "requires": { - "@angular-devkit/core": "11.1.1", - "ora": "5.2.0", - "rxjs": "6.6.3" - }, - "dependencies": { - "rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - } - } - }, - "@angular/animations": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-11.1.0.tgz", - "integrity": "sha512-VgpknW33WJiqnNtQwNVWrpiSxkgoChIZLpYLlijSTvFwZOHiraFKApohaW8X61mwL0HuK1RB7Z36B+Q11cw3aw==", - "requires": { - "tslib": "^2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" - } - } - }, - "@angular/cdk": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-11.1.0.tgz", - "integrity": "sha512-yFEHtdp0o/xGnYebrU/PQqWVIlB7SaP3cSviq/LTv/h2EINn3PzU/Zhdhg0k0fk09BrKoS+o8AVIddduIdDpYw==", - "requires": { - "parse5": "^5.0.0", - "tslib": "^2.0.0" - }, - "dependencies": { - "parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", - "optional": true - }, - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" - } - } - }, - "@angular/cli": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-11.1.1.tgz", - "integrity": "sha512-2nRx9KYzLVCtJA4pgDmxubHOp54O/74BYt3WGHAA7QcnSATEL7jF5a9SMoEAJ2sUtKUVVS+2dKbmYKwW6oL3Bw==", - "dev": true, - "requires": { - "@angular-devkit/architect": "0.1101.1", - "@angular-devkit/core": "11.1.1", - "@angular-devkit/schematics": "11.1.1", - "@schematics/angular": "11.1.1", - "@schematics/update": "0.1101.1", - "@yarnpkg/lockfile": "1.1.0", - "ansi-colors": "4.1.1", - "debug": "4.3.1", - "ini": "2.0.0", - "inquirer": "7.3.3", - "jsonc-parser": "3.0.0", - "npm-package-arg": "8.1.0", - "npm-pick-manifest": "6.1.0", - "open": "7.3.1", - "pacote": "11.1.14", - "resolve": "1.19.0", - "rimraf": "3.0.2", - "semver": "7.3.4", - "symbol-observable": "3.0.0", - "universal-analytics": "0.4.23", - "uuid": "8.3.2" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "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 - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", - "dev": true, - "requires": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@angular/common": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-11.1.0.tgz", - "integrity": "sha512-jR9fnhzvvpdilyhPnyRlRRFRJ9vf/OhUFJrL42Knaj7uknmjgeu168JhwVdq6uj+v1208suXW+nOXhKNIpH38Q==", - "requires": { - "tslib": "^2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" - } - } - }, - "@angular/compiler": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-11.1.0.tgz", - "integrity": "sha512-XW+McH/RVjpLtNkft6UYZQbjhXwX/hvLgUa9jGlTuIFM5o7W4XRPnq5sfn3+QvzdROF0j8S5sy47mGVNQOYMNg==", - "requires": { - "tslib": "^2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" - } - } - }, - "@angular/compiler-cli": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-11.1.0.tgz", - "integrity": "sha512-PLeVrqBpn43G7DeBkDQqH38Y+VMlCIbxiP4Vv1rFAmKVNIm9J8m8jdC3EQSTXVV+L3oDCVP5/ERSCZ8Jqx6UoA==", - "dev": true, - "requires": { - "@babel/core": "^7.8.6", - "@babel/types": "^7.8.6", - "canonical-path": "1.0.0", - "chokidar": "^3.0.0", - "convert-source-map": "^1.5.1", - "dependency-graph": "^0.7.2", - "fs-extra": "4.0.2", - "magic-string": "^0.25.0", - "minimist": "^1.2.0", - "reflect-metadata": "^0.1.2", - "semver": "^6.3.0", - "source-map": "^0.6.1", - "sourcemap-codec": "^1.4.8", - "tslib": "^2.0.0", - "yargs": "^16.1.1" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "fs-extra": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz", - "integrity": "sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", - "dev": true - }, - "y18n": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz", - "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true - } - } - }, - "@angular/core": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-11.1.0.tgz", - "integrity": "sha512-VhiRWZEj9Q/OvbbSDcgQ4f53oVcMnDB4uNL8xaWnK0Sb3lZA4aQW3VOlROBITS5n2g7D1zRhvUzdfzVuyuMIaQ==", - "requires": { - "tslib": "^2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" - } - } - }, - "@angular/forms": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-11.1.0.tgz", - "integrity": "sha512-pHwLPGDHk3JOoK2nA3wJoDCJF2bn8NmVqv8Lh5Pd8NYqLFRIIDiHSjNkqr1eM0JUmExqfU5tCrLrPz4YChdYBA==", - "requires": { - "tslib": "^2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" - } - } - }, - "@angular/language-service": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-11.1.0.tgz", - "integrity": "sha512-7NQcwNHgUGOdqQsyp1Xw/WFbYvC4WA+Et2DJJvkitmg2ejndtm45FALUu1Z2X6bbKzdJOuNGU5vNh1ZJ/IyGRQ==", - "dev": true - }, - "@angular/localize": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-11.1.0.tgz", - "integrity": "sha512-hF0c+EeorSWiGTB+rzQn+KSewLb7LTyCN4IjezFF05pIAwyw1cLN+3fhiTmJ/KNp8PFpR7dbW3gPwUKkLwn3rg==", - "dev": true, - "requires": { - "@babel/core": "7.8.3", - "glob": "7.1.2", - "yargs": "^16.1.1" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/core": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.3.tgz", - "integrity": "sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helpers": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "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 - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "y18n": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz", - "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true - } - } - }, - "@angular/platform-browser": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-11.1.0.tgz", - "integrity": "sha512-wdinsRiKC5mGWWSA5RqferFvpe3Wr9YIVK2Gaj50DlJGOJ/8yWvux3BYjsCd5B44PC8+6dxUEZMgvA6CmhXgpw==", - "requires": { - "tslib": "^2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" - } - } - }, - "@angular/platform-browser-dynamic": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-11.1.0.tgz", - "integrity": "sha512-1MFRvjbkogtEQO/bWkNm2xOIl8CeIJuRWoXYE00VKShmq4o+2kTHBRQD0NydPQYwqo9o4XpgmIrJXHgwp3S2Qw==", - "requires": { - "tslib": "^2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" - } - } - }, - "@angular/router": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-11.1.0.tgz", - "integrity": "sha512-jsGuyt/QNxtN2eHrkk6lqRnTf3NeuaxBWJSrwuoqrjLCZH2elg3r1GXDTII1Ih3E1zIwuOlK59O78dXW2eQVBg==", - "requires": { - "tslib": "^2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" - } - } - }, - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/compat-data": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.7.tgz", - "integrity": "sha512-YaxPMGs/XIWtYqrdEOZOCPsVWfEoriXopnsz3/i7apYPXQ3698UFhS6dVT1KN5qOsWmVgw/FOrmQgpRaZayGsw==", - "dev": true - }, - "@babel/core": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.10.tgz", - "integrity": "sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.10", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.10", - "@babel/types": "^7.12.10", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/generator": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", - "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", - "requires": { - "@babel/types": "^7.12.11", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", - "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", - "requires": { - "@babel/helper-get-function-arity": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/types": "^7.12.11" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", - "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", - "requires": { - "@babel/types": "^7.12.10" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", - "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", - "requires": { - "@babel/types": "^7.12.11" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", - "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==" - }, - "@babel/template": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", - "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7" - } - }, - "@babel/traverse": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz", - "integrity": "sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==", - "requires": { - "@babel/code-frame": "^7.12.11", - "@babel/generator": "^7.12.11", - "@babel/helper-function-name": "^7.12.11", - "@babel/helper-split-export-declaration": "^7.12.11", - "@babel/parser": "^7.12.11", - "@babel/types": "^7.12.12", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "requires": { - "ms": "2.1.2" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "@babel/generator": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", - "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", - "dev": true, - "requires": { - "@babel/types": "^7.12.11", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - } - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.10.tgz", - "integrity": "sha512-XplmVbC1n+KY6jL8/fgLVXXUauDIB+lD5+GsQEh6F6GBF1dq1qy4DP4yXWzDKcoqXB3X58t61e85Fitoww4JVQ==", - "dev": true, - "requires": { - "@babel/types": "^7.12.10" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", - "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.10.4", - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-compilation-targets": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz", - "integrity": "sha512-+qH6NrscMolUlzOYngSBMIOQpKUGPPsc61Bu5W10mg84LxZ7cmvnBHzARKbDoFxVvqqAbj6Tg6N7bSrWSPXMyw==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.12.5", - "@babel/helper-validator-option": "^7.12.1", - "browserslist": "^4.14.5", - "semver": "^5.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz", - "integrity": "sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.10.4" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/helper-function-name": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", - "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/types": "^7.12.11" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", - "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", - "dev": true, - "requires": { - "@babel/types": "^7.12.10" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", - "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", - "dev": true, - "requires": { - "@babel/types": "^7.12.11" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", - "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", - "dev": true - }, - "@babel/template": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", - "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7" - } - }, - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.7.tgz", - "integrity": "sha512-idnutvQPdpbduutvi3JVfEgcVIHooQnhvhx0Nk9isOINOIGYkZea1Pk2JlJRiUnMefrlvr0vkByATBY/mB4vjQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "regexpu-core": "^4.7.1" - }, - "dependencies": { - "regexpu-core": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", - "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", - "dev": true, - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" - } - }, - "regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", - "dev": true - }, - "regjsparser": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.6.tgz", - "integrity": "sha512-jjyuCp+IEMIm3N1H1LLTJW1EISEJV9+5oHdEyrt43Pg9cDSb6rrLZei2cVWpl0xTjmmlpec/lEQGYgM7xfpGCQ==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - } - } - } - }, - "@babel/helper-define-map": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", - "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/types": "^7.10.5", - "lodash": "^4.17.19" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/helper-function-name": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", - "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/types": "^7.12.11" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", - "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", - "dev": true, - "requires": { - "@babel/types": "^7.12.10" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", - "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", - "dev": true - }, - "@babel/template": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", - "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7" - } - }, - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz", - "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==", - "dev": true, - "requires": { - "@babel/types": "^7.12.1" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-function-name": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", - "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/types": "^7.12.11" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", - "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", - "dev": true, - "requires": { - "@babel/types": "^7.12.10" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-hoist-variables": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", - "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", - "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==", - "requires": { - "@babel/types": "^7.12.7" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-module-imports": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", - "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", - "requires": { - "@babel/types": "^7.12.5" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-module-transforms": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", - "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", - "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-simple-access": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/helper-validator-identifier": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", - "lodash": "^4.17.19" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/generator": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", - "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", - "requires": { - "@babel/types": "^7.12.11", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", - "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", - "requires": { - "@babel/helper-get-function-arity": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/types": "^7.12.11" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", - "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", - "requires": { - "@babel/types": "^7.12.10" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", - "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", - "requires": { - "@babel/types": "^7.12.11" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", - "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==" - }, - "@babel/template": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", - "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7" - } - }, - "@babel/traverse": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz", - "integrity": "sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==", - "requires": { - "@babel/code-frame": "^7.12.11", - "@babel/generator": "^7.12.11", - "@babel/helper-function-name": "^7.12.11", - "@babel/helper-split-export-declaration": "^7.12.11", - "@babel/parser": "^7.12.11", - "@babel/types": "^7.12.12", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "requires": { - "ms": "2.1.2" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz", - "integrity": "sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==", - "requires": { - "@babel/types": "^7.12.10" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz", - "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-wrap-function": "^7.10.4", - "@babel/types": "^7.12.1" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-replace-supers": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.11.tgz", - "integrity": "sha512-q+w1cqmhL7R0FNzth/PLLp2N+scXEK/L2AHbXUyydxp828F4FEa5WcVoqui9vFRiHDQErj9Zof8azP32uGVTRA==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.7", - "@babel/helper-optimise-call-expression": "^7.12.10", - "@babel/traverse": "^7.12.10", - "@babel/types": "^7.12.11" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/generator": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", - "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", - "requires": { - "@babel/types": "^7.12.11", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", - "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", - "requires": { - "@babel/helper-get-function-arity": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/types": "^7.12.11" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", - "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", - "requires": { - "@babel/types": "^7.12.10" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", - "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", - "requires": { - "@babel/types": "^7.12.11" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", - "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==" - }, - "@babel/template": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", - "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7" - } - }, - "@babel/traverse": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz", - "integrity": "sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==", - "requires": { - "@babel/code-frame": "^7.12.11", - "@babel/generator": "^7.12.11", - "@babel/helper-function-name": "^7.12.11", - "@babel/helper-split-export-declaration": "^7.12.11", - "@babel/parser": "^7.12.11", - "@babel/types": "^7.12.12", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "requires": { - "ms": "2.1.2" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "@babel/helper-simple-access": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", - "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", - "requires": { - "@babel/types": "^7.12.1" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", - "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", - "dev": true, - "requires": { - "@babel/types": "^7.12.1" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", - "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", - "dev": true, - "requires": { - "@babel/types": "^7.12.11" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" - }, - "@babel/helper-validator-option": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.11.tgz", - "integrity": "sha512-TBFCyj939mFSdeX7U7DDj32WtzYY7fDcalgq8v3fBZMNOJQNn7nOYzMaUCiPxPYfCup69mtIpqlKgMZLvQ8Xhw==", - "dev": true - }, - "@babel/helper-wrap-function": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz", - "integrity": "sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/generator": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", - "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", - "dev": true, - "requires": { - "@babel/types": "^7.12.11", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", - "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/types": "^7.12.11" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", - "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", - "dev": true, - "requires": { - "@babel/types": "^7.12.10" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", - "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", - "dev": true, - "requires": { - "@babel/types": "^7.12.11" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", - "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", - "dev": true - }, - "@babel/template": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", - "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7" - } - }, - "@babel/traverse": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz", - "integrity": "sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.11", - "@babel/generator": "^7.12.11", - "@babel/helper-function-name": "^7.12.11", - "@babel/helper-split-export-declaration": "^7.12.11", - "@babel/parser": "^7.12.11", - "@babel/types": "^7.12.12", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@babel/helpers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", - "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", - "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/generator": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", - "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", - "requires": { - "@babel/types": "^7.12.11", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", - "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", - "requires": { - "@babel/helper-get-function-arity": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/types": "^7.12.11" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", - "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", - "requires": { - "@babel/types": "^7.12.10" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", - "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", - "requires": { - "@babel/types": "^7.12.11" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", - "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==" - }, - "@babel/template": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", - "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7" - } - }, - "@babel/traverse": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz", - "integrity": "sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==", - "requires": { - "@babel/code-frame": "^7.12.11", - "@babel/generator": "^7.12.11", - "@babel/helper-function-name": "^7.12.11", - "@babel/helper-split-export-declaration": "^7.12.11", - "@babel/parser": "^7.12.11", - "@babel/types": "^7.12.12", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "requires": { - "ms": "2.1.2" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, - "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "@babel/parser": { + "version": "7.13.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.16.tgz", + "integrity": "sha512-6bAg36mCwuqLO0hbR+z7PHuqWiCeP7Dzg73OpQwsAB1Eb8HnGEz5xYBzCfbu+YjoaJsJs+qheDxVAuqbt3ILEw==", + "dev": true + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz", + "integrity": "sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ==", "dev": true, "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - } + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.13.12" } }, - "@babel/parser": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", - "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", - "dev": true - }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.12.tgz", - "integrity": "sha512-nrz9y0a4xmUrRq51bYkWJIO5SBZyG2ys2qinHsN0zHDHVsUaModrkpyWWWXfGqYQmOL3x9sQIcTNN/pBGpo09A==", + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.15.tgz", + "integrity": "sha512-VapibkWzFeoa6ubXy/NgV5U2U4MVnUlvnx6wo1XhlsaTrLYWE0UFpDQsVrmn22q5CzeloqJ8gEMHSKxuee6ZdA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.12.1", - "@babel/plugin-syntax-async-generators": "^7.8.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-remap-async-to-generator": "^7.13.0", + "@babel/plugin-syntax-async-generators": "^7.8.4" } }, "@babel/plugin-proposal-class-properties": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz", + "integrity": "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-proposal-decorators": { "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", - "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.12.1.tgz", + "integrity": "sha512-knNIuusychgYN8fGJHONL0RbFxLGawhXOJNLBk75TniTsZZeA+wdkDuv6wp4lGwzQEKjZi6/WYtnb3udNPmQmQ==", "dev": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-decorators": "^7.12.1" } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz", - "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz", + "integrity": "sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-dynamic-import": "^7.8.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz", - "integrity": "sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz", + "integrity": "sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.12.13", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz", - "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz", + "integrity": "sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz", - "integrity": "sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz", + "integrity": "sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.13.0", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", - "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz", + "integrity": "sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.7.tgz", - "integrity": "sha512-8c+uy0qmnRTeukiGsjLGy6uVs/TFjJchGXUeBqlG4VWYOdJWkhhVPdQ3uHwbmalfJwv2JsV0qffXP4asRfL2SQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz", + "integrity": "sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.12.13", "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", - "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz", + "integrity": "sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.12.1" + "@babel/compat-data": "^7.13.8", + "@babel/helper-compilation-targets": "^7.13.8", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.13.0" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz", - "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz", + "integrity": "sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.7.tgz", - "integrity": "sha512-4ovylXZ0PWmwoOvhU2vhnzVNnm88/Sm9nx7V8BPgMvAzn5zDou3/Awy0EjglyubVHasJj+XCEkr/r1X3P5elCA==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz", + "integrity": "sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.13.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" + "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-proposal-private-methods": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz", - "integrity": "sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz", + "integrity": "sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz", - "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz", + "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-syntax-async-generators": { @@ -2717,13 +570,31 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, "@babel/plugin-syntax-class-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", - "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-decorators": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.13.tgz", + "integrity": "sha512-Rw6aIXGuqDLr6/LoBBYE57nKOzQpz/aDkKlMqEwH+Vp0MXbG6H/TfRjaY343LKxzAKAMXIHsQ8JzaZKuDZ9MwA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-syntax-dynamic-import": { @@ -2744,6 +615,24 @@ "@babel/helper-plugin-utils": "^7.8.3" } }, + "@babel/plugin-syntax-flow": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.12.13.tgz", + "integrity": "sha512-J/RYxnlSLXZLVR7wTRsozxKT8qbsx1mNKJzXEEjQ0Kjx1ZACcyHgbanNWNCFtc36IzuWhYWPpvJFFoexoOWFmA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, "@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", @@ -2753,952 +642,1229 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, + "@babel/plugin-syntax-jsx": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz", + "integrity": "sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, "@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", + "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz", + "integrity": "sha512-cHP3u1JiUiG2LFDKbXnwVad81GvfyIOmCD6HIEId6ojrY0Drfy2q1jw7BwN7dE84+kTnBjLkXoL3IEy/3JPu2w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz", + "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz", + "integrity": "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-remap-async-to-generator": "^7.13.0" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", + "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.13.16", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.13.16.tgz", + "integrity": "sha512-ad3PHUxGnfWF4Efd3qFuznEtZKoBp0spS+DgqzVzRPV7urEBvPLue3y2j80w4Jf2YLzZHj8TOv/Lmvdmh3b2xg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz", + "integrity": "sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-replace-supers": "^7.13.0", + "@babel/helper-split-export-declaration": "^7.12.13", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz", + "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.13.17", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.17.tgz", + "integrity": "sha512-UAUqiLv+uRLO+xuBKKMEpC+t7YRNVRqBsWWq1yKXbBZBje/t3IXCiSinZhjn/DC3qzBfICeYd2EFGEbHsh5RLA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz", + "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz", + "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz", + "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-flow-strip-types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.12.1.tgz", + "integrity": "sha512-8hAtkmsQb36yMmEtk2JZ9JnVyDSnDOdlB+0nEGzIDLuK4yR3JcEjfuFPYkdEPSh8Id+rAMeBEn+X0iVEyho6Hg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-flow": "^7.12.1" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz", + "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", + "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", + "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", + "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz", + "integrity": "sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz", + "integrity": "sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-simple-access": "^7.12.13", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz", + "integrity": "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.13.0", + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-identifier": "^7.12.11", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz", + "integrity": "sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz", + "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz", + "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", + "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-replace-supers": "^7.12.13" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz", + "integrity": "sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" } }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "@babel/plugin-transform-property-literals": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", + "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.12.13" } }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "@babel/plugin-transform-react-constant-elements": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.13.13.tgz", + "integrity": "sha512-SNJU53VM/SjQL0bZhyU+f4kJQz7bQQajnrZRSaU21hruG/NWY41AEM9AWXeXX90pYr/C2yAmTgI6yW3LlLrAUQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.13.0" } }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "@babel/plugin-transform-react-display-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.13.tgz", + "integrity": "sha512-MprESJzI9O5VnJZrL7gg1MpdqmiFcUv41Jc7SahxYsNP2kDkFqClxxTZq+1Qv4AFCamm+GXMRDQINNn+qrxmiA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.12.13" } }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "@babel/plugin-transform-react-jsx": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.13.12.tgz", + "integrity": "sha512-jcEI2UqIcpCqB5U5DRxIl0tQEProI2gcu+g8VTIqxLO5Iidojb4d77q+fwGseCvd8af/lJ9masp4QWzBXFE2xA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-jsx": "^7.12.13", + "@babel/types": "^7.13.12" } }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "@babel/plugin-transform-react-jsx-development": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.17.tgz", + "integrity": "sha512-BPjYV86SVuOaudFhsJR1zjgxxOhJDt6JHNoD48DxWEIxUCAMjV1ys6DYw4SDYZh0b1QsS2vfIA9t/ZsQGsDOUQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/plugin-transform-react-jsx": "^7.12.17" } }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", - "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", + "@babel/plugin-transform-react-jsx-self": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.12.13.tgz", + "integrity": "sha512-FXYw98TTJ125GVCCkFLZXlZ1qGcsYqNQhVBQcZjyrwf8FEUtVfKIoidnO8S0q+KBQpDYNTmiGo1gn67Vti04lQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz", - "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==", + "@babel/plugin-transform-react-jsx-source": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.12.13.tgz", + "integrity": "sha512-O5JJi6fyfih0WfDgIJXksSPhGP/G0fQpfxYy87sDc+1sFmsCS6wr3aAn+whbzkhbjtq4VMqLRaSzR6IsshIC0Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, - "@babel/plugin-transform-async-to-generator": { + "@babel/plugin-transform-react-pure-annotations": { "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz", - "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz", + "integrity": "sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.12.1" + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz", - "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==", + "@babel/plugin-transform-regenerator": { + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.13.15.tgz", + "integrity": "sha512-Bk9cOLSz8DiurcMETZ8E2YtIVJbFCPGW28DJWUakmyVWtQSm6Wsf0p4B4BfEr/eL2Nkhe/CICiUiMOCi1TPhuQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "regenerator-transform": "^0.14.2" } }, - "@babel/plugin-transform-block-scoping": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.12.tgz", - "integrity": "sha512-VOEPQ/ExOVqbukuP7BYJtI5ZxxsmegTwzZ04j1aF0dkSypGo9XpDHuOrABsJu+ie+penpSJheDJ11x1BEZNiyQ==", + "@babel/plugin-transform-reserved-words": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz", + "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, - "@babel/plugin-transform-classes": { + "@babel/plugin-transform-runtime": { "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz", - "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.1.tgz", + "integrity": "sha512-Ac/H6G9FEIkS2tXsZjL4RAdS3L3WHxci0usAnz7laPWUmFiGtj7tIASChqKZMHTSQTQY6xDbOq+V1/vIq3QrWg==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-define-map": "^7.10.4", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-module-imports": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.10.4", - "globals": "^11.1.0" + "resolve": "^1.8.1", + "semver": "^5.5.1" }, "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/helper-function-name": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", - "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/types": "^7.12.11" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", - "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", - "dev": true, - "requires": { - "@babel/types": "^7.12.10" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", - "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", - "dev": true, - "requires": { - "@babel/types": "^7.12.11" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", - "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true - }, - "@babel/template": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", - "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7" - } - }, - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } } } }, - "@babel/plugin-transform-computed-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz", - "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==", + "@babel/plugin-transform-shorthand-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", + "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, - "@babel/plugin-transform-destructuring": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz", - "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==", + "@babel/plugin-transform-spread": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz", + "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" } }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz", - "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==", + "@babel/plugin-transform-sticky-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz", + "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz", - "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==", + "@babel/plugin-transform-template-literals": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz", + "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.13.0" } }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz", - "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==", + "@babel/plugin-transform-typeof-symbol": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz", + "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==", "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, - "@babel/plugin-transform-for-of": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz", - "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==", + "@babel/plugin-transform-typescript": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.13.0.tgz", + "integrity": "sha512-elQEwluzaU8R8dbVuW2Q2Y8Nznf7hnjM7+DSCd14Lo5fF63C9qNLbwZYbmZrtV9/ySpSUpkRpQXvJb6xyu4hCQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-typescript": "^7.12.13" } }, - "@babel/plugin-transform-function-name": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz", - "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==", + "@babel/plugin-transform-unicode-escapes": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz", + "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/helper-function-name": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", - "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/types": "^7.12.11" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", - "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", - "dev": true, - "requires": { - "@babel/types": "^7.12.10" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", - "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", - "dev": true - }, - "@babel/template": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", - "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7" - } - }, - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-plugin-utils": "^7.12.13" } }, - "@babel/plugin-transform-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz", - "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==", + "@babel/plugin-transform-unicode-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz", + "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" } }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz", - "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/preset-env": { + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.13.15.tgz", + "integrity": "sha512-D4JAPMXcxk69PKe81jRJ21/fP/uYdcTZ3hJDF5QX2HSI9bBxxYw/dumdR6dGumhjxlprHPE4XWoPaqzZUVy2MA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.15", + "@babel/helper-compilation-targets": "^7.13.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-option": "^7.12.17", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.13.12", + "@babel/plugin-proposal-async-generator-functions": "^7.13.15", + "@babel/plugin-proposal-class-properties": "^7.13.0", + "@babel/plugin-proposal-dynamic-import": "^7.13.8", + "@babel/plugin-proposal-export-namespace-from": "^7.12.13", + "@babel/plugin-proposal-json-strings": "^7.13.8", + "@babel/plugin-proposal-logical-assignment-operators": "^7.13.8", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", + "@babel/plugin-proposal-numeric-separator": "^7.12.13", + "@babel/plugin-proposal-object-rest-spread": "^7.13.8", + "@babel/plugin-proposal-optional-catch-binding": "^7.13.8", + "@babel/plugin-proposal-optional-chaining": "^7.13.12", + "@babel/plugin-proposal-private-methods": "^7.13.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.13", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.12.13", + "@babel/plugin-transform-arrow-functions": "^7.13.0", + "@babel/plugin-transform-async-to-generator": "^7.13.0", + "@babel/plugin-transform-block-scoped-functions": "^7.12.13", + "@babel/plugin-transform-block-scoping": "^7.12.13", + "@babel/plugin-transform-classes": "^7.13.0", + "@babel/plugin-transform-computed-properties": "^7.13.0", + "@babel/plugin-transform-destructuring": "^7.13.0", + "@babel/plugin-transform-dotall-regex": "^7.12.13", + "@babel/plugin-transform-duplicate-keys": "^7.12.13", + "@babel/plugin-transform-exponentiation-operator": "^7.12.13", + "@babel/plugin-transform-for-of": "^7.13.0", + "@babel/plugin-transform-function-name": "^7.12.13", + "@babel/plugin-transform-literals": "^7.12.13", + "@babel/plugin-transform-member-expression-literals": "^7.12.13", + "@babel/plugin-transform-modules-amd": "^7.13.0", + "@babel/plugin-transform-modules-commonjs": "^7.13.8", + "@babel/plugin-transform-modules-systemjs": "^7.13.8", + "@babel/plugin-transform-modules-umd": "^7.13.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13", + "@babel/plugin-transform-new-target": "^7.12.13", + "@babel/plugin-transform-object-super": "^7.12.13", + "@babel/plugin-transform-parameters": "^7.13.0", + "@babel/plugin-transform-property-literals": "^7.12.13", + "@babel/plugin-transform-regenerator": "^7.13.15", + "@babel/plugin-transform-reserved-words": "^7.12.13", + "@babel/plugin-transform-shorthand-properties": "^7.12.13", + "@babel/plugin-transform-spread": "^7.13.0", + "@babel/plugin-transform-sticky-regex": "^7.12.13", + "@babel/plugin-transform-template-literals": "^7.13.0", + "@babel/plugin-transform-typeof-symbol": "^7.12.13", + "@babel/plugin-transform-unicode-escapes": "^7.12.13", + "@babel/plugin-transform-unicode-regex": "^7.12.13", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.13.14", + "babel-plugin-polyfill-corejs2": "^0.2.0", + "babel-plugin-polyfill-corejs3": "^0.2.0", + "babel-plugin-polyfill-regenerator": "^0.2.0", + "core-js-compat": "^3.9.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, - "@babel/plugin-transform-modules-amd": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz", - "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==", + "@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" } }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz", - "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==", + "@babel/preset-react": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.13.13.tgz", + "integrity": "sha512-gx+tDLIE06sRjKJkVtpZ/t3mzCDOnPG+ggHZG9lffUbX8+wC739x20YQc9V35Do6ZAxaUc/HhVHIiOzz5MvDmA==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-simple-access": "^7.12.1", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-option": "^7.12.17", + "@babel/plugin-transform-react-display-name": "^7.12.13", + "@babel/plugin-transform-react-jsx": "^7.13.12", + "@babel/plugin-transform-react-jsx-development": "^7.12.17", + "@babel/plugin-transform-react-pure-annotations": "^7.12.1" } }, - "@babel/plugin-transform-modules-systemjs": { + "@babel/preset-typescript": { "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz", - "integrity": "sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.12.1.tgz", + "integrity": "sha512-hNK/DhmoJPsksdHuI/RVrcEws7GN5eamhi28JkO52MqIxU8Z0QpmiSOQxZHWOHV7I3P4UjHV97ay4TcamMA6Kw==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.10.4", - "@babel/helper-module-transforms": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-validator-identifier": "^7.10.4", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/plugin-transform-typescript": "^7.12.1" } }, - "@babel/plugin-transform-modules-umd": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz", - "integrity": "sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==", - "dev": true, + "@babel/runtime": { + "version": "7.13.17", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.17.tgz", + "integrity": "sha512-NCdgJEelPTSh+FEFylhnP1ylq848l1z9t9N0j1Lfbcw0+KXGjsTvUmkxy+voLLXB5SOKMbLLx4jxYliGrYQseA==", "requires": { - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "regenerator-runtime": "^0.13.4" } }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz", - "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==", - "dev": true, + "@babel/runtime-corejs2": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.14.0.tgz", + "integrity": "sha512-btR4E8JiGlmmDI5YgirlG9z3T91rBdxnVh2YuEStrHDcekffaaIeK+CE0S4IaYUyYhMa7rFDfF2GEO79XNbLEA==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1" + "core-js": "^2.6.5", + "regenerator-runtime": "^0.13.4" + }, + "dependencies": { + "core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" + } } }, - "@babel/plugin-transform-new-target": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz", - "integrity": "sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==", + "@babel/runtime-corejs3": { + "version": "7.13.17", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.13.17.tgz", + "integrity": "sha512-RGXINY1YvduBlGrP+vHjJqd/nK7JVpfM4rmZLGMx77WoL3sMrhheA0qxii9VNn1VHnxJLEyxmvCB+Wqc+x/FMw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "core-js-pure": "^3.0.0", + "regenerator-runtime": "^0.13.4" } }, - "@babel/plugin-transform-object-super": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz", - "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==", + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.1" + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" } }, - "@babel/plugin-transform-parameters": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz", - "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==", + "@babel/traverse": { + "version": "7.13.17", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.17.tgz", + "integrity": "sha512-BMnZn0R+X6ayqm3C3To7o1j7Q020gWdqdyP50KEoVqaCO2c/Im7sYZSmVgvefp8TTMQ+9CtwuBp0Z1CZ8V3Pvg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.16", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.13.16", + "@babel/types": "^7.13.17", + "debug": "^4.1.0", + "globals": "^11.1.0" } }, - "@babel/plugin-transform-property-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz", - "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==", + "@babel/types": { + "version": "7.13.17", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.17.tgz", + "integrity": "sha512-RawydLgxbOPDlTLJNtoIypwdmAy//uQIzlKt2+iBiJaRlVuI6QLUxVAyWGNfOzp8Yu4L4lLIacoCyTNtpb4wiA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-validator-identifier": "^7.12.11", + "to-fast-properties": "^2.0.0" } }, - "@babel/plugin-transform-regenerator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz", - "integrity": "sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==", - "dev": true, - "requires": { - "regenerator-transform": "^0.14.2" - } + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true }, - "@babel/plugin-transform-reserved-words": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz", - "integrity": "sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==", + "@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" } }, - "@babel/plugin-transform-runtime": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.10.tgz", - "integrity": "sha512-xOrUfzPxw7+WDm9igMgQCbO3cJKymX7dFdsgRr1eu9n3KjjyU4pptIXbXPseQDquw+W+RuJEJMHKHNsPNNm3CA==", + "@csstools/convert-colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", + "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==", + "dev": true + }, + "@csstools/normalize.css": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz", + "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.0.tgz", + "integrity": "sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.12.5", - "@babel/helper-plugin-utils": "^7.10.4", - "semver": "^5.5.1" + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" }, "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true } } }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz", - "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==", - "dev": true, + "@fortawesome/fontawesome-common-types": { + "version": "0.2.35", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.35.tgz", + "integrity": "sha512-IHUfxSEDS9dDGqYwIW7wTN6tn/O8E0n5PcAHz9cAaBoZw6UpG20IG/YM3NNLaGPwPqgjBAFjIURzqoQs3rrtuw==" + }, + "@fortawesome/fontawesome-free": { + "version": "5.15.3", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.3.tgz", + "integrity": "sha512-rFnSUN/QOtnOAgqFRooTA3H57JLDm0QEG/jPdk+tLQNL/eWd+Aok8g3qCI+Q1xuDPWpGW/i9JySpJVsq8Q0s9w==" + }, + "@fortawesome/fontawesome-svg-core": { + "version": "1.2.35", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.35.tgz", + "integrity": "sha512-uLEXifXIL7hnh2sNZQrIJWNol7cTVIzwI+4qcBIq9QWaZqUblm0IDrtSqbNg+3SQf8SMGHkiSigD++rHmCHjBg==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@fortawesome/fontawesome-common-types": "^0.2.35" } }, - "@babel/plugin-transform-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz", - "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==", - "dev": true, + "@fortawesome/free-regular-svg-icons": { + "version": "5.15.3", + "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-5.15.3.tgz", + "integrity": "sha512-q4/p8Xehy9qiVTdDWHL4Z+o5PCLRChePGZRTXkl+/Z7erDVL8VcZUuqzJjs6gUz6czss4VIPBRdCz6wP37/zMQ==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + "@fortawesome/fontawesome-common-types": "^0.2.35" } }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.7.tgz", - "integrity": "sha512-VEiqZL5N/QvDbdjfYQBhruN0HYjSPjC4XkeqW4ny/jNtH9gcbgaqBIXYEZCNnESMAGs0/K/R7oFGMhOyu/eIxg==", - "dev": true, + "@fortawesome/free-solid-svg-icons": { + "version": "5.15.3", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.3.tgz", + "integrity": "sha512-XPeeu1IlGYqz4VWGRAT5ukNMd4VHUEEJ7ysZ7pSSgaEtNvSo+FLurybGJVmiqkQdK50OkSja2bfZXOeyMGRD8Q==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@fortawesome/fontawesome-common-types": "^0.2.35" } }, - "@babel/plugin-transform-template-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz", - "integrity": "sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==", - "dev": true, + "@fortawesome/react-fontawesome": { + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.14.tgz", + "integrity": "sha512-4wqNb0gRLVaBm/h+lGe8UfPPivcbuJ6ecI4hIgW0LjI7kzpYB9FkN0L9apbVzg+lsBdcTf0AlBtODjcSX5mmKA==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "prop-types": "^15.7.2" } }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.10.tgz", - "integrity": "sha512-JQ6H8Rnsogh//ijxspCjc21YPd3VLVoYtAwv3zQmqAt8YGYUtdo5usNhdl4b9/Vir2kPFZl6n1h0PfUz4hJhaA==", + "@hapi/address": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", + "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", + "dev": true + }, + "@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", + "dev": true + }, + "@hapi/hoek": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", + "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", + "dev": true + }, + "@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" } }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz", - "integrity": "sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q==", + "@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@hapi/hoek": "^8.3.0" } }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz", - "integrity": "sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==", - "dev": true, + "@hypnosphi/create-react-context": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@hypnosphi/create-react-context/-/create-react-context-0.3.1.tgz", + "integrity": "sha512-V1klUed202XahrWJLLOT3EXNeCpFHCcJntdFGI15ntCwau+jfT386w7OFTMaCqOgXUH1fa0w/I1oZs+i/Rfr0A==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "gud": "^1.0.0", + "warning": "^4.0.3" } }, - "@babel/preset-env": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.11.tgz", - "integrity": "sha512-j8Tb+KKIXKYlDBQyIOy4BLxzv1NUOwlHfZ74rvW+Z0Gp4/cI2IMDPBWAgWceGcE7aep9oL/0K9mlzlMGxA8yNw==", + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "requires": { - "@babel/compat-data": "^7.12.7", - "@babel/helper-compilation-targets": "^7.12.5", - "@babel/helper-module-imports": "^7.12.5", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-validator-option": "^7.12.11", - "@babel/plugin-proposal-async-generator-functions": "^7.12.1", - "@babel/plugin-proposal-class-properties": "^7.12.1", - "@babel/plugin-proposal-dynamic-import": "^7.12.1", - "@babel/plugin-proposal-export-namespace-from": "^7.12.1", - "@babel/plugin-proposal-json-strings": "^7.12.1", - "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", - "@babel/plugin-proposal-numeric-separator": "^7.12.7", - "@babel/plugin-proposal-object-rest-spread": "^7.12.1", - "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", - "@babel/plugin-proposal-optional-chaining": "^7.12.7", - "@babel/plugin-proposal-private-methods": "^7.12.1", - "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", - "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-class-properties": "^7.12.1", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.0", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.12.1", - "@babel/plugin-transform-arrow-functions": "^7.12.1", - "@babel/plugin-transform-async-to-generator": "^7.12.1", - "@babel/plugin-transform-block-scoped-functions": "^7.12.1", - "@babel/plugin-transform-block-scoping": "^7.12.11", - "@babel/plugin-transform-classes": "^7.12.1", - "@babel/plugin-transform-computed-properties": "^7.12.1", - "@babel/plugin-transform-destructuring": "^7.12.1", - "@babel/plugin-transform-dotall-regex": "^7.12.1", - "@babel/plugin-transform-duplicate-keys": "^7.12.1", - "@babel/plugin-transform-exponentiation-operator": "^7.12.1", - "@babel/plugin-transform-for-of": "^7.12.1", - "@babel/plugin-transform-function-name": "^7.12.1", - "@babel/plugin-transform-literals": "^7.12.1", - "@babel/plugin-transform-member-expression-literals": "^7.12.1", - "@babel/plugin-transform-modules-amd": "^7.12.1", - "@babel/plugin-transform-modules-commonjs": "^7.12.1", - "@babel/plugin-transform-modules-systemjs": "^7.12.1", - "@babel/plugin-transform-modules-umd": "^7.12.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", - "@babel/plugin-transform-new-target": "^7.12.1", - "@babel/plugin-transform-object-super": "^7.12.1", - "@babel/plugin-transform-parameters": "^7.12.1", - "@babel/plugin-transform-property-literals": "^7.12.1", - "@babel/plugin-transform-regenerator": "^7.12.1", - "@babel/plugin-transform-reserved-words": "^7.12.1", - "@babel/plugin-transform-shorthand-properties": "^7.12.1", - "@babel/plugin-transform-spread": "^7.12.1", - "@babel/plugin-transform-sticky-regex": "^7.12.7", - "@babel/plugin-transform-template-literals": "^7.12.1", - "@babel/plugin-transform-typeof-symbol": "^7.12.10", - "@babel/plugin-transform-unicode-escapes": "^7.12.1", - "@babel/plugin-transform-unicode-regex": "^7.12.1", - "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.12.11", - "core-js-compat": "^3.8.0", - "semver": "^5.5.0" + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" }, "dependencies": { - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true } } }, - "@babel/preset-modules": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", - "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/runtime": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", - "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", - "requires": { - "regenerator-runtime": "^0.13.4" - } + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true }, - "@babel/template": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", - "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", + "@jest/console": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", + "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7" + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.6.2", + "jest-util": "^26.6.2", + "slash": "^3.0.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } } } }, - "@babel/traverse": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz", - "integrity": "sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==", + "@jest/core": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", + "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", "dev": true, "requires": { - "@babel/code-frame": "^7.12.11", - "@babel/generator": "^7.12.11", - "@babel/helper-function-name": "^7.12.11", - "@babel/helper-split-export-declaration": "^7.12.11", - "@babel/parser": "^7.12.11", - "@babel/types": "^7.12.12", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" + "@jest/console": "^26.6.2", + "@jest/reporters": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^26.6.2", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-resolve-dependencies": "^26.6.3", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "jest-watcher": "^26.6.2", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { - "@babel/highlight": "^7.10.4" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" } }, - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", + "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": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" + "@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 + } } }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "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": { - "ms": "2.1.2" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.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 } } }, - "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "@jest/environment": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", + "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", "dev": true, "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - }, - "dependencies": { - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2" } }, - "@istanbuljs/schema": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==" + "@jest/fake-timers": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", + "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@sinonjs/fake-timers": "^6.0.1", + "@types/node": "*", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + } }, - "@jsdevtools/coverage-istanbul-loader": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.5.tgz", - "integrity": "sha512-EUCPEkaRPvmHjWAAZkWMT7JDzpw7FKB00WTISaiXsbNOd5hCHg77XLA8sLYLFDo1zepYLo2w7GstN8YBqRXZfA==", + "@jest/globals": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", + "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", "dev": true, "requires": { - "convert-source-map": "^1.7.0", + "@jest/environment": "^26.6.2", + "@jest/types": "^26.6.2", + "expect": "^26.6.2" + } + }, + "@jest/reporters": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", + "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-instrument": "^4.0.3", - "loader-utils": "^2.0.0", - "merge-source-map": "^1.1.0", - "schema-utils": "^2.7.0" + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "node-notifier": "^8.0.0", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^7.0.0" }, "dependencies": { - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "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": { - "safe-buffer": "~5.1.1" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" } } } }, - "@ng-bootstrap/ng-bootstrap": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-9.0.2.tgz", - "integrity": "sha512-MFtpBFKOtLZWFE8JnJWOnYLxXK3GVmVP16vhJsikdxiDVl7CtrnO+YmCYqK30WdS5eIvYKRBJF/hwOH8WvwYFQ==", - "requires": { - "tslib": "^2.0.0" - } - }, - "@ngrx/effects": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/@ngrx/effects/-/effects-10.1.2.tgz", - "integrity": "sha512-6pX6FEzLlqdbtFVMbCvscsaL6QC/L95e72JKj76Xz+8V77UTlpVsxWyMo7YU9pM4EXNpBGmOpMs2xKjfBfK05Q==", - "requires": { - "tslib": "^2.0.0" - } - }, - "@ngrx/entity": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/@ngrx/entity/-/entity-10.1.2.tgz", - "integrity": "sha512-peit/zjLUxl8zQgNuPlPXDf4FmNZYMMNGsKQHiFpShIpWjLFTnR1wCeeLw8LMrqSy9vxLO3JpXwkDFZb8a+FDg==", - "requires": { - "tslib": "^2.0.0" - } - }, - "@ngrx/router-store": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/@ngrx/router-store/-/router-store-10.1.2.tgz", - "integrity": "sha512-IBsZee5ZUmLbXkY/O4OjhJP1Q6mdu4lcLcQ9jeXsdCMH/Vvc0EGK+MlhsZrxv5+v2ZXb1bhtKsLBUsTovanLWA==", + "@jest/source-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", + "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", + "dev": true, "requires": { - "tslib": "^2.0.0" + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" } }, - "@ngrx/store": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/@ngrx/store/-/store-10.1.2.tgz", - "integrity": "sha512-FUjN786ch4Qt9WgJ78ef7Yquq3mPCekgcWgZrs4ycZw1f+KdfTHLTk1bGDtO8A8CzOya5yTT7KhxbdVjbOS5ng==", + "@jest/test-result": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", + "dev": true, "requires": { - "tslib": "^2.0.0" + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" } }, - "@ngrx/store-devtools": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/@ngrx/store-devtools/-/store-devtools-10.1.2.tgz", - "integrity": "sha512-HE681GuZ+lRgSXpgt7y7LKzsfu/+Tgy9yPZpaitvkhg+eCIjnN5Uvs1rWqETHYWnsKliW25yoqFUAVw+xb7hug==", + "@jest/test-sequencer": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", + "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", + "dev": true, "requires": { - "tslib": "^2.0.0" + "@jest/test-result": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3" } }, - "@ngtools/webpack": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-11.1.1.tgz", - "integrity": "sha512-SoqZU8qNESwuJbiYJoRhp/aMyWeK4HClkwotqkM/bPUnnOOCRvDYP20vYhATivF8Y8xOL7wktdd1HOtFvtbvlA==", + "@jest/transform": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", + "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", "dev": true, "requires": { - "@angular-devkit/core": "11.1.1", - "enhanced-resolve": "5.6.0", - "webpack-sources": "2.2.0" + "@babel/core": "^7.1.0", + "@jest/types": "^26.6.2", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.6.2", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" }, "dependencies": { - "@angular-devkit/core": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-11.1.1.tgz", - "integrity": "sha512-eQTRmcuVCgGE7mR3qyabjlvXlQCMDI+gDCkcAlzn161pJY9Yxmw0Q1rXN2sZlUdfZuc9sSg0m2MaQQFBSGp+XA==", - "dev": true, - "requires": { - "ajv": "6.12.6", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.6.3", - "source-map": "0.7.3" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "magic-string": { - "version": "0.25.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", - "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { - "sourcemap-codec": "^1.4.4" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } - }, - "rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + } + } + }, + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { - "tslib": "^1.9.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true } } }, @@ -3728,355 +1894,454 @@ "fastq": "^1.6.0" } }, - "@npmcli/ci-detect": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@npmcli/ci-detect/-/ci-detect-1.3.0.tgz", - "integrity": "sha512-oN3y7FAROHhrAt7Rr7PnTSwrHrZVRTS2ZbyxeQwSSYD0ifwM3YNgQqbaRmjcWoPyq77MjchusjJDspbzMmip1Q==", - "dev": true - }, - "@npmcli/git": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.0.4.tgz", - "integrity": "sha512-OJZCmJ9DNn1cz9HPXXsPmUBnqaArot3CGYo63CyajHQk+g87rPXVOJByGsskQJhPsUUEXJcsZ2Q6bWd2jSwnBA==", + "@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", "dev": true, "requires": { - "@npmcli/promise-spawn": "^1.1.0", - "lru-cache": "^6.0.0", - "mkdirp": "^1.0.3", - "npm-pick-manifest": "^6.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^1.1.1", - "semver": "^7.3.2", - "unique-filename": "^1.1.1", - "which": "^2.0.2" + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" }, "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true + } + } + }, + "@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.4.3.tgz", + "integrity": "sha512-br5Qwvh8D2OQqSXpd1g/xqXKnK0r+Jz6qVKBbWmpUcrbGOxUrf39V5oZ1876084CGn18uMdR5uvPqBv9UqtBjQ==", + "dev": true, + "requires": { + "ansi-html": "^0.0.7", + "error-stack-parser": "^2.0.6", + "html-entities": "^1.2.1", + "native-url": "^0.2.6", + "schema-utils": "^2.6.5", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "@popperjs/core": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.2.tgz", + "integrity": "sha512-VZMYa7+fXHdwIq1TDhSXoVmSPEGM/aa+6Aiq3nVVJ9bXr24zScr+NlKFKC3iPljA7ho/GAZr+d2jOf5GIRC30Q==" + }, + "@restart/context": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@restart/context/-/context-2.1.4.tgz", + "integrity": "sha512-INJYZQJP7g+IoDUh/475NlGiTeMfwTXUEr3tmRneckHIxNolGOW9CTq83S8cxq0CgJwwcMzMJFchxvlwe7Rk8Q==" + }, + "@restart/hooks": { + "version": "0.3.26", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.3.26.tgz", + "integrity": "sha512-7Hwk2ZMYm+JLWcb7R9qIXk1OoUg1Z+saKWqZXlrvFwT3w6UArVNWgxYOzf+PJoK9zZejp8okPAKTctthhXLt5g==", + "requires": { + "lodash": "^4.17.20", + "lodash-es": "^4.17.20" + } + }, + "@rjsf/bootstrap-4": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@rjsf/bootstrap-4/-/bootstrap-4-2.5.1.tgz", + "integrity": "sha512-USijizR4MkYtMOdbZWt3HDDc9vWmMvmiskqXwV2jEUBMPSu1UG0bZS2HKzqfnMJcJRT1P7Tj4O3sGwgE+7FCpw==", + "requires": { + "react-icons": "^3.10.0" + } + }, + "@rjsf/core": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@rjsf/core/-/core-2.5.1.tgz", + "integrity": "sha512-km8NYScXNONaL5BiSLS6wyDj49pOLZtn0iXg7Zxlm921uuf3o2AAX5SuZS5kB4Zj2zlrVMrXESexfX6bxdDYHw==", + "requires": { + "@babel/runtime-corejs2": "^7.8.7", + "@types/json-schema": "^7.0.4", + "ajv": "^6.7.0", + "core-js": "^2.5.7", + "json-schema-merge-allof": "^0.6.0", + "jsonpointer": "^4.0.1", + "lodash": "^4.17.15", + "prop-types": "^15.7.2", + "react-app-polyfill": "^1.0.4", + "react-is": "^16.9.0", + "shortid": "^2.2.14" + }, + "dependencies": { + "core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" + "react-app-polyfill": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-1.0.6.tgz", + "integrity": "sha512-OfBnObtnGgLGfweORmdZbyEz+3dgVePQBb3zipiaDsMHV1NpWm0rDFYIVXFV/AK+x4VIIfWHhrdMIeoTLyRr2g==", + "requires": { + "core-js": "^3.5.0", + "object-assign": "^4.1.1", + "promise": "^8.0.3", + "raf": "^3.4.1", + "regenerator-runtime": "^0.13.3", + "whatwg-fetch": "^3.0.0" + }, + "dependencies": { + "core-js": { + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.12.1.tgz", + "integrity": "sha512-Ne9DKPHTObRuB09Dru5AjwKjY4cJHVGu+y5f7coGn1E9Grkc3p2iBwE9AI/nJzsE29mQF7oq+mhYYRqOMFN1Bw==" + } } }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" } } }, - "@npmcli/installed-package-contents": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.5.tgz", - "integrity": "sha512-aKIwguaaqb6ViwSOFytniGvLPb9SMCUm39TgM3SfUo7n0TxUMbwoXfpwyvQ4blm10lzbAwTsvjr7QZ85LvTi4A==", + "@rollup/plugin-node-resolve": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz", + "integrity": "sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q==", "dev": true, "requires": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1", - "read-package-json-fast": "^1.1.1", - "readdir-scoped-modules": "^1.1.0" + "@rollup/pluginutils": "^3.0.8", + "@types/resolve": "0.0.8", + "builtin-modules": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.14.2" } }, - "@npmcli/move-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.0.tgz", - "integrity": "sha512-Iv2iq0JuyYjKeFkSR4LPaCdDZwlGK9X2cP/01nJcp3yMJ1FjNd9vpiEYvLUgzBxKPg2SFmaOhizoQsPc0LWeOQ==", + "@rollup/plugin-replace": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", "dev": true, "requires": { - "mkdirp": "^1.0.4", - "rimraf": "^2.7.1" + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + } + }, + "@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "requires": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" }, "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } } } }, - "@npmcli/node-gyp": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.1.tgz", - "integrity": "sha512-pBqoKPWmuk9iaEcXlLBVRIA6I1kG9JiICU+sG0NuD6NAR461F+02elHJS4WkQxHW2W5rnsfvP/ClKwmsZ9RaaA==", + "@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@surma/rollup-plugin-off-main-thread": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-1.4.2.tgz", + "integrity": "sha512-yBMPqmd1yEJo/280PAMkychuaALyQ9Lkb5q1ck3mjJrFuEobIfhnQ4J3mbvBoISmR3SWMWV+cGB/I0lCQee79A==", + "dev": true, + "requires": { + "ejs": "^2.6.1", + "magic-string": "^0.25.0" + } + }, + "@svgr/babel-plugin-add-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", "dev": true }, - "@npmcli/promise-spawn": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz", - "integrity": "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==", + "@svgr/babel-plugin-remove-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", + "dev": true + }, + "@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", + "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", + "dev": true + }, + "@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", + "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", + "dev": true + }, + "@svgr/babel-plugin-svg-dynamic-title": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", + "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", + "dev": true + }, + "@svgr/babel-plugin-svg-em-dimensions": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", + "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", + "dev": true + }, + "@svgr/babel-plugin-transform-react-native-svg": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", + "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", + "dev": true + }, + "@svgr/babel-plugin-transform-svg-component": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", + "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", + "dev": true + }, + "@svgr/babel-preset": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", + "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", "dev": true, "requires": { - "infer-owner": "^1.0.4" + "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", + "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", + "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", + "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", + "@svgr/babel-plugin-transform-svg-component": "^5.5.0" } }, - "@npmcli/run-script": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-1.8.1.tgz", - "integrity": "sha512-G8c86g9cQHyRINosIcpovzv0BkXQc3urhL1ORf3KTe4TS4UBsg2O4Z2feca/W3pfzdHEJzc83ETBW4aKbb3SaA==", + "@svgr/core": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", + "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", "dev": true, "requires": { - "@npmcli/node-gyp": "^1.0.0", - "@npmcli/promise-spawn": "^1.3.0", - "infer-owner": "^1.0.4", - "node-gyp": "^7.1.0", - "puka": "^1.0.1", - "read-package-json-fast": "^1.1.3" + "@svgr/plugin-jsx": "^5.5.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.0" + } + }, + "@svgr/hast-util-to-babel-ast": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", + "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.6" + } + }, + "@svgr/plugin-jsx": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", + "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@svgr/babel-preset": "^5.5.0", + "@svgr/hast-util-to-babel-ast": "^5.5.0", + "svg-parser": "^2.0.2" + } + }, + "@svgr/plugin-svgo": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", + "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", + "dev": true, + "requires": { + "cosmiconfig": "^7.0.0", + "deepmerge": "^4.2.2", + "svgo": "^1.2.2" + } + }, + "@svgr/webpack": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", + "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@babel/plugin-transform-react-constant-elements": "^7.12.1", + "@babel/preset-env": "^7.12.1", + "@babel/preset-react": "^7.12.5", + "@svgr/core": "^5.5.0", + "@svgr/plugin-jsx": "^5.5.0", + "@svgr/plugin-svgo": "^5.5.0", + "loader-utils": "^2.0.0" + } + }, + "@testing-library/dom": { + "version": "7.31.2", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-7.31.2.tgz", + "integrity": "sha512-3UqjCpey6HiTZT92vODYLPxTBWlM8ZOOjr3LX5F37/VRipW2M1kX6I/Cm4VXzteZqfGfagg8yXywpcOgQBlNsQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^4.2.0", + "aria-query": "^4.2.2", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.6", + "lz-string": "^1.4.4", + "pretty-format": "^26.6.2" }, "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "mime-db": { - "version": "1.45.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", - "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", - "dev": true - }, - "mime-types": { - "version": "2.1.28", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", - "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", - "dev": true, - "requires": { - "mime-db": "1.45.0" - } - }, - "node-gyp": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", - "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", - "dev": true, - "requires": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.3", - "nopt": "^5.0.0", - "npmlog": "^4.1.2", - "request": "^2.88.2", - "rimraf": "^3.0.2", - "semver": "^7.3.2", - "tar": "^6.0.2", - "which": "^2.0.2" - } - }, - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { - "isexe": "^2.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } } }, - "@schematics/angular": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-11.1.1.tgz", - "integrity": "sha512-K4G+PwCIGYE6aw28ZcqAhw+qI6I8d8qtE3D1Vd4MPVuguDWpNEaB0Y+TIYWzukh5bmOqdl9m/fkw6eZeOglUuQ==", + "@testing-library/jest-dom": { + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.13.0.tgz", + "integrity": "sha512-+jXXTn8GjRnZkJfzG/tqK/2Q7dGlBInR412WE7Aml7CT3wdSpx5dMQC0HOwVQoZ3cNTmQUy8fCVGUV/Zhoyvcw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.9.2", + "@types/testing-library__jest-dom": "^5.9.1", + "aria-query": "^4.2.2", + "chalk": "^3.0.0", + "css": "^3.0.0", + "css.escape": "^1.5.1", + "lodash": "^4.17.15", + "redent": "^3.0.0" + } + }, + "@testing-library/react": { + "version": "11.2.7", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-11.2.7.tgz", + "integrity": "sha512-tzRNp7pzd5QmbtXNG/mhdcl7Awfu/Iz1RaVHY75zTdOkmHCuzMhRL83gWHSgOAcjS3CCbyfwUHMZgRJb4kAfpA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^7.28.1" + } + }, + "@testing-library/user-event": { + "version": "12.8.3", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-12.8.3.tgz", + "integrity": "sha512-IR0iWbFkgd56Bu5ZI/ej8yQwrkCv8Qydx6RzwbKz9faXazR/+5tvYKsZQgyXJiwgpcva127YO6JcWy7YlCfofQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.12.5" + } + }, + "@types/anymatch": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", + "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==", + "dev": true + }, + "@types/aria-query": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.1.tgz", + "integrity": "sha512-S6oPal772qJZHoRZLFc/XoZW2gFvwXusYUmXPXkgxJLuEk2vOt7jc4Yo6z/vtI0EBkbPBVrJJ0B+prLIKiWqHg==", + "dev": true + }, + "@types/babel__core": { + "version": "7.1.14", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz", + "integrity": "sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", + "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", "dev": true, "requires": { - "@angular-devkit/core": "11.1.1", - "@angular-devkit/schematics": "11.1.1", - "jsonc-parser": "3.0.0" + "@babel/types": "^7.0.0" } }, - "@schematics/update": { - "version": "0.1101.1", - "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.1101.1.tgz", - "integrity": "sha512-BmGxxAH05ey8rc0gQpMJ7hAJyr7bM172MStpIws+MLugxZ6a6jH8vI1+MpnrqE0TK1PIPx6vclCMgf3RbQEzIw==", + "@types/babel__template": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", + "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", "dev": true, "requires": { - "@angular-devkit/core": "11.1.1", - "@angular-devkit/schematics": "11.1.1", - "@yarnpkg/lockfile": "1.1.0", - "ini": "2.0.0", - "npm-package-arg": "^8.0.0", - "pacote": "11.1.14", - "semver": "7.3.4", - "semver-intersect": "1.4.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true + "@types/babel__traverse": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.1.tgz", + "integrity": "sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } }, - "@types/file-saver": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-1.3.0.tgz", - "integrity": "sha512-fC12hKtEzVkrV/ZRcrmqvpHG/TMYDZtgpAmgMUA4F7KneDaQeFMwmPz8AfygKKJMqsdTi8bL+E+fciaaMLxUhg==", + "@types/classnames": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@types/classnames/-/classnames-2.3.1.tgz", + "integrity": "sha512-zeOWb0JGBoVmlQoznvqXbE0tEC/HONsnoUNH19Hc96NFsTAwTXbTqb8FMYkru1F/iqp7a18Ws3nWJvtA1sHD1A==", + "requires": { + "classnames": "*" + } + }, + "@types/eslint": { + "version": "7.2.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.10.tgz", + "integrity": "sha512-kUEPnMKrqbtpCq/KTaGFFKAcz6Ethm2EjCoKIDaCmfRBWLbFuTcOJfTlorwbnboXBzahqWLgUp1BQeKHiJzPUQ==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/estree": { + "version": "0.0.47", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.47.tgz", + "integrity": "sha512-c5ciR06jK8u9BstrmJyO97m+klJrrhCf9u3rLu3DEAJBirxRqSCvDQoYKmxuYwQI5SZChAWu+tq9oVlGRuzPAg==", "dev": true }, "@types/glob": { @@ -4089,37 +2354,96 @@ "@types/node": "*" } }, - "@types/jasmine": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.6.3.tgz", - "integrity": "sha512-5QKAG8WfC9XrOgYLXPrxv1G2IIUE6zDyzTWamhNWJO0LqPRUbZ0q0zGHDhDJ7MpFloUuyME/jpBIdPjq3/P3jA==", + "@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA==", "dev": true }, - "@types/jasminewd2": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.6.tgz", - "integrity": "sha512-2ZOKrxb8bKRmP/po5ObYnRDgFE4i+lQiEB27bAMmtMWLgJSqlIDqlLx6S0IRorpOmOPRQ6O80NujTmQAtBkeNw==", + "@types/http-proxy": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.6.tgz", + "integrity": "sha512-+qsjqR75S/ib0ig0R9WN+CDoZeOBU6F2XLewgC4KVgdXiNHiKKHFEMRHOrs5PbYE97D5vataw5wPj4KLYfUkuQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/invariant": { + "version": "2.2.34", + "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.34.tgz", + "integrity": "sha512-lYUtmJ9BqUN688fGY1U1HZoWT1/Jrmgigx2loq4ZcJpICECm/Om3V314BxdzypO0u5PORKGMM6x0OXaljV1YFg==" + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "26.0.23", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.23.tgz", + "integrity": "sha512-ZHLmWMJ9jJ9PTiT58juykZpL7KjwJywFN3Rr2pTSkyQfydf/rk22yS7W8p5DaVUMQ2BQC7oYiU3FjbTM/mYrOA==", "dev": true, "requires": { - "@types/jasmine": "*" + "jest-diff": "^26.0.0", + "pretty-format": "^26.0.0" } }, "@types/json-schema": { "version": "7.0.7", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==" + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", "dev": true }, "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==", "dev": true }, "@types/node": { - "version": "12.19.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.15.tgz", - "integrity": "sha512-lowukE3GUI+VSYSu6VcBXl14d61Rp5hA1D+61r16qnwC0lYNSqdxcvRh0pswejorHfS+HgwBasM8jLXz0/aOsw==", + "version": "14.14.41", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.41.tgz", + "integrity": "sha512-dueRKfaJL4RTtSa7bWeTK1M+VH+Gns73oCgzvYfHZywRCoPSd8EkXBL0mZ9unPTveBn+D9phZBaxuzpwjWkW0g==", + "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/parse-json": { @@ -4128,37 +2452,227 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, + "@types/prettier": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.2.3.tgz", + "integrity": "sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA==", + "dev": true + }, + "@types/prop-types": { + "version": "15.7.3", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", + "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" + }, "@types/q": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", "dev": true }, + "@types/react": { + "version": "17.0.6", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.6.tgz", + "integrity": "sha512-u/TtPoF/hrvb63LdukET6ncaplYsvCvmkceasx8oG84/ZCsoLxz9Z/raPBP4lTAiWW1Jb889Y9svHmv8R26dWw==", + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "@types/react-transition-group": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.1.tgz", + "integrity": "sha512-vIo69qKKcYoJ8wKCJjwSgCTM+z3chw3g18dkrDfVX665tMH7tmbDxEAnPdey4gTlwZz5QuHGzd+hul0OVZDqqQ==", + "requires": { + "@types/react": "*" + } + }, + "@types/resolve": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", + "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/scheduler": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.1.tgz", + "integrity": "sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA==" + }, "@types/source-list-map": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", "dev": true }, + "@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "dev": true + }, + "@types/tapable": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.7.tgz", + "integrity": "sha512-0VBprVqfgFD7Ehb2vd8Lh9TG3jP98gvr8rgehQqzztZNI7o8zS8Ad4jyZneKELphpuE212D8J70LnSNQSyO6bQ==", + "dev": true + }, + "@types/testing-library__jest-dom": { + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.13.0.tgz", + "integrity": "sha512-tfjY4Fzzwg1wSU31MWaIH8rzJ2WPtQtUNnZ0wcZwzzhWWRa63Jb1fB7tl79fGX7PUL/4ZHjKs+tcY5BZ8nfNyg==", + "dev": true, + "requires": { + "@types/jest": "*" + } + }, + "@types/uglify-js": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.0.tgz", + "integrity": "sha512-EGkrJD5Uy+Pg0NUR8uA4bJ5WMfljyad0G+784vLCNUkD+QwOJXUbBYExXfVGf7YtyzdQp3L/XMYcliB987kL5Q==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + } + }, + "@types/warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI=" + }, + "@types/webpack": { + "version": "4.41.27", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.27.tgz", + "integrity": "sha512-wK/oi5gcHi72VMTbOaQ70VcDxSQ1uX8S2tukBK9ARuGXrYM/+u4ou73roc7trXDNmCxCoerE8zruQqX/wuHszA==", + "dev": true, + "requires": { + "@types/anymatch": "*", + "@types/node": "*", + "@types/tapable": "^1", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "source-map": "^0.6.0" + } + }, "@types/webpack-sources": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.8.tgz", - "integrity": "sha512-JHB2/xZlXOjzjBB6fMOpH1eQAfsrpqVVIbneE0Rok16WXwFaznaI5vfg75U5WgGJm7V9W1c4xeRQDjX/zwvghA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-2.1.0.tgz", + "integrity": "sha512-LXn/oYIpBeucgP1EIJbKQ2/4ZmpvRl+dlrFdX7+94SKRUV3Evy3FsfMZY318vGhkWUS5MPhtOM3w1/hCOAOXcg==", "dev": true, "requires": { "@types/node": "*", "@types/source-list-map": "*", - "source-map": "^0.6.1" + "source-map": "^0.7.3" }, "dependencies": { "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true } } }, + "@types/yargs": { + "version": "15.0.13", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz", + "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "20.2.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", + "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.22.0.tgz", + "integrity": "sha512-U8SP9VOs275iDXaL08Ln1Fa/wLXfj5aTr/1c0t0j6CdbOnxh+TruXu1p4I0NAvdPBQgoPjHsgKn28mOi0FzfoA==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "4.22.0", + "@typescript-eslint/scope-manager": "4.22.0", + "debug": "^4.1.1", + "functional-red-black-tree": "^1.0.1", + "lodash": "^4.17.15", + "regexpp": "^3.0.0", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.22.0.tgz", + "integrity": "sha512-xJXHHl6TuAxB5AWiVrGhvbGL8/hbiCQ8FiWwObO3r0fnvBdrbWEDy1hlvGQOAWc6qsCWuWMKdVWlLAEMpxnddg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/scope-manager": "4.22.0", + "@typescript-eslint/types": "4.22.0", + "@typescript-eslint/typescript-estree": "4.22.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.22.0.tgz", + "integrity": "sha512-z/bGdBJJZJN76nvAY9DkJANYgK3nlRstRRi74WHm3jjgf2I8AglrSY+6l7ogxOmn55YJ6oKZCLLy+6PW70z15Q==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "4.22.0", + "@typescript-eslint/types": "4.22.0", + "@typescript-eslint/typescript-estree": "4.22.0", + "debug": "^4.1.1" + } + }, + "@typescript-eslint/scope-manager": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.22.0.tgz", + "integrity": "sha512-OcCO7LTdk6ukawUM40wo61WdeoA7NM/zaoq1/2cs13M7GyiF+T4rxuA4xM+6LeHWjWbss7hkGXjFDRcKD4O04Q==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.22.0", + "@typescript-eslint/visitor-keys": "4.22.0" + } + }, + "@typescript-eslint/types": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.22.0.tgz", + "integrity": "sha512-sW/BiXmmyMqDPO2kpOhSy2Py5w6KvRRsKZnV0c4+0nr4GIcedJwXAq+RHNK4lLVEZAJYFltnnk1tJSlbeS9lYA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.22.0.tgz", + "integrity": "sha512-TkIFeu5JEeSs5ze/4NID+PIcVjgoU3cUQUIZnH3Sb1cEn1lBo7StSV5bwPuJQuoxKXlzAObjYTilOEKRuhR5yg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.22.0", + "@typescript-eslint/visitor-keys": "4.22.0", + "debug": "^4.1.1", + "globby": "^11.0.1", + "is-glob": "^4.0.1", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.22.0.tgz", + "integrity": "sha512-nnMu4F+s4o0sll6cBSsTeVsT4cwxB7zECK3dFxzEjPBii9xLpq4yqqsy/FU5zMfan6G60DKZSCXAa3sHJZrcYw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.22.0", + "eslint-visitor-keys": "^2.0.0" + } + }, "@webassemblyjs/ast": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", @@ -4346,44 +2860,54 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, - "@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true - }, "abab": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", "dev": true }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, "accepts": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", - "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", "dev": true, "requires": { - "mime-types": "~2.1.16", - "negotiator": "0.6.1" + "mime-types": "~2.1.24", + "negotiator": "0.6.2" } }, "acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", "dev": true }, "acorn-walk": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz", - "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, + "address": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", "dev": true }, "adjust-sourcemap-loader": { @@ -4396,72 +2920,6 @@ "regex-parser": "^2.2.11" } }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "agentkeepalive": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.1.3.tgz", - "integrity": "sha512-wn8fw19xKZwdGPO47jivonaHRTd+nGOMP1z11sgGeQzDy2xd5FG0R67dIMcKHDE2cJ5y+YXV30XVGUBPRSY7Hg==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, "aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -4473,12 +2931,11 @@ } }, "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", - "dev": true, + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "requires": { - "fast-deep-equal": "^2.0.1", + "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" @@ -4509,12 +2966,20 @@ "dev": true }, "ansi-escapes": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.2.1.tgz", - "integrity": "sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "requires": { - "type-fest": "^0.5.2" + "type-fest": "^0.21.3" + }, + "dependencies": { + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + } } }, "ansi-html": { @@ -4524,68 +2989,53 @@ "dev": true }, "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" } }, "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, - "app-root-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.0.0.tgz", - "integrity": "sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw==", - "dev": true - }, "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, "argparse": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { "sprintf-js": "~1.0.2" } }, "aria-query": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", - "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", "dev": true, "requires": { - "ast-types-flow": "0.0.7", - "commander": "^2.11.0" + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" } }, "arity-n": { @@ -4618,6 +3068,19 @@ "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", "dev": true }, + "array-includes": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.5" + } + }, "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -4636,23 +3099,39 @@ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, - "arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", - "dev": true + "array.prototype.flat": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + } + }, + "array.prototype.flatmap": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz", + "integrity": "sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "function-bind": "^1.1.1" + } }, "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", "dev": true }, "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" }, "asn1": { "version": "0.2.4", @@ -4676,9 +3155,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } @@ -4691,6 +3170,23 @@ "requires": { "object-assign": "^4.1.1", "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } } }, "assert-plus": { @@ -4711,21 +3207,19 @@ "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", "dev": true }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, "async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", - "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", + "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.11" - }, - "dependencies": { - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true - } + "lodash": "^4.17.14" } }, "async-each": { @@ -4735,9 +3229,9 @@ "dev": true }, "async-limiter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", "dev": true }, "asynckit": { @@ -4746,23 +3240,30 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, "atob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", - "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, "autoprefixer": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.2.1.tgz", - "integrity": "sha512-dwP0UjyYvROUvtU+boBx8ff5pPWami1NGTrJs9YUsS/oZVbRAcdNHOOuXSA1fc46tgKqe072cVaKD69rvCc3QQ==", + "version": "9.8.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", + "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", "dev": true, "requires": { - "browserslist": "^4.16.1", - "caniuse-lite": "^1.0.30001173", + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", "colorette": "^1.2.1", - "fraction.js": "^4.0.13", "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.32", "postcss-value-parser": "^4.1.0" } }, @@ -4778,24 +3279,87 @@ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, + "axe-core": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.1.4.tgz", + "integrity": "sha512-Pdgfv6iP0gNx9ejRGa3zE7Xgkj/iclXqLfe7BnatdZz0QnLZ3jrRHUVH8wNSdN68w05Sk3ShGTb3ydktMTooig==", + "dev": true + }, "axobject-query": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz", - "integrity": "sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", + "dev": true + }, + "babel-eslint": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "babel-extract-comments": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz", + "integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==", "dev": true, "requires": { - "ast-types-flow": "0.0.7" + "babylon": "^6.18.0" + } + }, + "babel-jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", + "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", + "dev": true, + "requires": { + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } } }, "babel-loader": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", - "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", + "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", "dev": true, "requires": { - "find-cache-dir": "^3.3.1", + "find-cache-dir": "^2.1.0", "loader-utils": "^1.4.0", - "make-dir": "^3.1.0", + "mkdirp": "^0.5.3", + "pify": "^4.0.1", "schema-utils": "^2.6.5" }, "dependencies": { @@ -4830,16 +3394,367 @@ "object.assign": "^4.1.0" } }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", + "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-plugin-macros": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", + "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "cosmiconfig": "^6.0.0", + "resolve": "^1.12.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + } + } + } + }, + "babel-plugin-named-asset-import": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.7.tgz", + "integrity": "sha512-squySRkf+6JGnvjoUtDEjSREJEBirnXi9NqP6rjSYsylxQxqBTz+pkmf395i9E2zsvmYUaI40BHo6SqZUdydlw==", + "dev": true + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.0.tgz", + "integrity": "sha512-9bNwiR0dS881c5SHnzCmmGlMkJLl0OUZvxrxHo9w/iNoRuqaPjqlvBf4HrovXtQs/au5yKkpcdgfT1cC5PAZwg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.0", + "semver": "^6.1.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.0.tgz", + "integrity": "sha512-zZyi7p3BCUyzNxLx8KV61zTINkkV65zVkDAFNZmrTCRVhjo1jAS+YLvDJ9Jgd/w2tsAviCwFHReYfxO3Iql8Yg==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.0", + "core-js-compat": "^3.9.1" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.0.tgz", + "integrity": "sha512-J7vKbCuD2Xi/eEHxquHN14bXAW9CXtecwuLrOIDJtcZzTaPzV1VdEfoUf9AzcRBMolKUQKM9/GVojeh0hFiqMg==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.0" + } + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" + } + }, + "babel-plugin-transform-react-remove-prop-types": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", + "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==", + "dev": true + }, + "babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", + "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^26.6.2", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "babel-preset-react-app": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.0.tgz", + "integrity": "sha512-itL2z8v16khpuKutx5IH8UdCdSTuzrOhRFTEdIhveZ2i1iBKDrVE0ATa4sFVy+02GLucZNVBWtoarXBy0Msdpg==", + "dev": true, + "requires": { + "@babel/core": "7.12.3", + "@babel/plugin-proposal-class-properties": "7.12.1", + "@babel/plugin-proposal-decorators": "7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "7.12.1", + "@babel/plugin-proposal-numeric-separator": "7.12.1", + "@babel/plugin-proposal-optional-chaining": "7.12.1", + "@babel/plugin-transform-flow-strip-types": "7.12.1", + "@babel/plugin-transform-react-display-name": "7.12.1", + "@babel/plugin-transform-runtime": "7.12.1", + "@babel/preset-env": "7.12.1", + "@babel/preset-react": "7.12.1", + "@babel/preset-typescript": "7.12.1", + "@babel/runtime": "7.12.1", + "babel-plugin-macros": "2.8.0", + "babel-plugin-transform-react-remove-prop-types": "0.4.24" + }, + "dependencies": { + "@babel/plugin-proposal-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", + "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", + "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.1.tgz", + "integrity": "sha512-MR7Ok+Af3OhNTCxYVjJZHS0t97ydnJZt/DbR4WISO39iDnhiD8XHrY12xuSJ90FFEGjir0Fzyyn7g/zY6hxbxA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz", + "integrity": "sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.1.tgz", + "integrity": "sha512-cAzB+UzBIrekfYxyLlFqf/OagTvHLcVBb5vpouzkYkBclRPraiygVnafvAoipErZLI8ANv8Ecn6E/m5qPXD26w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/preset-env": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.1.tgz", + "integrity": "sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.12.1", + "@babel/helper-compilation-targets": "^7.12.1", + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-option": "^7.12.1", + "@babel/plugin-proposal-async-generator-functions": "^7.12.1", + "@babel/plugin-proposal-class-properties": "^7.12.1", + "@babel/plugin-proposal-dynamic-import": "^7.12.1", + "@babel/plugin-proposal-export-namespace-from": "^7.12.1", + "@babel/plugin-proposal-json-strings": "^7.12.1", + "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", + "@babel/plugin-proposal-numeric-separator": "^7.12.1", + "@babel/plugin-proposal-object-rest-spread": "^7.12.1", + "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.12.1", + "@babel/plugin-proposal-private-methods": "^7.12.1", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.12.1", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.12.1", + "@babel/plugin-transform-arrow-functions": "^7.12.1", + "@babel/plugin-transform-async-to-generator": "^7.12.1", + "@babel/plugin-transform-block-scoped-functions": "^7.12.1", + "@babel/plugin-transform-block-scoping": "^7.12.1", + "@babel/plugin-transform-classes": "^7.12.1", + "@babel/plugin-transform-computed-properties": "^7.12.1", + "@babel/plugin-transform-destructuring": "^7.12.1", + "@babel/plugin-transform-dotall-regex": "^7.12.1", + "@babel/plugin-transform-duplicate-keys": "^7.12.1", + "@babel/plugin-transform-exponentiation-operator": "^7.12.1", + "@babel/plugin-transform-for-of": "^7.12.1", + "@babel/plugin-transform-function-name": "^7.12.1", + "@babel/plugin-transform-literals": "^7.12.1", + "@babel/plugin-transform-member-expression-literals": "^7.12.1", + "@babel/plugin-transform-modules-amd": "^7.12.1", + "@babel/plugin-transform-modules-commonjs": "^7.12.1", + "@babel/plugin-transform-modules-systemjs": "^7.12.1", + "@babel/plugin-transform-modules-umd": "^7.12.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", + "@babel/plugin-transform-new-target": "^7.12.1", + "@babel/plugin-transform-object-super": "^7.12.1", + "@babel/plugin-transform-parameters": "^7.12.1", + "@babel/plugin-transform-property-literals": "^7.12.1", + "@babel/plugin-transform-regenerator": "^7.12.1", + "@babel/plugin-transform-reserved-words": "^7.12.1", + "@babel/plugin-transform-shorthand-properties": "^7.12.1", + "@babel/plugin-transform-spread": "^7.12.1", + "@babel/plugin-transform-sticky-regex": "^7.12.1", + "@babel/plugin-transform-template-literals": "^7.12.1", + "@babel/plugin-transform-typeof-symbol": "^7.12.1", + "@babel/plugin-transform-unicode-escapes": "^7.12.1", + "@babel/plugin-transform-unicode-regex": "^7.12.1", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.12.1", + "core-js-compat": "^3.6.2", + "semver": "^5.5.0" + } + }, + "@babel/preset-react": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.12.1.tgz", + "integrity": "sha512-euCExymHCi0qB9u5fKw7rvlw7AZSjw/NaB9h7EkdTt5+yHRrXdiRTh7fkG3uBPpJg82CqLfp1LHLqWGSCrab+g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-transform-react-display-name": "^7.12.1", + "@babel/plugin-transform-react-jsx": "^7.12.1", + "@babel/plugin-transform-react-jsx-development": "^7.12.1", + "@babel/plugin-transform-react-jsx-self": "^7.12.1", + "@babel/plugin-transform-react-jsx-source": "^7.12.1", + "@babel/plugin-transform-react-pure-annotations": "^7.12.1" + } + }, + "@babel/runtime": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", + "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + } + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", "dev": true }, "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true }, "base": { "version": "0.11.2", @@ -4856,12 +3771,6 @@ "pascalcase": "^0.1.1" }, "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", @@ -4899,33 +3808,15 @@ "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true } } }, - "base64-arraybuffer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", - "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", - "dev": true - }, "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true }, - "base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "dev": true - }, "batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -4942,15 +3833,15 @@ } }, "bfj": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.1.tgz", - "integrity": "sha512-+GUNvzHR4nRyGybQc2WpNJL4MJazMuvf92ueIyA0bIkPRwhhQu3IfZQ2PSoVPpCBJfmoSdOxu5rnotfFLlvYRQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz", + "integrity": "sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw==", "dev": true, "requires": { - "bluebird": "^3.5.1", - "check-types": "^7.3.0", - "hoopy": "^0.1.2", - "tryer": "^1.0.0" + "bluebird": "^3.5.5", + "check-types": "^11.1.1", + "hoopy": "^0.1.4", + "tryer": "^1.0.1" } }, "big.js": { @@ -4975,67 +3866,16 @@ "file-uri-to-path": "1.0.0" } }, - "bl": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz", - "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - } - } - }, - "blob": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", - "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", - "dev": true - }, "bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, "bn.js": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", - "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", "dev": true }, "body-parser": { @@ -5062,51 +3902,26 @@ "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", "dev": true }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "ms": "2.0.0" } }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true }, "qs": { "version": "6.7.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", "dev": true - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true } } }, @@ -5136,41 +3951,22 @@ "integrity": "sha512-Io55IuQY3kydzHtbGvQya3H+KorS/M9rSNyfCGCg9WZ4pyT/lCxIlpJgG1GXW/PswzC84Tr2fBYi+7+jFVQQBw==" }, "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" } }, "brorand": { @@ -5179,6 +3975,12 @@ "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", "dev": true }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, "browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", @@ -5214,14 +4016,6 @@ "des.js": "^1.0.0", "inherits": "^2.0.1", "safe-buffer": "^5.1.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } } }, "browserify-rsa": { @@ -5251,37 +4045,11 @@ "safe-buffer": "^5.2.0" }, "dependencies": { - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } } } }, @@ -5295,26 +4063,44 @@ } }, "browserslist": { - "version": "4.16.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.1.tgz", - "integrity": "sha512-UXhDrwqsNcpTYJBTZsbGATDxZbiVDsx6UjpmRUmtnP10pr8wAYr5LgFoEFw9ixriQH2mv/NX2SfGzE/o8GndLA==", + "version": "4.16.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.5.tgz", + "integrity": "sha512-C2HAjrM1AI/djrpAUU/tr4pml1DqLIzJKSLDBXBrNErl9ZCCTXdhwxdJjYc16953+mBWf7Lw+uUJgpgb8cN71A==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001173", - "colorette": "^1.2.1", - "electron-to-chromium": "^1.3.634", + "caniuse-lite": "^1.0.30001214", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.719", "escalade": "^3.1.1", - "node-releases": "^1.1.69" + "node-releases": "^1.1.71" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" } }, "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", "dev": true, "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } } }, "buffer-from": { @@ -5336,9 +4122,9 @@ "dev": true }, "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", + "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", "dev": true }, "builtin-status-codes": { @@ -5347,12 +4133,6 @@ "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", "dev": true }, - "builtins": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", - "dev": true - }, "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", @@ -5360,76 +4140,34 @@ "dev": true }, "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "version": "15.0.6", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.6.tgz", + "integrity": "sha512-g1WYDMct/jzW+JdWEyjaX2zoBkZ6ZT9VpOyp2I/VMtDsNLffNat3kqPFfi1eDRSK9/SuKGyORDHcQMcPF8sQ/w==", "dev": true, "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" }, "dependencies": { - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true } } @@ -5449,21 +4187,12 @@ "to-object-path": "^0.3.0", "union-value": "^1.0.0", "unset-value": "^1.0.0" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - } } }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, "requires": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -5476,6 +4205,14 @@ "dev": true, "requires": { "callsites": "^2.0.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + } } }, "caller-path": { @@ -5488,11 +4225,29 @@ } }, "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "dev": true + } + } + }, "camelcase": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", @@ -5512,15 +4267,24 @@ } }, "caniuse-lite": { - "version": "1.0.30001179", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001179.tgz", - "integrity": "sha512-blMmO0QQujuUWZKyVrD1msR4WNDAqb/UPO1Sw2WWsQ7deoM5bJiicKnWJ1Y0NS/aGINSnKPIWBMw5luX+NDUCA==", + "version": "1.0.30001214", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001214.tgz", + "integrity": "sha512-O2/SCpuaU3eASWVaesQirZv1MSjUNOvmugaD8zNSJqw6Vv5SGwoOpA9LJs3pNPfM745nxqPvfZY3MQKY4AKHYg==", "dev": true }, - "canonical-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz", - "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==", + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "dev": true, + "requires": { + "rsvp": "^4.8.4" + } + }, + "case-sensitive-paths-webpack-plugin": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz", + "integrity": "sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ==", "dev": true }, "caseless": { @@ -5530,25 +4294,25 @@ "dev": true }, "chalk": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.2.2.tgz", - "integrity": "sha512-LvixLAQ4MYhbf7hgL4o5PeK32gJKvVzDRiSNIApDofQvyhl8adgG2lJVXn4+ekQoK7HL9RF8lqxwerpe0x2pCw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, "requires": { - "ansi-styles": "^3.1.0", - "escape-string-regexp": "^1.0.5", - "supports-color": "^4.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true }, "check-types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/check-types/-/check-types-7.4.0.tgz", - "integrity": "sha512-YbulWHdfP99UfZ73NcUDlNJhEIDgm9Doq9GhpyXbF+7Aegi3CVV7qqMCKTTqJxlvEvnQBp9IA+dxsGN6xK/nSg==", + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.1.2.tgz", + "integrity": "sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ==", "dev": true }, "chokidar": { @@ -5565,65 +4329,25 @@ "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.5.0" - }, - "dependencies": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "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 - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } } }, "chownr": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", - "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true }, "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true }, "cipher-base": { "version": "1.0.4", @@ -5635,10 +4359,10 @@ "safe-buffer": "^5.0.1" } }, - "circular-dependency-plugin": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.2.tgz", - "integrity": "sha512-g38K9Cm5WRwlaH6g03B9OEz/0qRizI+2I7n+Gz+L5DxXJAPAiWQvwlYNm1V1jkdpUv95bOe/ASm2vfi/G560jQ==", + "cjs-module-lexer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", + "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", "dev": true }, "class-utils": { @@ -5664,120 +4388,43 @@ } } }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true + "classnames": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", + "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", "dev": true, "requires": { - "restore-cursor": "^3.1.0" + "source-map": "~0.6.0" } }, - "cli-spinners": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.5.0.tgz", - "integrity": "sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ==", - "dev": true - }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true }, "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.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 - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "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" - } - }, - "wrap-ansi": { - "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": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - } + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" } }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, "coa": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", @@ -5809,6 +4456,21 @@ "supports-color": "^5.3.0" } }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -5826,66 +4488,12 @@ } } }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", "dev": true }, - "codelyzer": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-6.0.1.tgz", - "integrity": "sha512-cOyGQgMdhnRYtW2xrJUNrNYDjEgwQ+BrE2y93Bwz3h4DJ6vJRLfupemU5N3pbYsUlBHJf0u1j1UGk+NLW4d97g==", - "dev": true, - "requires": { - "@angular/compiler": "9.0.0", - "@angular/core": "9.0.0", - "app-root-path": "^3.0.0", - "aria-query": "^3.0.0", - "axobject-query": "2.0.2", - "css-selector-tokenizer": "^0.7.1", - "cssauron": "^1.4.0", - "damerau-levenshtein": "^1.0.4", - "rxjs": "^6.5.3", - "semver-dsl": "^1.0.1", - "source-map": "^0.5.7", - "sprintf-js": "^1.1.2", - "tslib": "^1.10.0", - "zone.js": "~0.10.3" - }, - "dependencies": { - "@angular/compiler": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.0.0.tgz", - "integrity": "sha512-ctjwuntPfZZT2mNj2NDIVu51t9cvbhl/16epc5xEwyzyDt76pX9UgwvY+MbXrf/C/FWwdtmNtfP698BKI+9leQ==", - "dev": true - }, - "@angular/core": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.0.0.tgz", - "integrity": "sha512-6Pxgsrf0qF9iFFqmIcWmjJGkkCaCm6V5QNnxMy2KloO3SDq6QuMVRbN9RtC8Urmo25LP+eZ6ZgYqFYpdD8Hd9w==", - "dev": true - }, - "sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", - "dev": true - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "zone.js": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.10.3.tgz", - "integrity": "sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg==", - "dev": true - } - } - }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -5904,25 +4512,44 @@ "requires": { "color-convert": "^1.9.1", "color-string": "^1.5.4" + }, + "dependencies": { + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + } } }, "color-convert": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "requires": { - "color-name": "^1.1.1" + "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "color-string": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz", - "integrity": "sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", + "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", "dev": true, "requires": { "color-name": "^1.0.0", @@ -5930,15 +4557,9 @@ } }, "colorette": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", - "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", - "dev": true - }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", "dev": true }, "combined-stream": { @@ -5951,9 +4572,16 @@ } }, "commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + }, + "common-tags": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", + "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", + "dev": true }, "commondir": { "version": "1.0.1", @@ -5961,24 +4589,12 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", - "dev": true - }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", - "dev": true - }, "compose-function": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", @@ -5995,14 +4611,6 @@ "dev": true, "requires": { "mime-db": ">= 1.43.0 < 2" - }, - "dependencies": { - "mime-db": { - "version": "1.45.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", - "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", - "dev": true - } } }, "compression": { @@ -6020,81 +4628,105 @@ "vary": "~1.1.2" }, "dependencies": { - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dev": true, - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "mime-db": { - "version": "1.45.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", - "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", - "dev": true - }, - "mime-types": { - "version": "2.1.28", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", - "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "mime-db": "1.45.0" + "ms": "2.0.0" } }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } }, + "compute-gcd": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/compute-gcd/-/compute-gcd-1.2.1.tgz", + "integrity": "sha512-TwMbxBNz0l71+8Sc4czv13h4kEqnchV9igQZBi6QUaz09dnz13juGnnaWWJTRsP3brxOoxeB4SA2WELLw1hCtg==", + "requires": { + "validate.io-array": "^1.0.3", + "validate.io-function": "^1.0.2", + "validate.io-integer-array": "^1.0.0" + } + }, + "compute-lcm": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/compute-lcm/-/compute-lcm-1.1.2.tgz", + "integrity": "sha512-OFNPdQAXnQhDSKioX8/XYT6sdUlXwpeMjfd6ApxMJfyZ4GxmLR1xvMERctlYhlHwIiz6CSpBc2+qYKjHGZw4TQ==", + "requires": { + "compute-gcd": "^1.2.1", + "validate.io-array": "^1.0.3", + "validate.io-function": "^1.0.2", + "validate.io-integer-array": "^1.0.0" + } + }, + "compute-scroll-into-view": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz", + "integrity": "sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg==" + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, "concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { + "buffer-from": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^2.2.2", "typedarray": "^0.0.6" - } - }, - "connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dev": true, - "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" }, "dependencies": { - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } } } }, + "confusing-browser-globals": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", + "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==", + "dev": true + }, "connect-history-api-fallback": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", @@ -6107,24 +4739,27 @@ "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", "dev": true }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, "constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", "dev": true }, - "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", "dev": true }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", @@ -6133,267 +4768,69 @@ }, "convert-source-map": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "copy-anything": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.1.tgz", - "integrity": "sha512-lA57e7viQHOdPQcrytv5jFeudZZOXuyk47lZym279FiDQ8jeZomXiGuVf6ffMKkJ+3TIai3J1J3yi6M+/4U35g==", - "dev": true, - "requires": { - "is-what": "^3.7.1" - } - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "copy-webpack-plugin": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.3.2.tgz", - "integrity": "sha512-MgJ1uouLIbDg4ST1GzqrGQyKoXY5iPqi6fghFqarijam7FQcBa/r6Rg0VkoIuzx75Xq8iAMghyOueMkWUQ5OaA==", - "dev": true, - "requires": { - "cacache": "^15.0.5", - "fast-glob": "^3.2.4", - "find-cache-dir": "^3.3.1", - "glob-parent": "^5.1.1", - "globby": "^11.0.1", - "loader-utils": "^2.0.0", - "normalize-path": "^3.0.0", - "p-limit": "^3.0.2", - "schema-utils": "^3.0.0", - "serialize-javascript": "^5.0.1", - "webpack-sources": "^1.4.3" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "cacache": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", - "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", - "dev": true, - "requires": { - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.0", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "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, - "requires": { - "is-glob": "^4.0.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, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + }, + "dependencies": { "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "requires": { "glob": "^7.1.3" } - }, - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "ssri": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", - "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", - "dev": true, - "requires": { - "minipass": "^3.1.1" - } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } } }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, "core-js": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.2.tgz", - "integrity": "sha1-vEZIZW59ydyA19PHu8Fy2W50TmM=" + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.11.0.tgz", + "integrity": "sha512-bd79DPpx+1Ilh9+30aT5O1sgpQd4Ttg8oqkqi51ZzhedMM1omD2e6IOF48Z/DzDCZ2svp49tN/3vneTK6ZBkXw==", + "dev": true }, "core-js-compat": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.8.3.tgz", - "integrity": "sha512-1sCb0wBXnBIL16pfFG1Gkvei6UzvKyTNYpiC41yrdjEv0UoJoq9E/abTMzyYJ6JpTkAj15dLjbqifIzEBDVvog==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.11.0.tgz", + "integrity": "sha512-3wsN9YZJohOSDCjVB0GequOyHax8zFiogSX3XWLE28M1Ew7dTU57tgHjIylSBKSIouwmLBp3g61sKMz/q3xEGA==", "dev": true, "requires": { - "browserslist": "^4.16.1", + "browserslist": "^4.16.4", "semver": "7.0.0" }, "dependencies": { @@ -6405,6 +4842,12 @@ } } }, + "core-js-pure": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.11.0.tgz", + "integrity": "sha512-PxEiQGjzC+5qbvE7ZIs5Zn6BynNeZO9zHhrrWmkRff2SZLq0CE/H5LuZOJHhmOQ8L38+eMzEHAmPYWrUtDfuDQ==", + "dev": true + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -6412,15 +4855,16 @@ "dev": true }, "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", "dev": true, "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" } }, "create-ecdh": { @@ -6434,9 +4878,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } @@ -6468,67 +4912,24 @@ "sha.js": "^2.4.8" } }, - "critters": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.6.tgz", - "integrity": "sha512-NUB3Om7tkf+XWi9+2kJ2A3l4/tHORDI1UT+nHxUqay2B/tJvMpiXcklDDLBH3fPn9Pe23uu0we/08Ukjy4cLCQ==", + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "chalk": "^4.1.0", - "css": "^3.0.0", - "parse5": "^6.0.1", - "parse5-htmlparser2-tree-adapter": "^6.0.1", - "pretty-bytes": "^5.3.0" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } } } }, @@ -6551,6 +4952,12 @@ "randomfill": "^1.0.3" } }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true + }, "css": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", @@ -6560,36 +4967,15 @@ "inherits": "^2.0.4", "source-map": "^0.6.1", "source-map-resolve": "^0.6.0" - }, - "dependencies": { - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-resolve": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", - "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0" - } - } + } + }, + "css-blank-pseudo": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", + "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", + "dev": true, + "requires": { + "postcss": "^7.0.5" } }, "css-color-names": { @@ -6601,207 +4987,71 @@ "css-declaration-sorter": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", - "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", - "dev": true, - "requires": { - "postcss": "^7.0.1", - "timsort": "^0.3.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "css-loader": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.0.1.tgz", - "integrity": "sha512-cXc2ti9V234cq7rJzFKhirb2L2iPy8ZjALeVJAozXYz9te3r4eqLSixNAbMDJSgJEQywqXzs8gonxaboeKqwiw==", - "dev": true, - "requires": { - "camelcase": "^6.2.0", - "cssesc": "^3.0.0", - "icss-utils": "^5.0.0", - "loader-utils": "^2.0.0", - "postcss": "^8.1.4", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.1.0", - "schema-utils": "^3.0.0", - "semver": "^7.3.2" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "dev": true, + "requires": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" } }, - "css-parse": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", - "integrity": "sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=", + "css-has-pseudo": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", + "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", "dev": true, "requires": { - "css": "^2.0.0" + "postcss": "^7.0.6", + "postcss-selector-parser": "^5.0.0-rc.4" }, "dependencies": { - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", "dev": true }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", "dev": true, "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } } } }, + "css-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-4.3.0.tgz", + "integrity": "sha512-rdezjCjScIrsL8BSYszgT4s476IcNKt6yX69t0pHjJVnPUTDpn4WfIpDQTN3wCJvUvfsz/mFjuGOekf3PY3NUg==", + "dev": true, + "requires": { + "camelcase": "^6.0.0", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^2.0.0", + "postcss": "^7.0.32", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.3", + "postcss-modules-scope": "^2.2.0", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^2.7.1", + "semver": "^7.3.2" + } + }, + "css-prefers-color-scheme": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", + "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", + "dev": true, + "requires": { + "postcss": "^7.0.5" + } + }, "css-select": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", @@ -6820,16 +5070,6 @@ "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", "dev": true }, - "css-selector-tokenizer": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", - "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "fastparse": "^1.1.2" - } - }, "css-tree": { "version": "1.0.0-alpha.37", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", @@ -6838,14 +5078,6 @@ "requires": { "mdn-data": "2.0.4", "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "css-what": { @@ -6854,14 +5086,17 @@ "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", "dev": true }, - "cssauron": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", - "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", - "dev": true, - "requires": { - "through": "X.X.X" - } + "css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=", + "dev": true + }, + "cssdb": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", + "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==", + "dev": true }, "cssesc": { "version": "3.0.0", @@ -6870,86 +5105,61 @@ "dev": true }, "cssnano": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", - "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", + "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", "dev": true, "requires": { "cosmiconfig": "^5.0.0", - "cssnano-preset-default": "^4.0.7", + "cssnano-preset-default": "^4.0.8", "is-resolvable": "^1.0.0", "postcss": "^7.0.0" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" } }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, "cssnano-preset-default": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", - "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", + "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", "dev": true, "requires": { "css-declaration-sorter": "^4.0.1", @@ -6980,73 +5190,8 @@ "postcss-ordered-values": "^4.1.2", "postcss-reduce-initial": "^4.0.3", "postcss-reduce-transforms": "^4.0.2", - "postcss-svgo": "^4.0.2", + "postcss-svgo": "^4.0.3", "postcss-unique-selectors": "^4.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } } }, "cssnano-util-get-arguments": { @@ -7068,71 +5213,6 @@ "dev": true, "requires": { "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } } }, "cssnano-util-same-parent": { @@ -7151,9 +5231,9 @@ }, "dependencies": { "css-tree": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.2.tgz", - "integrity": "sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", "dev": true, "requires": { "mdn-data": "2.0.14", @@ -7162,28 +5242,44 @@ }, "mdn-data": { "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", "dev": true } } }, - "custom-event": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", "dev": true }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, + "csstype": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz", + "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" + }, "cyclist": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", - "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", "dev": true }, "d": { @@ -7211,43 +5307,58 @@ "assert-plus": "^1.0.0" } }, - "date-format": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", - "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==", - "dev": true + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + } + }, + "date-fns": { + "version": "2.21.3", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.21.3.tgz", + "integrity": "sha512-HeYdzCaFflc1i4tGbj7JKMjM4cKGYoyxwcIIkHzNgCkX8xXDNJDZXgDDVchIWpN4eQc3lH37WarduXFZJOtxfw==" }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, "requires": { - "ms": "2.0.0" + "ms": "2.1.2" } }, - "debuglog": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", - "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", - "dev": true - }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, + "decimal.js": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", + "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==", + "dev": true + }, "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", "dev": true }, "deep-equal": { "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", @@ -7257,15 +5368,22 @@ "regexp.prototype.flags": "^1.2.0" } }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, "deep-object-diff": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/deep-object-diff/-/deep-object-diff-1.1.0.tgz", "integrity": "sha512-b+QLs5vHgS+IoSNcUE4n9HP2NwcHj7aqnJWsjPtuG75Rh5TOaGt0OjAYInh77d5T16V5cRDC+Pw/6ZZZiETBGw==" }, "deepmerge": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", - "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==" + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true }, "default-gateway": { "version": "4.2.0", @@ -7277,20 +5395,10 @@ "ip-regex": "^2.1.0" } }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true, - "requires": { - "clone": "^1.0.2" - } - }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, "requires": { "object-keys": "^1.0.12" } @@ -7333,12 +5441,6 @@ "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true } } }, @@ -7400,22 +5502,6 @@ "dev": true, "requires": { "glob": "^7.1.3" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } } } } @@ -7426,22 +5512,10 @@ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", - "dev": true - }, - "dependency-graph": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.7.2.tgz", - "integrity": "sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", "dev": true }, "des.js": { @@ -7460,5897 +5534,6173 @@ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", "dev": true }, - "detect-node": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", - "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", - "dev": true - }, - "dezalgo": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", - "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", - "dev": true, - "requires": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "di": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", - "dev": true - }, - "diff": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.4.0.tgz", - "integrity": "sha512-QpVuMTEoJMF7cKzi6bvWhRulU1fZqZnvyVQgNhPaxxuTYwyjn/j1v9falseQ/uXWwPnO56RBfwtg4h/EQXmucA==", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", - "dev": true - }, - "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", - "dev": true, - "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dev": true, - "requires": { - "buffer-indexof": "^1.0.0" - } - }, - "dom-serialize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", - "dev": true, - "requires": { - "custom-event": "~1.0.0", - "ent": "~2.2.0", - "extend": "^3.0.0", - "void-elements": "^2.0.0" - } - }, - "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz", - "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==", - "dev": true - } - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", - "dev": true - }, - "duplexify": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.4.tgz", - "integrity": "sha512-JzYSLYMhoVVBe8+mbHQ4KgpvHpm0DZpJuL8PY93Vyv1fW7jYJ90LoXa1di/CVbJM+TgMs91rbDapE/RNIfnJsA==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.645", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.645.tgz", - "integrity": "sha512-T7mYop3aDpRHIQaUYcmzmh6j9MAe560n6ukqjJMbVC6bVTau7dSpvB18bcsBPPtOSe10cKxhJFtlbEzLa0LL1g==", - "dev": true - }, - "elliptic": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", - "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", - "dev": true, - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "optional": true, - "requires": { - "iconv-lite": "^0.6.2" - }, - "dependencies": { - "iconv-lite": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", - "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true }, - "engine.io": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.5.0.tgz", - "integrity": "sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA==", + "detect-node": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.5.tgz", + "integrity": "sha512-qi86tE6hRcFHy8jI1m2VG+LaPUR1LhqDa5G8tVjuUXmOrpuAgqsA1pN0+ldgr3aKUH+QLI9hCY/OcRYisERejw==", + "dev": true + }, + "detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", "dev": true, "requires": { - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "debug": "~4.1.0", - "engine.io-parser": "~2.2.0", - "ws": "~7.4.2" + "address": "^1.0.1", + "debug": "^2.6.0" }, "dependencies": { - "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", - "dev": true - }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.0.0" } }, "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } }, - "engine.io-client": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.0.tgz", - "integrity": "sha512-12wPRfMrugVw/DNyJk34GQ5vIVArEcVMXWugQGGuw2XxUSztFNmJggZmv8IZlLyEdnpO1QB9LkcjeWewO2vxtA==", - "dev": true, - "requires": { - "component-emitter": "~1.3.0", - "component-inherit": "0.0.3", - "debug": "~3.1.0", - "engine.io-parser": "~2.2.0", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "ws": "~7.4.2", - "xmlhttprequest-ssl": "~1.5.4", - "yeast": "0.1.2" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "engine.io-parser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz", - "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", - "dev": true, - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.4", - "blob": "0.0.5", - "has-binary2": "~1.0.2" - } + "diff-sequences": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "dev": true }, - "enhanced-resolve": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.6.0.tgz", - "integrity": "sha512-C3GGDfFZmqUa21o10YRKbZN60DPl0HyXKXxoEnQMWso9u7KMU23L7CBHfr/rVxORddY/8YQZaU2MZ1ewTS8Pcw==", + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" }, "dependencies": { - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } }, - "ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", - "dev": true - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true - }, - "env-paths": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", - "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==", - "dev": true + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } }, - "err-code": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", - "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=", + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", "dev": true }, - "errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", "dev": true, "requires": { - "prr": "~1.0.1" + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" } }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", "dev": true, "requires": { - "is-arrayish": "^0.2.1" + "buffer-indexof": "^1.0.0" } }, - "es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" + "esutils": "^2.0.2" } }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dom-accessibility-api": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.6.tgz", + "integrity": "sha512-DplGLZd8L1lN64jlT27N9TVSESFR5STaEJvX+thCby7fuCHonfPpAlodYc3vuUYbDuDec5w8AMP7oCM5TWFsqw==", + "dev": true + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", "dev": true, "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" + "utila": "~0.4" } }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "requires": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", "dev": true, "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true + } } }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", "dev": true }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", "dev": true }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true + } + } }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", "dev": true, "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "domelementtype": "1" } }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", "dev": true, "requires": { - "estraverse": "^5.2.0" + "no-case": "^3.0.4", + "tslib": "^2.0.3" }, "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", "dev": true } } }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", "dev": true }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", "dev": true }, - "events": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", - "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, - "eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "dev": true, "requires": { - "original": "^1.0.0" + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "dev": true, "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "ejs": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.719", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.719.tgz", + "integrity": "sha512-heM78GKSqrIzO9Oz0/y22nTBN7bqSP1Pla2SyU9DiSnQD+Ea9SyyN5RWWlgqsqeBLNDkSlE9J9EHFmdMPzxB/g==", + "dev": true + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "dev": true, "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.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" + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" }, "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "emittery": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", + "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "once": "^1.4.0" } }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", "dev": true, "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" }, "dependencies": { - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dev": true, - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - } - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - } - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "mime-db": { - "version": "1.45.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", - "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, - "mime-types": { - "version": "2.1.28", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", - "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", "dev": true, "requires": { - "mime-db": "1.45.0" + "errno": "^0.1.3", + "readable-stream": "^2.0.1" } }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "dev": true - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "setprototypeof": { + "string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "safe-buffer": "~5.1.0" } } } }, - "ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "error-stack-parser": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", + "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", + "dev": true, + "requires": { + "stackframe": "^1.1.1" + } + }, + "es-abstract": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", + "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.2", + "is-string": "^1.0.5", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.0" + } + }, + "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": { - "type": "^2.0.0" - }, - "dependencies": { - "type": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", - "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==", - "dev": true - } + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "dev": true, + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "dev": true, "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" } }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", "dev": true, "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } + "d": "^1.0.1", + "ext": "^1.1.2" } }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", "dev": true, "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" }, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" } }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" } }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "prelude-ls": "~1.1.2" } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true } } }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "eslint": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.24.0.tgz", + "integrity": "sha512-k9gaHeHiFmGCDQ2rEfvULlSLruz6tgfA8DEn+rY9/oYPFFTlz55mM/Q/Rij1b2Y42jwZiK3lXvNTw6w6TXzcKQ==", "dev": true, "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash": "^4.17.21", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.4", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" }, "dependencies": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, "requires": { - "fill-range": "^7.0.1" + "@babel/highlight": "^7.10.4" } }, - "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==", + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { - "to-regex-range": "^5.0.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "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==", + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { - "is-glob": "^4.0.1" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.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==", + "globals": { + "version": "13.8.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.8.0.tgz", + "integrity": "sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q==", "dev": true, "requires": { - "is-extglob": "^2.1.1" + "type-fest": "^0.20.2" } }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", - "dev": true - }, - "fastq": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.0.tgz", - "integrity": "sha512-NL2Qc5L3iQEsyYzweq7qfgy5OtXCmGzGvhElGEd/SoFWEMOEczNh5s5ocaF01HDetxz+p8ecjNPA6cZxxIHmzA==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "figgy-pudding": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", - "dev": true - }, - "figures": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.0.0.tgz", - "integrity": "sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "shebang-regex": "^3.0.0" } }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "isexe": "^2.0.0" } } } }, - "file-saver": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-1.3.3.tgz", - "integrity": "sha1-zdTETTqiZOrC9o7BZbx5HDSvEjI=" - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "eslint-config-react-app": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-6.0.0.tgz", + "integrity": "sha512-bpoAAC+YRfzq0dsTk+6v9aHm/uqnDwayNAXleMypGl6CpxI9oXXscVHo4fk3eJPIn+rsbtNetB4r/ZIidFIE8A==", "dev": true, - "optional": true - }, - "filesize": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", - "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", - "dev": true + "requires": { + "confusing-browser-globals": "^1.0.10" + } }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" + "debug": "^2.6.9", + "resolve": "^1.13.1" }, "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "ms": "2.0.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "eslint-module-utils": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", "dev": true, "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" + "debug": "^2.6.9", + "pkg-dir": "^2.0.0" }, "dependencies": { - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } } } }, - "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "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" - } - }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, - "flush-write-stream": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", - "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", + "eslint-plugin-flowtype": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.7.1.tgz", + "integrity": "sha512-RsurlNszyKLIHJvw6J4C98ubTTsLlgzL5xYqQ6ZTV5d2E2iHIR744SxoU3o7yQf0HjIe0GwnAIxpD+g0IV+emg==", "dev": true, "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" + "lodash": "^4.17.15", + "string-natural-compare": "^3.0.1" } }, - "follow-redirects": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.2.tgz", - "integrity": "sha512-6mPTgLxYm3r6Bkkg0vNM0HTjfGrOEtsfbhagQvbxDEsEkpNhw582upBaoRZylzen6krEmxXJgt9Ju6HiI4O7BA==", - "dev": true - }, - "font-awesome": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz", - "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM=" - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "eslint-plugin-import": { + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", + "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", "dev": true, "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "array-includes": "^3.1.1", + "array.prototype.flat": "^1.2.3", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.4", + "eslint-module-utils": "^2.6.0", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.1", + "read-pkg-up": "^2.0.0", + "resolve": "^1.17.0", + "tsconfig-paths": "^3.9.0" }, "dependencies": { - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "dev": true, "requires": { - "delayed-stream": "~1.0.0" + "esutils": "^2.0.2", + "isarray": "^1.0.0" } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true - }, - "fraction.js": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.0.13.tgz", - "integrity": "sha512-E1fz2Xs9ltlUp+qbiyx9wmt2n9dRzPsS11Jtdb8D2o+cC7wr9xkkKsVKJuBX0ST+LVS+LhLO+SbLJNtfWcJvXA==", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "eslint-plugin-jest": { + "version": "24.3.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.3.5.tgz", + "integrity": "sha512-XG4rtxYDuJykuqhsOqokYIR84/C8pRihRtEpVskYLbIIKGwPNW2ySxdctuVzETZE+MbF/e7wmsnbNVpzM0rDug==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "@typescript-eslint/experimental-utils": "^4.0.1" } }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "eslint-plugin-jsx-a11y": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz", + "integrity": "sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg==", "dev": true, "requires": { - "minipass": "^3.0.0" + "@babel/runtime": "^7.11.2", + "aria-query": "^4.2.2", + "array-includes": "^3.1.1", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.0.2", + "axobject-query": "^2.2.0", + "damerau-levenshtein": "^1.0.6", + "emoji-regex": "^9.0.0", + "has": "^1.0.3", + "jsx-ast-utils": "^3.1.0", + "language-tags": "^1.0.5" + }, + "dependencies": { + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + } } }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "eslint-plugin-react": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.23.2.tgz", + "integrity": "sha512-AfjgFQB+nYszudkxRkTFu0UR1zEQig0ArVMPloKhxwlwkzaw/fBiH0QWcBBhZONlXqQC51+nfqFrkn4EzHcGBw==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" + "array-includes": "^3.1.3", + "array.prototype.flatmap": "^1.2.4", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.0.4", + "object.entries": "^1.1.3", + "object.fromentries": "^2.0.4", + "object.values": "^1.1.3", + "prop-types": "^15.7.2", + "resolve": "^2.0.0-next.3", + "string.prototype.matchall": "^4.0.4" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "resolve": { + "version": "2.0.0-next.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", + "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + } } }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "eslint-plugin-react-hooks": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz", + "integrity": "sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==", "dev": true }, - "fsevents": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.1.tgz", - "integrity": "sha512-YR47Eg4hChJGAB1O3yEAOkGO+rlzutoICGqGo9EZ4lKWokzZRSyIW1QmTzqjtw8MJdj9srP869CuWw/hyzSiBw==", + "eslint-plugin-testing-library": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-3.10.2.tgz", + "integrity": "sha512-WAmOCt7EbF1XM8XfbCKAEzAPnShkNSwcIsAD2jHdsMUT9mZJPjLCG7pMzbcC8kK366NOuGip8HKLDC+Xk4yIdA==", "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "requires": { + "@typescript-eslint/experimental-utils": "^3.10.1" + }, + "dependencies": { + "@typescript-eslint/experimental-utils": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz", + "integrity": "sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/typescript-estree": "3.10.1", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + } + }, + "@typescript-eslint/types": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz", + "integrity": "sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz", + "integrity": "sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==", + "dev": true, + "requires": { + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/visitor-keys": "3.10.1", + "debug": "^4.1.1", + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz", + "integrity": "sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" } }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-intrinsic": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.2.tgz", - "integrity": "sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg==", + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" + "eslint-visitor-keys": "^1.1.0" }, "dependencies": { - "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==", + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true } } }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "eslint-visitor-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", + "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "dev": true + }, + "eslint-webpack-plugin": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-2.5.4.tgz", + "integrity": "sha512-7rYh0m76KyKSDE+B+2PUQrlNS4HJ51t3WKpkJg6vo2jFMbEPTG99cBV0Dm7LXSHucN4WGCG65wQcRiTFrj7iWw==", "dev": true, "requires": { - "pump": "^3.0.0" + "@types/eslint": "^7.2.6", + "arrify": "^2.0.1", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "normalize-path": "^3.0.0", + "schema-utils": "^3.0.0" }, "dependencies": { - "pump": { + "schema-utils": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", "dev": true, "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" } } } }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "dev": true, "requires": { - "assert-plus": "^1.0.0" + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } } }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": 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==", + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "eventsource": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", + "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", "dev": true, "requires": { - "is-glob": "^4.0.1" + "original": "^1.0.0" } }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } }, - "globby": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz", - "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==", + "exec-sh": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", + "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==", + "dev": true + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - }, - "dependencies": { - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - } + "cross-spawn": "^6.0.0", + "get-stream": "^4.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" } }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "dev": true }, - "gzip-size": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.0.tgz", - "integrity": "sha512-wfSnvypBDRW94v5W3ckvvz/zFUNdJ81VgOP6tE4bPpRUcc0wGqU+y0eZjJEvKxwubJFix6P84sE8M51YWLT7rQ==", + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "duplexer": "^0.1.1", - "pify": "^4.0.1" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } }, - "handle-thing": { - "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 - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true + "expect": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "ansi-styles": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0" + } }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", "dev": true, "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" }, "dependencies": { - "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "ms": "2.0.0" } }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", "dev": true }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", "dev": true - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } } } }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-binary2": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", "dev": true, "requires": { - "isarray": "2.0.1" + "type": "^2.0.0" }, "dependencies": { - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "type": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", + "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==", "dev": true } } }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", - "dev": true - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" - }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", - "dev": true - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } } }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "is-descriptor": "^1.0.0" } }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-extendable": "^0.1.0" } - } - } - }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "kind-of": "^6.0.0" } }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "safe-buffer": "~5.2.0" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } - } - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hex-color-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", - "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "homedir-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", - "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hoopy": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", - "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", - "dev": true - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "hsl-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", - "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", - "dev": true - }, - "hsla-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", - "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", - "dev": true + } + } }, - "html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", "dev": true }, - "html-entities": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", - "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", - "dev": true + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + "fast-glob": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", + "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + } }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, - "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "fastq": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", + "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", "dev": true, "requires": { - "depd": "1.1.1", - "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": ">= 1.3.1 < 2" - }, - "dependencies": { - "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", - "dev": true - } + "reusify": "^1.0.4" } }, - "http-parser-js": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", - "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", "dev": true }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "dependencies": { - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - } + "flat-cache": "^3.0.4" } }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "file-loader": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.1.1.tgz", + "integrity": "sha512-Klt8C4BjWSXYQAfhpYYkG4qHNTna4toMHEbWrI5IuVoxbU6uiDKeKAP99R8mmbJi3lvewn/jQBOgU4+NS3tDQw==", "dev": true, "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" }, "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", "dev": true, "requires": { - "ms": "2.1.2" + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true } } }, - "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "file-saver": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", + "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", "dev": true, - "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" - } + "optional": true }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "filesize": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.1.0.tgz", + "integrity": "sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "to-regex-range": "^5.0.1" } }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true + "filter-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", + "integrity": "sha1-mzERErxsYSehbgFsbF1/GeCAXFs=" }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "dev": true, "requires": { - "agent-base": "6", - "debug": "4" + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" }, "dependencies": { "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "ms": "2.1.2" + "ms": "2.0.0" } }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } }, - "humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", "dev": true, "requires": { - "ms": "^2.0.0" + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" } }, - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", - "dev": true, - "optional": true - }, - "icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - }, - "ignore-walk": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "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": { - "minimatch": "^3.0.4" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, - "image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", - "dev": true, - "optional": true - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" + "flatted": "^3.1.0", + "rimraf": "^3.0.2" } }, - "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==", + "flatted": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", + "dev": true + }, + "flatten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", + "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", "dev": true, "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" }, "dependencies": { - "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==", + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "requires": { - "find-up": "^3.0.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } - } - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "follow-redirects": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", + "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==", "dev": true }, - "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, - "inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "fork-ts-checker-webpack-plugin": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz", + "integrity": "sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==", "dev": true, "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" + "@babel/code-frame": "^7.5.5", + "chalk": "^2.4.1", + "micromatch": "^3.1.10", + "minimatch": "^3.0.4", + "semver": "^5.6.0", + "tapable": "^1.0.0", + "worker-rpc": "^0.1.0" }, "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "^2.0.1" + "color-convert": "^1.9.0" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { - "color-name": "~1.1.4" + "color-name": "1.1.3" } }, "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "has-flag": { + "fill-range": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } }, - "is-fullwidth-code-point": { + "has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "tslib": "^1.9.0" + "kind-of": "^3.0.2" }, "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } } } }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "has-flag": "^3.0.0" } }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "requires": { - "ansi-regex": "^5.0.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "has-flag": "^4.0.0" + "safe-buffer": "~5.1.0" } } } }, - "internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" } }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, - "ipaddr.js": { - "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==", + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true }, - "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", "requires": { - "kind-of": "^3.0.2" + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" } }, - "is-arguments": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", - "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", - "dev": true, - "requires": { - "call-bind": "^1.0.0" - } + "get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "requires": { - "binary-extensions": "^2.0.0" + "pump": "^3.0.0" } }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", "dev": true }, - "is-color-stop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", - "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, "requires": { - "css-color-names": "^0.0.4", - "hex-color-regex": "^1.1.0", - "hsl-regex": "^1.0.0", - "hsla-regex": "^1.0.0", - "rgb-regex": "^1.0.1", - "rgba-regex": "^1.0.0" + "assert-plus": "^1.0.0" } }, - "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { - "has": "^1.0.3" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { - "kind-of": "^3.0.2" + "is-glob": "^4.0.1" } }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", - "dev": true + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" + } }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", "dev": true, "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" } }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, - "is-docker": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", - "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", - "dev": true + "globby": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", + "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", "dev": true }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true, + "optional": true }, - "is-fullwidth-code-point": { + "gud": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } + "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", + "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" }, - "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==", + "gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", "dev": true, "requires": { - "is-extglob": "^2.1.1" + "duplexer": "^0.1.1", + "pify": "^4.0.1" } }, - "is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "handle-thing": { + "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 }, - "is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", "dev": true }, - "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "harmony-reflect": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==", "dev": true }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "requires": { - "kind-of": "^3.0.2" + "function-bind": "^1.1.1" } }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", "dev": true }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, "requires": { - "is-path-inside": "^2.1.0" + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" } }, - "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, "requires": { - "path-is-inside": "^1.0.2" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", "dev": true, "requires": { - "isobject": "^3.0.1" + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } } }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dev": true, "requires": { - "has": "^1.0.1" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" } }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, - "is-stream": { + "hex-color-regex": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", "dev": true }, - "is-svg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", - "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", - "dev": true, + "history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", "requires": { - "html-comment-regex": "^1.1.0" + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" } }, - "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "dev": true, "requires": { - "has-symbols": "^1.0.0" + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "requires": { + "react-is": "^16.7.0" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } }, - "is-what": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.12.0.tgz", - "integrity": "sha512-2ilQz5/f/o9V7WRWJQmpFYNmQFZ9iM+OXRonZKcYgTkCzjb949Vi4h282PD1UfmgHk666rcWonbRJ++KI41VGw==", + "hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", "dev": true }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } }, - "isarray": { + "hsl-regex": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", "dev": true }, - "isbinaryfile": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.6.tgz", - "integrity": "sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg==", + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", "dev": true }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.5" + } }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", "dev": true }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" + "html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", + "dev": true, + "requires": { + "camel-case": "^4.1.1", + "clean-css": "^4.2.3", + "commander": "^4.1.1", + "he": "^1.2.0", + "param-case": "^3.0.3", + "relateurl": "^0.2.7", + "terser": "^4.6.3" + } }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "html-webpack-plugin": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz", + "integrity": "sha512-MouoXEYSjTzCrjIxWwg8gxL5fE2X2WZJLmBYXlaJhQUH5K/b5OrqmV7T4dB7iu0xkmJ6JlUuV6fFVtnqbPopZw==", + "dev": true, "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" + "@types/html-minifier-terser": "^5.0.0", + "@types/tapable": "^1.0.5", + "@types/webpack": "^4.41.8", + "html-minifier-terser": "^5.0.1", + "loader-utils": "^1.2.3", + "lodash": "^4.17.15", + "pretty-error": "^2.1.1", + "tapable": "^1.1.3", + "util.promisify": "1.0.0" }, "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } } } }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" }, "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true } } }, - "istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", + "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", + "dev": true + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-1.3.1.tgz", + "integrity": "sha512-13eVVDYS4z79w7f1+NPllJtOQFx/FdUW4btIvVRMaRlUY9VGstAbo5MOhLEuUgZFRHn3x50ufn25zkj/boZnEg==", "dev": true, "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" + "@types/http-proxy": "^1.17.5", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" }, "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", "dev": true } } }, - "istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, - "jasmine-core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.6.0.tgz", - "integrity": "sha512-8uQYa7zJN8hq9z+g8z1bqCfdC8eoDAeVnM5sfqs7KHv9/ifoJ500m018fpFc7RDaO6SWCLCXwo/wPSNcdYTgcw==", + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "dev": true, + "requires": { + "postcss": "^7.0.14" + } + }, + "identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=", + "dev": true, + "requires": { + "harmony-reflect": "^1.4.6" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, + "immer": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/immer/-/immer-8.0.1.tgz", + "integrity": "sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA==", "dev": true }, - "jasmine-marbles": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jasmine-marbles/-/jasmine-marbles-0.5.0.tgz", - "integrity": "sha512-hkSYy7VJpcxaKE48s/CasVpGyheElp5ZegguFi5kpYAaUWsyOko6RnMZS1kv14ThMtlJVNqCW5z16f1q6HqbEg==", + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", "dev": true, "requires": { - "lodash": "^4.5.0" + "import-from": "^2.1.0" } }, - "jasmine-spec-reporter": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-5.0.2.tgz", - "integrity": "sha512-6gP1LbVgJ+d7PKksQBc2H0oDGNRQI3gKUsWlswKaQ2fif9X5gzhQcgM5+kiJGCQVurOG09jqNhk7payggyp5+g==", + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", "dev": true, "requires": { - "colors": "1.4.0" + "resolve-from": "^3.0.0" }, "dependencies": { - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", "dev": true } } }, - "jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", "dev": true, "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" }, "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "requires": { - "has-flag": "^4.0.0" + "find-up": "^4.0.0" } } } }, - "jexl": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/jexl/-/jexl-2.3.0.tgz", - "integrity": "sha512-ecqln4kTWNkMwbFvTukOMDq1jy1GcPzvshhMp/s4pxU86xdLDq7HbDRa87DfMfbSAOS8V6EwvCdfs0S+w/iycA==", - "requires": { - "@babel/runtime": "^7.10.2" - } + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true }, - "js-tokens": { + "indent-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "once": "^1.3.0", + "wrappy": "1" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", "dev": true }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", "dev": true }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "ipaddr.js": { + "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 }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", "dev": true }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arguments": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, - "json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "is-bigint": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", + "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==", "dev": true }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, "requires": { - "minimist": "^1.2.5" + "binary-extensions": "^2.0.0" } }, - "jsonc-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", - "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", + "is-boolean-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", + "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", + "dev": true, + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", "dev": true, "requires": { - "graceful-fs": "^4.1.6" + "ci-info": "^2.0.0" } }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dev": true, + "requires": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", "dev": true, "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } + "has": "^1.0.3" } }, - "karma": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/karma/-/karma-5.0.9.tgz", - "integrity": "sha512-dUA5z7Lo7G4FRSe1ZAXqOINEEWxmCjDBbfRBmU/wYlSMwxUQJP/tEEP90yJt3Uqo03s9rCgVnxtlfq+uDhxSPg==", + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "body-parser": "^1.19.0", - "braces": "^3.0.2", - "chokidar": "^3.0.0", - "colors": "^1.4.0", - "connect": "^3.7.0", - "di": "^0.0.1", - "dom-serialize": "^2.2.1", - "flatted": "^2.0.2", - "glob": "^7.1.6", - "graceful-fs": "^4.2.4", - "http-proxy": "^1.18.1", - "isbinaryfile": "^4.0.6", - "lodash": "^4.17.15", - "log4js": "^6.2.1", - "mime": "^2.4.5", - "minimatch": "^3.0.4", - "qjobs": "^1.2.0", - "range-parser": "^1.2.1", - "rimraf": "^3.0.2", - "socket.io": "^2.3.0", - "source-map": "^0.6.1", - "tmp": "0.2.1", - "ua-parser-js": "0.7.21", - "yargs": "^15.3.1" + "kind-of": "^3.0.2" }, "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "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" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "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" - } - }, - "mime": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.0.tgz", - "integrity": "sha512-ft3WayFSFUVBuJj7BMLKAQcSlItKtfjsKDDsii3rqFDAZ7t11zRe8ASw/GlmivGwVUYtwkQrxiGGpL6gFvB0ag==", - "dev": true - }, - "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" - } - }, - "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 - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "glob": "^7.1.3" + "is-buffer": "^1.1.5" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + } + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "requires": { - "rimraf": "^3.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.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": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "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" - } } } }, - "karma-chrome-launcher": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz", - "integrity": "sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==", + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "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": { - "which": "^1.2.1" + "is-extglob": "^2.1.1" } }, - "karma-cli": { + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", + "dev": true + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-number-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", + "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", + "dev": true + }, + "is-obj": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/karma-cli/-/karma-cli-2.0.0.tgz", - "integrity": "sha512-1Kb28UILg1ZsfqQmeELbPzuEb5C6GZJfVIk0qOr8LNYQuYWmAaqP16WpbpKEjhejDrDYyYOwwJXSZO6u7q5Pvw==", - "dev": true, - "requires": { - "resolve": "^1.3.3" - } + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true }, - "karma-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.0.3.tgz", - "integrity": "sha512-atDvLQqvPcLxhED0cmXYdsPMCQuh6Asa9FMZW1bhNqlVEhJoB9qyZ2BY1gu7D/rr5GLGb5QzYO4siQskxaWP/g==", + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, "requires": { - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.1", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.0", - "minimatch": "^3.0.4" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "requires": { - "ms": "2.1.2" - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } + "is-path-inside": "^2.1.0" } }, - "karma-coverage-istanbul-reporter": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-3.0.3.tgz", - "integrity": "sha512-wE4VFhG/QZv2Y4CdAYWDbMmcAHeS926ZIji4z+FkB2aF/EposRb6DP6G5ncT/wXhqUfAb/d7kZrNKPonbvsATw==", + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", "dev": true, "requires": { - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^3.0.6", - "istanbul-reports": "^3.0.2", - "minimatch": "^3.0.4" + "path-is-inside": "^1.0.2" } }, - "karma-jasmine": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-4.0.1.tgz", - "integrity": "sha512-h8XDAhTiZjJKzfkoO1laMH+zfNlra+dEQHUAjpn5JV1zCPtOIVWGQjLBrqhnzQa/hrU2XrZwSyBa6XjEBzfXzw==", + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { - "jasmine-core": "^3.6.0" - }, - "dependencies": { - "jasmine-core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.6.0.tgz", - "integrity": "sha512-8uQYa7zJN8hq9z+g8z1bqCfdC8eoDAeVnM5sfqs7KHv9/ifoJ500m018fpFc7RDaO6SWCLCXwo/wPSNcdYTgcw==", - "dev": true - } + "isobject": "^3.0.1" } }, - "karma-jasmine-html-reporter": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.5.4.tgz", - "integrity": "sha512-PtilRLno5O6wH3lDihRnz0Ba8oSn0YUJqKjjux1peoYGwo0AQqrWRbdWk/RLzcGlb+onTyXAnHl6M+Hu3UxG/Q==", + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", "dev": true }, - "karma-source-map-support": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", - "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", - "dev": true, + "is-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", "requires": { - "source-map-support": "^0.5.5" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - } + "call-bind": "^1.0.2", + "has-symbols": "^1.0.1" } }, - "karma-spec-reporter": { - "version": "0.0.32", - "resolved": "https://registry.npmjs.org/karma-spec-reporter/-/karma-spec-reporter-0.0.32.tgz", - "integrity": "sha1-LpxyB+pyZ3EmAln4K+y1QyCeRAo=", + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "dev": true + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", "dev": true, "requires": { - "colors": "^1.1.2" + "has-symbols": "^1.0.1" } }, - "killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-docker": "^2.0.0" } }, - "klona": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", - "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==", + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, - "less": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/less/-/less-4.1.0.tgz", - "integrity": "sha512-w1Ag/f34g7LwtQ/sMVSGWIyZx+gG9ZOAEtyxeX1fG75is6BMyC2lD5kG+1RueX7PkAvlQBm2Lf2aN2j0JbVr2A==", + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", "dev": true, "requires": { - "copy-anything": "^2.0.1", - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "make-dir": "^2.1.0", - "mime": "^1.4.1", - "needle": "^2.5.2", - "parse-node-version": "^1.0.1", - "source-map": "~0.6.0", - "tslib": "^1.10.0" + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" }, "dependencies": { - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "optional": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "optional": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, - "less-loader": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-7.3.0.tgz", - "integrity": "sha512-Mi8915g7NMaLlgi77mgTTQvK022xKRQBIVDSyfl3ErTuBhmZBQab0mjeJjNNqGbdR+qrfTleKXqbGI4uEFavxg==", + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dev": true, "requires": { - "klona": "^2.0.4", - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" }, "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "semver": "^6.0.0" } }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "license-webpack-plugin": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.3.11.tgz", - "integrity": "sha512-0iVGoX5vx0WDy8dmwTTpOOMYiGqILyUbDeVMFH52AjgBlS58lHwOlFMSoqg5nY8Kxl6+FRKyUZY/UdlQaOyqDw==", - "dev": true, - "requires": { - "@types/webpack-sources": "^0.1.5", - "webpack-sources": "^1.2.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } } } }, - "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 - }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true - }, - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", "dev": true, "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" } }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", "dev": true, "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" } }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" - }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", - "dev": true + "jest": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.0.tgz", + "integrity": "sha512-jxTmrvuecVISvKFFhOkjsWRZV7sFqdSUAd1ajOKY+/QE/aLBVstsJ/dX8GczLzwiT6ZEwwmZqtCUHLHHQVzcfA==", + "dev": true, + "requires": { + "@jest/core": "^26.6.0", + "import-local": "^3.0.2", + "jest-cli": "^26.6.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "jest-cli": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", + "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", + "dev": true, + "requires": { + "@jest/core": "^26.6.3", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^26.6.3", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "prompts": "^2.0.1", + "yargs": "^15.4.1" + } + } + } }, - "log-symbols": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", - "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "jest-changed-files": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", + "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", "dev": true, "requires": { - "chalk": "^4.0.0" + "@jest/types": "^26.6.2", + "execa": "^4.0.0", + "throat": "^5.0.0" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { - "color-convert": "^2.0.1" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, - "chalk": { + "execa": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", "dev": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, "requires": { - "color-name": "~1.1.4" + "pump": "^3.0.0" } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", "dev": true }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "requires": { - "has-flag": "^4.0.0" + "path-key": "^3.0.0" } - } - } - }, - "log4js": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.3.0.tgz", - "integrity": "sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw==", - "dev": true, - "requires": { - "date-format": "^3.0.0", - "debug": "^4.1.1", - "flatted": "^2.0.1", - "rfdc": "^1.1.4", - "streamroller": "^2.2.4" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "ms": "2.1.2" + "shebang-regex": "^3.0.0" } }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } } } }, - "loglevel": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", - "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", - "dev": true - }, - "magic-string": { - "version": "0.25.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", - "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "jest-circus": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-26.6.0.tgz", + "integrity": "sha512-L2/Y9szN6FJPWFK8kzWXwfp+FOR7xq0cUL4lIsdbIdwz3Vh6P1nrpcqOleSzr28zOtSHQNV9Z7Tl+KkuK7t5Ng==", "dev": true, "requires": { - "sourcemap-codec": "^1.4.4" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.0", + "@jest/test-result": "^26.6.0", + "@jest/types": "^26.6.0", + "@types/babel__traverse": "^7.0.4", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^26.6.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.0", + "jest-matcher-utils": "^26.6.0", + "jest-message-util": "^26.6.0", + "jest-runner": "^26.6.0", + "jest-runtime": "^26.6.0", + "jest-snapshot": "^26.6.0", + "jest-util": "^26.6.0", + "pretty-format": "^26.6.0", + "stack-utils": "^2.0.2", + "throat": "^5.0.0" }, "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } } } }, - "make-error": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.0.tgz", - "integrity": "sha1-Uq06M5zPEM5itAQLcI/nByRLi5Y=", - "dev": true - }, - "make-fetch-happen": { - "version": "8.0.13", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-8.0.13.tgz", - "integrity": "sha512-rQ5NijwwdU8tIaBrpTtSVrNCcAJfyDRcKBC76vOQlyJX588/88+TE+UpjWl4BgG7gCkp29wER7xcRqkeg+x64Q==", + "jest-config": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", + "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", "dev": true, "requires": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.0.5", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "promise-retry": "^1.1.1", - "socks-proxy-agent": "^5.0.0", - "ssri": "^8.0.0" + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.6.3", + "@jest/types": "^26.6.2", + "babel-jest": "^26.6.3", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.6.2", + "jest-environment-node": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.6.3", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2" }, "dependencies": { - "cacache": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", - "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.0", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" } }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "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": { - "yallist": "^4.0.0" + "@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 + } } }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "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": { - "glob": "^7.1.3" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" } - }, - "ssri": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", - "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", + } + } + }, + "jest-diff": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { - "minipass": "^3.1.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } } }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "jest-docblock": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", + "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", "dev": true, "requires": { - "object-visit": "^1.0.0" + "detect-newline": "^3.0.0" } }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "jest-each": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", + "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", "dev": true, "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2" }, "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } } } }, - "mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", - "dev": true - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true + "jest-environment-jsdom": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", + "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", + "dev": true, + "requires": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2", + "jsdom": "^16.4.0" + } }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "jest-environment-node": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", + "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", "dev": true, "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" } }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", "dev": true }, - "merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "jest-haste-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", "dev": true, "requires": { - "source-map": "^0.6.1" + "@jest/types": "^26.6.2", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.1.2", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" + } + }, + "jest-jasmine2": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", + "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^26.6.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2", + "throat": "^5.0.0" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } } } }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true + "jest-leak-detector": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", + "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", + "dev": true, + "requires": { + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + } }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "jest-matcher-utils": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", + "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "chalk": "^4.0.0", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" }, "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } } } }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "jest-message-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", "dev": true, "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" }, "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } } } }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "jest-mock": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", + "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*" + } + }, + "jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", "dev": true }, - "mime-db": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", - "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", + "jest-regex-util": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", "dev": true }, - "mime-types": { - "version": "2.1.17", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", - "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "jest-resolve": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.0.tgz", + "integrity": "sha512-tRAz2bwraHufNp+CCmAD8ciyCpXCs1NQxB5EJAmtCFy6BN81loFEGWKzYu26Y62lAJJe4X4jg36Kf+NsQyiStQ==", "dev": true, "requires": { - "mime-db": "~1.30.0" + "@jest/types": "^26.6.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.0", + "read-pkg-up": "^7.0.1", + "resolve": "^1.17.0", + "slash": "^3.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "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" + } + } } }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true + "jest-resolve-dependencies": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", + "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.6.2" + } }, - "mini-css-extract-plugin": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.3.3.tgz", - "integrity": "sha512-7lvliDSMiuZc81kI+5/qxvn47SCM7BehXex3f2c6l/pR3Goj58IQxZh9nuPQ3AkGQgoETyXuIqLDaO5Oa0TyBw==", + "jest-runner": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", + "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", "dev": true, "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0", - "webpack-sources": "^1.1.0" + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.7.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-docblock": "^26.0.0", + "jest-haste-map": "^26.6.2", + "jest-leak-detector": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "source-map-support": "^0.5.6", + "throat": "^5.0.0" }, "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", "dev": true, "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "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 + } + } }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "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": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" } } } }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true + "jest-runtime": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", + "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/globals": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0", + "cjs-module-lexer": "^0.6.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.4.1" + }, + "dependencies": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "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" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + } + } }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true + "jest-serializer": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", + "dev": true, + "requires": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + } }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "jest-snapshot": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", + "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", + "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "@babel/types": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.0.0", + "chalk": "^4.0.0", + "expect": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-haste-map": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "natural-compare": "^1.4.0", + "pretty-format": "^26.6.2", + "semver": "^7.3.2" + }, + "dependencies": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "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" + } + } } }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { - "yallist": "^4.0.0" + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" }, "dependencies": { - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } } } }, - "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "jest-validate": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", + "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", "dev": true, "requires": { - "minipass": "^3.0.0" + "@jest/types": "^26.6.2", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "leven": "^3.1.0", + "pretty-format": "^26.6.2" }, "dependencies": { - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { - "yallist": "^4.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } } }, - "minipass-fetch": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.3.3.tgz", - "integrity": "sha512-akCrLDWfbdAWkMLBxJEeWTdNsjML+dt5YgOI4gJ53vuO0vrmYQkUPxa6j6V65s9CcePIr2SSWqjT2EcrNseryQ==", + "jest-watch-typeahead": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.6.1.tgz", + "integrity": "sha512-ITVnHhj3Jd/QkqQcTqZfRgjfyRhDFM/auzgVo2RKvSwi18YMvh0WvXDJFoFED6c7jd/5jxtu4kSOb9PTu2cPVg==", "dev": true, "requires": { - "encoding": "^0.1.12", - "minipass": "^3.1.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" + "ansi-escapes": "^4.3.1", + "chalk": "^4.0.0", + "jest-regex-util": "^26.0.0", + "jest-watcher": "^26.3.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } } }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "jest-watcher": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", + "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", "dev": true, "requires": { - "minipass": "^3.0.0" + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^26.6.2", + "string-length": "^4.0.1" }, "dependencies": { - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { - "yallist": "^4.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } } }, - "minipass-json-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", - "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "dev": true, "requires": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" } }, - "minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "requires": { - "minipass": "^3.0.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsdom": { + "version": "16.5.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.5.3.tgz", + "integrity": "sha512-Qj1H+PEvUsOtdPJ056ewXM4UJPCi4hhLA8wpiz9F2YvsRBhuFsXxtrIFAgGBDynQA9isAMGE91PfUYbdMPXuTA==", + "dev": true, + "requires": { + "abab": "^2.0.5", + "acorn": "^8.1.0", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "html-encoding-sniffer": "^2.0.1", + "is-potential-custom-element-name": "^1.0.0", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "request": "^2.88.2", + "request-promise-native": "^1.0.9", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.4", + "xml-name-validator": "^3.0.0" }, "dependencies": { - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "acorn": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.1.1.tgz", + "integrity": "sha512-xYiIVjNuqtKXMxlRMDc6mZUhXehod4a3gbZ1qRlM7icK4EbxUFNLhWoPblCvFtB2Y9CIqHP3CF/rdxLItaQv8g==", "dev": true } } }, - "minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-compare": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/json-schema-compare/-/json-schema-compare-0.2.2.tgz", + "integrity": "sha512-c4WYmDKyJXhs7WWvAWm3uIYnfyWFoIp+JEoX34rctVvEkMYCPGhXtvmFFXiffBbxfZsvQ0RNnV5H7GvDF5HCqQ==", + "requires": { + "lodash": "^4.17.4" + } + }, + "json-schema-merge-allof": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/json-schema-merge-allof/-/json-schema-merge-allof-0.6.0.tgz", + "integrity": "sha512-LEw4VMQVRceOPLuGRWcxW5orTTiR9ZAtqTAe4rQUjNADTeR81bezBVFa0MqIwp0YmHIM1KkhSjZM7o+IQhaPbQ==", + "requires": { + "compute-lcm": "^1.1.0", + "json-schema-compare": "^0.2.2", + "lodash": "^4.17.4" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", "dev": true, "requires": { - "minipass": "^3.0.0" + "minimist": "^1.2.5" } }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "dependencies": { - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" } }, - "mississippi": { + "jsonpointer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.1.0.tgz", + "integrity": "sha512-CXcRvMyTlnR53xMcKnuMzfCA5i/nfblTnnr74CZb6C4vG39eu6w51t7nKmU5MfLfbTgGItliNyjO/ciNPDqClg==" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jsx-ast-utils": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz", + "integrity": "sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q==", + "dev": true, + "requires": { + "array-includes": "^3.1.2", + "object.assign": "^4.1.2" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "klona": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", + "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==", + "dev": true + }, + "language-subtag-registry": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz", + "integrity": "sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==", + "dev": true + }, + "language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=", + "dev": true, + "requires": { + "language-subtag-registry": "~0.3.2" + } + }, + "last-call-webpack-plugin": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", "dev": true, "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } + "lodash": "^4.17.5", + "webpack-sources": "^1.1.0" + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" } }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "dev": true, "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" }, "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "is-plain-object": "^2.0.4" + "error-ex": "^1.2.0" } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true } } }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", "dev": true, "requires": { - "minimist": "^1.2.5" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" } }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "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": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" + "p-locate": "^4.1.0" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", - "dev": true, - "requires": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - } + "lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", "dev": true }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", "dev": true }, - "nan": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", - "dev": true, - "optional": true + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" }, - "nanoid": { - "version": "3.1.20", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", - "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", "dev": true }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" } }, - "ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", "dev": true }, - "needle": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.6.0.tgz", - "integrity": "sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg==", + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "loglevel": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", + "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", "dev": true, - "optional": true, "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" + "tslib": "^2.0.3" }, "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "optional": true + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "dev": true } } }, - "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", - "dev": true + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "lz-string": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", + "integrity": "sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=", "dev": true }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true + "magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } }, - "ngx-infinite-scroll": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/ngx-infinite-scroll/-/ngx-infinite-scroll-7.2.0.tgz", - "integrity": "sha512-EcqjKpU1ukRV3YXOW8cTVtbzPpa9UPaRtYBCg0ZQH3ceCDm+xzLbd4pXy6oKAIN4zN1r/pyGuf5XOJkA8vr6yg==", + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, "requires": { - "opencollective-postinstall": "^2.0.2" + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, - "ngx-schema-form": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/ngx-schema-form/-/ngx-schema-form-2.6.0.tgz", - "integrity": "sha512-+RuWhI9ZhHtlNYfZDj/q7+IEFH1xeTi0XsQHUzh5vz/vWhGth6iQke0GaKUYvZup8ukz8tnQC8eFOPPzZC9VCw==", + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, "requires": { - "tslib": "^2.0.0" + "tmpl": "1.0.x" } }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, - "node-forge": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", - "dev": true + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "dev": true, "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" }, "dependencies": { - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "inherits": "2.0.3" + "safe-buffer": "~5.1.0" } } } }, - "node-releases": { - "version": "1.1.70", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.70.tgz", - "integrity": "sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw==", + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", "dev": true }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true }, - "normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", "dev": true }, - "npm-bundled": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", - "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "microevent.ts": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", + "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { - "npm-normalize-package-bin": "^1.0.1" + "braces": "^3.0.1", + "picomatch": "^2.2.3" } }, - "npm-install-checks": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz", - "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==", + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dev": true, "requires": { - "semver": "^7.1.1" + "bn.js": "^4.0.0", + "brorand": "^1.0.1" }, "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } }, - "npm-normalize-package-bin": { + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", + "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==", + "dev": true + }, + "mime-types": { + "version": "2.1.30", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", + "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", + "dev": true, + "requires": { + "mime-db": "1.47.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "min-indent": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true }, - "npm-package-arg": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.0.tgz", - "integrity": "sha512-/ep6QDxBkm9HvOhOg0heitSd7JHA1U7y1qhhlRlteYYAi9Pdb/ZV7FW5aHpkrpM8+P+4p/jjR8zCyKPBMBjSig==", + "mini-create-react-context": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz", + "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==", + "requires": { + "@babel/runtime": "^7.12.1", + "tiny-warning": "^1.0.3" + } + }, + "mini-css-extract-plugin": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.11.3.tgz", + "integrity": "sha512-n9BA8LonkOkW1/zn+IbLPQmovsL0wMb9yx75fMJQZf2X1Zoec9yTZtyMePcyu19wPkmFbzZZA6fLTotpFhQsOA==", "dev": true, "requires": { - "hosted-git-info": "^3.0.6", - "semver": "^7.0.0", - "validate-npm-package-name": "^3.0.0" + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" }, "dependencies": { - "hosted-git-info": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz", - "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==", + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "minimist": "^1.2.0" } }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", "dev": true, "requires": { - "yallist": "^4.0.0" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" } }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } } }, - "npm-packlist": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.1.4.tgz", - "integrity": "sha512-Qzg2pvXC9U4I4fLnUrBmcIT4x0woLtUgxUi9eC+Zrcv1Xx5eamytGAfbDWQ67j7xOcQ2VW1I3su9smVTIdu7Hw==", + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "glob": "^7.1.6", - "ignore-walk": "^3.0.3", - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } + "brace-expansion": "^1.1.7" } }, - "npm-pick-manifest": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.0.tgz", - "integrity": "sha512-ygs4k6f54ZxJXrzT0x34NybRlLeZ4+6nECAIbr2i0foTnijtS1TJiyzpqtuUAJOps/hO0tNDr8fRV5g+BtRlTw==", + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", "dev": true, "requires": { - "npm-install-checks": "^4.0.0", - "npm-package-arg": "^8.0.0", - "semver": "^7.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } + "yallist": "^4.0.0" + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" } }, - "npm-registry-fetch": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-9.0.0.tgz", - "integrity": "sha512-PuFYYtnQ8IyVl6ib9d3PepeehcUeHN9IO5N/iCRhyg9tStQcqGQBRVHmfmMWPDERU3KwZoHFvbJ4FPXPspvzbA==", + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "dev": true, "requires": { - "@npmcli/ci-detect": "^1.0.0", - "lru-cache": "^6.0.0", - "make-fetch-happen": "^8.0.9", - "minipass": "^3.1.3", - "minipass-fetch": "^1.3.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.0.0", - "npm-package-arg": "^8.0.0" + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" }, "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "yallist": "^4.0.0" + "is-plain-object": "^2.0.4" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } } }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { - "path-key": "^2.0.0" + "minimist": "^1.2.5" } }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", "dev": true, "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "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 + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", "dev": true, "requires": { - "boolbase": "~1.0.0" + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" } }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", "dev": true }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true + "nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "dev": true, + "optional": true }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "nanoid": { + "version": "3.1.22", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.22.tgz", + "integrity": "sha512-/2ZUaJX2ANuLtTvqTlgqBQNJoQO398KyJgZloL0PZkC0dpysjncRUPsFe3DUPzz/y3h+u7C46np8RMuvF3jsSQ==", "dev": true }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", "dev": true, "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" } }, - "object-is": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.4.tgz", - "integrity": "sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg==", + "native-url": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/native-url/-/native-url-0.2.6.tgz", + "integrity": "sha512-k4bDC87WtgrdD362gZz6zoiXQrl40kYlBmpfmSjwRO1VU0V5ccwJTlxuE72F6m3V0vc1xOf6n3UCP9QyerRqmA==", "dev": true, "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" + "querystring": "^0.2.0" } }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "dev": true, "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" + "lower-case": "^2.0.2", + "tslib": "^2.0.3" }, "dependencies": { - "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==", + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", "dev": true } } }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } + "node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "dev": true }, - "object.values": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.2.tgz", - "integrity": "sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag==", + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", "dev": true, "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "has": "^1.0.3" + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" }, "dependencies": { - "es-abstract": { - "version": "1.18.0-next.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.2.tgz", - "integrity": "sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.1", - "object-inspect": "^1.9.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.3", - "string.prototype.trimstart": "^1.0.3" - } - }, - "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==", + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, - "is-callable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", - "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", "dev": true }, - "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "requires": { - "has-symbols": "^1.0.1" - } - }, - "object-inspect": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", - "dev": true - } - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + } } }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", "dev": true }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "open": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/open/-/open-7.3.1.tgz", - "integrity": "sha512-f2wt9DCBKKjlFbjzGb8MOAW8LH8F0mrs1zc7KTjAJ9PZNQbfenzWbNP1VZJvw6ICMG9r14Ah6yfwPn7T7i646A==", + "node-notifier": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", + "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", "dev": true, + "optional": true, "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" + "growly": "^1.3.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", + "shellwords": "^0.1.1", + "uuid": "^8.3.0", + "which": "^2.0.2" }, "dependencies": { - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "optional": true, "requires": { - "is-docker": "^2.0.0" + "isexe": "^2.0.0" } } } }, - "opencollective-postinstall": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz", - "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==" - }, - "opener": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", - "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==", + "node-releases": { + "version": "1.1.71", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", + "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", "dev": true }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "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": { - "is-wsl": "^1.1.0" + "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 + } } }, - "ora": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.2.0.tgz", - "integrity": "sha512-+wG2v8TUU8EgzPHun1k/n45pXquQ9fHnbXVetl9rRgO6kjZszGGbraF3XPTIdgeA+s1lbRjSEftAnyT0w8ZMvQ==", + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", "dev": true, "requires": { - "bl": "^4.0.3", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "log-symbols": "^4.0.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" }, "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", "dev": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } } } }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { - "url-parse": "^1.4.3" + "path-key": "^2.0.0" } }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-tmpdir": { + "nth-check": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-limit": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", - "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", - "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-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", "dev": true, "requires": { - "aggregate-error": "^3.0.0" + "boolbase": "~1.0.0" } }, - "p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", - "dev": true, - "requires": { - "retry": "^0.12.0" - }, - "dependencies": { - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "dev": true - } - } + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true }, - "p-try": { + "nwsapi": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", "dev": true }, - "pacote": { - "version": "11.1.14", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-11.1.14.tgz", - "integrity": "sha512-6c5OhQelaJFDfiw/Zd8MfGCvvFHurSdeGzufZMPvRFImdbNOYFciOINf3DtUNUaU3h98eCb749UyHDsgvL19+A==", + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dev": true, "requires": { - "@npmcli/git": "^2.0.1", - "@npmcli/installed-package-contents": "^1.0.5", - "@npmcli/promise-spawn": "^1.2.0", - "@npmcli/run-script": "^1.3.0", - "cacache": "^15.0.5", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.3", - "mkdirp": "^1.0.3", - "npm-package-arg": "^8.0.1", - "npm-packlist": "^2.1.4", - "npm-pick-manifest": "^6.0.0", - "npm-registry-fetch": "^9.0.0", - "promise-retry": "^1.1.1", - "read-package-json-fast": "^1.1.3", - "rimraf": "^3.0.2", - "ssri": "^8.0.0", - "tar": "^6.1.0" + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" }, "dependencies": { - "cacache": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", - "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", - "dev": true, - "requires": { - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.0", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "glob": "^7.1.3" + "is-descriptor": "^0.1.0" } }, - "ssri": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", - "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "minipass": "^3.1.1" + "is-buffer": "^1.1.5" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } } }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "parallel-transform": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", - "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", - "dev": true, + "object-inspect": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.2.tgz", + "integrity": "sha512-gz58rdPpadwztRrPjZE9DZLOABUpTGdcANUgOwBFO1C+HZZhePoP83M65WGDmbpwFYJSWqavbl4SgDn4k8RYTA==", + "dev": true + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", "requires": { - "cyclist": "~0.2.2", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, - "parent-module": { + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object-visit": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, "requires": { - "callsites": "^3.0.0" - }, - "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - } + "isobject": "^3.0.0" } }, - "parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "dev": true, "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" } }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "object.entries": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.3.tgz", + "integrity": "sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg==", "dev": true, "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "has": "^1.0.3" } }, - "parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "parse5-html-rewriting-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz", - "integrity": "sha512-vwLQzynJVEfUlURxgnf51yAJDQTtVpNyGD8tKi2Za7m+akukNHxCcUQMAa/mUGLhCeicFdpy7Tlvj8ZNKadprg==", + "object.fromentries": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.4.tgz", + "integrity": "sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ==", "dev": true, "requires": { - "parse5": "^6.0.1", - "parse5-sax-parser": "^6.0.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "has": "^1.0.3" } }, - "parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "object.getownpropertydescriptors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", + "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", "dev": true, "requires": { - "parse5": "^6.0.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2" } }, - "parse5-sax-parser": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz", - "integrity": "sha512-kXX+5S81lgESA0LsDuGjAlBybImAChYRMT+/uKCEXFBFOeEhS52qUCydGhU3qLRD8D9DVjaUo821WK7DM4iCeg==", + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, "requires": { - "parse5": "^6.0.1" + "isobject": "^3.0.1" } }, - "parseqs": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", - "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==", - "dev": true - }, - "parseuri": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", - "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==", - "dev": true - }, - "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path": { - "version": "0.12.7", - "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", - "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", + "object.values": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.3.tgz", + "integrity": "sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw==", "dev": true, "requires": { - "process": "^0.11.1", - "util": "^0.10.3" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "has": "^1.0.3" } }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "dev": true }, - "pbkdf2": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", - "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", "dev": true, "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "ee-first": "1.1.1" } }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "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 - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", "dev": true }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { - "pinkie": "^2.0.0" + "wrappy": "1" } }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "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" - } - }, - "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" - } - }, - "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" - } - }, - "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 - } + "mimic-fn": "^2.1.0" } }, - "pnp-webpack-plugin": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", - "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==", + "open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, "requires": { - "ts-pnp": "^1.1.6" + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" } }, - "portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", - "dev": true, - "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + }, + "dependencies": { + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", "dev": true } } }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "optimize-css-assets-webpack-plugin": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz", + "integrity": "sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A==", + "dev": true, + "requires": { + "cssnano": "^4.1.10", + "last-call-webpack-plugin": "^3.0.0" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, - "postcss": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.4.tgz", - "integrity": "sha512-kRFftRoExRVXZlwUuay9iC824qmXPcQQVzAjbCCgjpXnkdMCJYBu2gTwAaFBzv8ewND6O8xFb3aELmEkh9zTzg==", + "p-each-series": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { - "colorette": "^1.2.1", - "nanoid": "^3.1.20", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "p-try": "^2.0.0" } }, - "postcss-calc": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", - "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", + "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": { - "postcss": "^7.0.27", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "p-limit": "^2.2.0" } }, - "postcss-colormin": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", - "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, "requires": { - "browserslist": "^4.0.0", - "color": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "aggregate-error": "^3.0.0" } }, - "postcss-convert-values": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", - "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", "dev": true, "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "retry": "^0.12.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 + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "safe-buffer": "~5.1.0" } } } }, - "postcss-discard-comments": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", - "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", "dev": true, "requires": { - "postcss": "^7.0.0" + "dot-case": "^3.0.4", + "tslib": "^2.0.3" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "dev": true + } + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "requires": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "dev": true + } + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "requires": { + "isarray": "0.0.1" + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "picomatch": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", + "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, + "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" + }, + "dependencies": { + "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": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "locate-path": "^3.0.0" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "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": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "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": { - "has-flag": "^3.0.0" + "p-limit": "^2.0.0" } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true } } }, - "postcss-discard-duplicates": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", - "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", "dev": true, "requires": { - "postcss": "^7.0.0" + "find-up": "^3.0.0" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "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": { - "color-convert": "^1.9.0" + "locate-path": "^3.0.0" } }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "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": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, - "has-flag": { + "p-locate": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "p-limit": "^2.0.0" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + } + } + }, + "pnp-webpack-plugin": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", + "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==", + "dev": true, + "requires": { + "ts-pnp": "^1.1.6" + } + }, + "popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==" + }, + "portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dev": true, + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "ms": "^2.1.1" } } } }, - "postcss-discard-empty": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", - "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { - "postcss": "^7.0.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" }, "dependencies": { "ansi-styles": { @@ -13384,27 +11734,25 @@ } } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "color-name": "1.1.3" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "supports-color": { @@ -13418,280 +11766,465 @@ } } }, - "postcss-discard-overridden": { + "postcss-attribute-case-insensitive": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", + "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^6.0.2" + } + }, + "postcss-browser-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz", + "integrity": "sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig==", + "dev": true, + "requires": { + "postcss": "^7" + } + }, + "postcss-calc": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", + "dev": true, + "requires": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "postcss-color-functional-notation": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", + "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-color-gray": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", + "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", + "dev": true, + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-color-hex-alpha": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", + "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", + "dev": true, + "requires": { + "postcss": "^7.0.14", + "postcss-values-parser": "^2.0.1" + } + }, + "postcss-color-mod-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz", + "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", + "dev": true, + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-color-rebeccapurple": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", - "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", + "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", "dev": true, "requires": { - "postcss": "^7.0.0" + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-custom-media": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", + "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", + "dev": true, + "requires": { + "postcss": "^7.0.14" + } + }, + "postcss-custom-properties": { + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", + "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", + "dev": true, + "requires": { + "postcss": "^7.0.17", + "postcss-values-parser": "^2.0.1" + } + }, + "postcss-custom-selectors": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", + "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", "dev": true }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", "dev": true, "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + } + } + }, + "postcss-dir-pseudo-class": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", + "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", "dev": true }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } } } }, - "postcss-import": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.0.0.tgz", - "integrity": "sha512-gFDDzXhqr9ELmnLHgCC3TbGfA6Dm/YMb/UN8/f7Uuq4fL7VTk2vOIj6hwINEwbokEmp123bLD7a5m+E+KIetRg==", + "postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", "dev": true, "requires": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" + "postcss": "^7.0.0" } }, - "postcss-loader": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.2.0.tgz", - "integrity": "sha512-mqgScxHqbiz1yxbnNcPdKYo/6aVt+XExURmEbQlviFVWogDbM4AJ0A/B+ZBpYsJrTRxKw7HyRazg9x0Q9SWwLA==", + "postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", "dev": true, "requires": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.4", - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0", - "semver": "^7.3.4" + "postcss": "^7.0.0" + } + }, + "postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-double-position-gradients": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", + "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", + "dev": true, + "requires": { + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-env-function": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", + "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-flexbugs-fixes": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz", + "integrity": "sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ==", + "dev": true, + "requires": { + "postcss": "^7.0.26" + } + }, + "postcss-focus-visible": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", + "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-focus-within": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", + "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-font-variant": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz", + "integrity": "sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-gap-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", + "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-image-set-function": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", + "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-initial": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.4.tgz", + "integrity": "sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-lab-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", + "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", + "dev": true, + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-load-config": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" }, "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, "cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" } }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", "dev": true, "requires": { - "yallist": "^4.0.0" + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" } }, "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "json-parse-better-errors": "^1.0.1" } }, "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "schema-utils": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", "dev": true } } }, - "postcss-merge-longhand": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", - "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", "dev": true, "requires": { - "css-color-names": "0.0.4", + "loader-utils": "^1.1.0", "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "stylehacks": "^4.0.0" + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "minimist": "^1.2.0" } }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "dev": true, "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" } - }, + } + } + }, + "postcss-logical": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", + "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-media-minmax": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", + "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "dev": true, + "requires": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "dependencies": { "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -13709,54 +12242,6 @@ "vendors": "^1.0.0" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, "postcss-selector-parser": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", @@ -13767,21 +12252,6 @@ "indexes-of": "^1.0.1", "uniq": "^1.0.1" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -13795,74 +12265,11 @@ "postcss-value-parser": "^3.0.0" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -13878,74 +12285,11 @@ "postcss-value-parser": "^3.0.0" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -13963,74 +12307,11 @@ "uniqs": "^2.0.0" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } + "dev": true } } }, @@ -14046,54 +12327,6 @@ "postcss-selector-parser": "^3.0.0" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, "postcss-selector-parser": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", @@ -14104,57 +12337,70 @@ "indexes-of": "^1.0.1", "uniq": "^1.0.1" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, "postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dev": true, + "requires": { + "postcss": "^7.0.5" + } }, "postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", + "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", "dev": true, "requires": { - "icss-utils": "^5.0.0", + "icss-utils": "^4.1.1", + "postcss": "^7.0.32", "postcss-selector-parser": "^6.0.2", "postcss-value-parser": "^4.1.0" } }, "postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", "dev": true, "requires": { - "postcss-selector-parser": "^6.0.4" + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" } }, "postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "dev": true, + "requires": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + }, + "postcss-nesting": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", + "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-normalize": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-8.0.1.tgz", + "integrity": "sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ==", "dev": true, "requires": { - "icss-utils": "^5.0.0" + "@csstools/normalize.css": "^10.1.0", + "browserslist": "^4.6.2", + "postcss": "^7.0.17", + "postcss-browser-comments": "^3.0.0", + "sanitize.css": "^10.0.0" } }, "postcss-normalize-charset": { @@ -14164,71 +12410,6 @@ "dev": true, "requires": { "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } } }, "postcss-normalize-display-values": { @@ -14242,157 +12423,31 @@ "postcss-value-parser": "^3.0.0" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } - }, - "postcss-normalize-positions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", - "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, + }, + "postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -14408,74 +12463,11 @@ "postcss-value-parser": "^3.0.0" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -14490,74 +12482,11 @@ "postcss-value-parser": "^3.0.0" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -14572,156 +12501,30 @@ "postcss-value-parser": "^3.0.0" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, - "postcss-normalize-unicode": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", - "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, + "postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -14737,74 +12540,17 @@ "postcss-value-parser": "^3.0.0" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", "dev": true }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -14818,74 +12564,11 @@ "postcss-value-parser": "^3.0.0" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -14900,154 +12583,128 @@ "postcss-value-parser": "^3.0.0" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, - "postcss-reduce-initial": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", - "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "postcss-overflow-shorthand": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", + "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", "dev": true, "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "postcss": "^7.0.2" + } + }, + "postcss-page-break": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", + "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-place": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", + "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-preset-env": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", + "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", + "dev": true, + "requires": { + "autoprefixer": "^9.6.1", + "browserslist": "^4.6.4", + "caniuse-lite": "^1.0.30000981", + "css-blank-pseudo": "^0.1.4", + "css-has-pseudo": "^0.10.0", + "css-prefers-color-scheme": "^3.1.1", + "cssdb": "^4.4.0", + "postcss": "^7.0.17", + "postcss-attribute-case-insensitive": "^4.0.1", + "postcss-color-functional-notation": "^2.0.1", + "postcss-color-gray": "^5.0.0", + "postcss-color-hex-alpha": "^5.0.3", + "postcss-color-mod-function": "^3.0.3", + "postcss-color-rebeccapurple": "^4.0.1", + "postcss-custom-media": "^7.0.8", + "postcss-custom-properties": "^8.0.11", + "postcss-custom-selectors": "^5.1.2", + "postcss-dir-pseudo-class": "^5.0.0", + "postcss-double-position-gradients": "^1.0.0", + "postcss-env-function": "^2.0.2", + "postcss-focus-visible": "^4.0.0", + "postcss-focus-within": "^3.0.0", + "postcss-font-variant": "^4.0.0", + "postcss-gap-properties": "^2.0.0", + "postcss-image-set-function": "^3.0.1", + "postcss-initial": "^3.0.0", + "postcss-lab-function": "^2.0.1", + "postcss-logical": "^3.0.0", + "postcss-media-minmax": "^4.0.0", + "postcss-nesting": "^7.0.0", + "postcss-overflow-shorthand": "^2.0.0", + "postcss-page-break": "^2.0.0", + "postcss-place": "^4.0.1", + "postcss-pseudo-class-any-link": "^6.0.0", + "postcss-replace-overflow-wrap": "^3.0.0", + "postcss-selector-matches": "^4.0.0", + "postcss-selector-not": "^4.0.0" + } + }, + "postcss-pseudo-class-any-link": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", + "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", "dev": true }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } } } }, + "postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + } + }, "postcss-reduce-transforms": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", @@ -15060,177 +12717,91 @@ "postcss-value-parser": "^3.0.0" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + } + } + }, + "postcss-replace-overflow-wrap": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", + "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-safe-parser": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-5.0.2.tgz", + "integrity": "sha512-jDUfCPJbKOABhwpUKcqCVbbXiloe/QXMcbJ6Iipf3sDIihEzTqRCeMBfRaOHxhBuTYqtASrI1KJWxzztZU4qUQ==", + "dev": true, + "requires": { + "postcss": "^8.1.0" + }, + "dependencies": { + "postcss": { + "version": "8.2.12", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.12.tgz", + "integrity": "sha512-BJnGT5+0q2tzvs6oQfnY2NpEJ7rIXNfBnZtQOKCIsweeWXBXeDd5k31UgTdS3d/c02ouspufn37mTaHWkJyzMQ==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "colorette": "^1.2.2", + "nanoid": "^3.1.22", + "source-map": "^0.6.1" } } } }, + "postcss-selector-matches": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", + "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + } + }, + "postcss-selector-not": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz", + "integrity": "sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + } + }, "postcss-selector-parser": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", - "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.5.tgz", + "integrity": "sha512-aFYPoYmXbZ1V6HZaSvat08M97A8HqO6Pjz+PiNpw/DhuRrC72XWAdp3hL6wusDCN31sSmcZyMGa2hZEuX+Xfhg==", "dev": true, "requires": { "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1", "util-deprecate": "^1.0.2" - }, - "dependencies": { - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - } } }, "postcss-svgo": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", - "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", "dev": true, "requires": { - "is-svg": "^3.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0", "svgo": "^1.0.0" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -15243,71 +12814,6 @@ "alphanum-sort": "^1.0.0", "postcss": "^7.0.0", "uniqs": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } } }, "postcss-value-parser": { @@ -15316,12 +12822,57 @@ "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", "dev": true }, + "postcss-values-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", + "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", + "dev": true, + "requires": { + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, "pretty-bytes": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.5.0.tgz", - "integrity": "sha512-p+T744ZyjjiaFlMUZZv6YPC5JrkNj8maRmPaQCWFJFplUAzpIUTRaTcS+7wmZtUoFXHtESJb23ISliaWyz3SHA==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "dev": true }, + "pretty-error": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "dev": true, + "requires": { + "lodash": "^4.17.20", + "renderkid": "^2.0.4" + } + }, + "pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + } + }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -15329,25 +12880,72 @@ "dev": true }, "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, + "promise": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", + "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", + "requires": { + "asap": "~2.0.6" + } + }, "promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", "dev": true }, - "promise-retry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", - "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", + "prompts": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", + "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", "dev": true, "requires": { - "err-code": "^1.0.0", - "retry": "^0.10.0" + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } + }, + "prop-types-extra": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", + "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", + "requires": { + "react-is": "^16.3.2", + "warning": "^4.0.0" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } } }, "proxy-addr": { @@ -15367,9 +12965,9 @@ "dev": true }, "psl": { - "version": "1.1.33", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.33.tgz", - "integrity": "sha512-LTDP2uSrsc7XCb5lO7A8BI1qYxRe/8EqlRvMeEl6rsnYAqDOl8xHR+8lSAIVfrNaSAlTPTNOCgNjWcoUL3AZsw==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, "public-encrypt": { @@ -15387,29 +12985,17 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } }, - "puka": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/puka/-/puka-1.0.1.tgz", - "integrity": "sha512-ssjRZxBd7BT3dte1RR3VoeT2cT/ODH8x+h0rUF1rMqB0srHYf48stSDWfiYakTp5UBZMxroZhB2+ExLDHm7W3g==", - "dev": true - }, "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "requires": { "end-of-stream": "^1.1.0", @@ -15417,21 +13003,32 @@ } }, "pumpify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.4.0.tgz", - "integrity": "sha512-2kmNR9ry+Pf45opRVirpNuIFotsxUGLaYqxIwuR77AYrYRMuFCz9eryHBS52L360O+NcR383CL4QYlMKPq4zYA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", "dev": true, "requires": { - "duplexify": "^3.5.3", + "duplexify": "^3.6.0", "inherits": "^2.0.3", "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } } }, "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "q": { "version": "1.5.1", @@ -15439,22 +13036,27 @@ "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", "dev": true }, - "qjobs": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", - "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", - "dev": true - }, "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, + "query-string": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.0.0.tgz", + "integrity": "sha512-Iy7moLybliR5ZgrK/1R3vjrXq03S13Vz4Rbm5Jg3EFq1LUmQppto0qtXz4vqZ386MSRjZgnTSZ9QC+NZOSd/XA==", + "requires": { + "decode-uri-component": "^0.2.0", + "filter-obj": "^1.1.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + } + }, "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", + "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==", "dev": true }, "querystring-es3": { @@ -15469,6 +13071,20 @@ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", "dev": true }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "requires": { + "performance-now": "^2.1.0" + } + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -15489,9 +13105,9 @@ } }, "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true }, "raw-body": { @@ -15511,163 +13127,629 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", "dev": true + } + } + }, + "react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "react-app-polyfill": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-2.0.0.tgz", + "integrity": "sha512-0sF4ny9v/B7s6aoehwze9vJNWcmCemAUYBVasscVr92+UYiEqDXOxfKjXN685mDaMRNF3WdhHQs76oTODMocFA==", + "dev": true, + "requires": { + "core-js": "^3.6.5", + "object-assign": "^4.1.1", + "promise": "^8.1.0", + "raf": "^3.4.1", + "regenerator-runtime": "^0.13.7", + "whatwg-fetch": "^3.4.1" + } + }, + "react-bootstrap": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-1.6.0.tgz", + "integrity": "sha512-PaeOGeRC2+JH9Uf1PukJgXcIpfGlrKKHEBZIArymjenYzSJ/RhO2UdNX+e7nalsCFFZLRRgQ0/FKkscW2LmmRg==", + "requires": { + "@babel/runtime": "^7.13.8", + "@restart/context": "^2.1.4", + "@restart/hooks": "^0.3.26", + "@types/classnames": "^2.2.10", + "@types/invariant": "^2.2.33", + "@types/prop-types": "^15.7.3", + "@types/react": ">=16.9.35", + "@types/react-transition-group": "^4.4.1", + "@types/warning": "^3.0.0", + "classnames": "^2.2.6", + "dom-helpers": "^5.1.2", + "invariant": "^2.2.4", + "prop-types": "^15.7.2", + "prop-types-extra": "^1.1.0", + "react-overlays": "^5.0.0", + "react-transition-group": "^4.4.1", + "uncontrollable": "^7.2.1", + "warning": "^4.0.3" + } + }, + "react-bootstrap-typeahead": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/react-bootstrap-typeahead/-/react-bootstrap-typeahead-5.1.4.tgz", + "integrity": "sha512-CfoaSjGV3MZS9yrkLfYkvimzRYru1Ko7qKKzacbsBeZ/sHCxFvUhxnCXmTy/K2vZCkOmAQpU/sbgQVOkMRNlSQ==", + "requires": { + "@babel/runtime": "^7.3.4", + "@restart/hooks": "^0.3.22", + "classnames": "^2.2.0", + "fast-deep-equal": "^3.1.1", + "invariant": "^2.2.1", + "lodash.debounce": "^4.0.8", + "prop-types": "^15.5.8", + "react-overlays": "^4.1.1", + "react-popper": "^1.0.0", + "scroll-into-view-if-needed": "^2.2.20", + "warning": "^4.0.1" + }, + "dependencies": { + "react-overlays": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-4.1.1.tgz", + "integrity": "sha512-WtJifh081e6M24KnvTQoNjQEpz7HoLxqt8TwZM7LOYIkYJ8i/Ly1Xi7RVte87ZVnmqQ4PFaFiNHZhSINPSpdBQ==", + "requires": { + "@babel/runtime": "^7.12.1", + "@popperjs/core": "^2.5.3", + "@restart/hooks": "^0.3.25", + "@types/warning": "^3.0.0", + "dom-helpers": "^5.2.0", + "prop-types": "^15.7.2", + "uncontrollable": "^7.0.0", + "warning": "^4.0.3" + } + } + } + }, + "react-contenteditable": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/react-contenteditable/-/react-contenteditable-3.3.5.tgz", + "integrity": "sha512-38A7hlRQfb2KQAQT0kIJC2YlQUU7jcyYM4eh1fj6kAYb3Hmk6hHlr0snelyxVSpPXjPdFllrnSsPkzUS5AtrEA==", + "requires": { + "fast-deep-equal": "^2.0.1", + "prop-types": "^15.7.1" + }, + "dependencies": { + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + } + } + }, + "react-dev-utils": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-11.0.4.tgz", + "integrity": "sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A==", + "dev": true, + "requires": { + "@babel/code-frame": "7.10.4", + "address": "1.1.2", + "browserslist": "4.14.2", + "chalk": "2.4.2", + "cross-spawn": "7.0.3", + "detect-port-alt": "1.1.6", + "escape-string-regexp": "2.0.0", + "filesize": "6.1.0", + "find-up": "4.1.0", + "fork-ts-checker-webpack-plugin": "4.1.6", + "global-modules": "2.0.0", + "globby": "11.0.1", + "gzip-size": "5.1.1", + "immer": "8.0.1", + "is-root": "2.1.0", + "loader-utils": "2.0.0", + "open": "^7.0.2", + "pkg-up": "3.1.0", + "prompts": "2.4.0", + "react-error-overlay": "^6.0.9", + "recursive-readdir": "2.2.2", + "shell-quote": "1.7.2", + "strip-ansi": "6.0.0", + "text-table": "0.2.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "browserslist": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.2.tgz", + "integrity": "sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001125", + "electron-to-chromium": "^1.3.564", + "escalade": "^3.0.2", + "node-releases": "^1.1.61" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + } + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + }, + "globby": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", + "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" } }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + } + }, + "react-error-overlay": { + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", + "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==", + "dev": true + }, + "react-hook-form": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.6.4.tgz", + "integrity": "sha512-eKLRWkZcUKGYKMnKvN/VwPVc8t3pjfs69UEp/DJNS2ccGk18UKFq/XE049W+ye144aUj+1++NgUjs2/yMNuBWw==" + }, + "react-icons": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-3.11.0.tgz", + "integrity": "sha512-JRgiI/vdF6uyBgyZhVyYJUZAop95Sy4XDe/jmT3R/bKliFWpO/uZBwvSjWEdxwzec7SYbEPNPck0Kff2tUGM2Q==", + "requires": { + "camelcase": "^5.0.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + } + } + }, + "react-infinite-scroll-component": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/react-infinite-scroll-component/-/react-infinite-scroll-component-6.1.0.tgz", + "integrity": "sha512-SQu5nCqy8DxQWpnUVLx7V7b7LcA37aM7tvoWjTLZp1dk6EJibM5/4EJKzOnl07/BsM1Y40sKLuqjCwwH/xV0TQ==", + "requires": { + "throttle-debounce": "^2.1.0" + } + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "react-overlays": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-5.0.1.tgz", + "integrity": "sha512-plwUJieTBbLSrgvQ4OkkbTD/deXgxiJdNuKzo6n1RWE3OVnQIU5hffCGS/nvIuu6LpXFs2majbzaXY8rcUVdWA==", + "requires": { + "@babel/runtime": "^7.13.8", + "@popperjs/core": "^2.8.6", + "@restart/hooks": "^0.3.26", + "@types/warning": "^3.0.0", + "dom-helpers": "^5.2.0", + "prop-types": "^15.7.2", + "uncontrollable": "^7.2.1", + "warning": "^4.0.3" + } + }, + "react-popper": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-1.3.11.tgz", + "integrity": "sha512-VSA/bS+pSndSF2fiasHK/PTEEAyOpX60+H5EPAjoArr8JGm+oihu4UbrqcEBpQibJxBVCpYyjAX7abJ+7DoYVg==", + "requires": { + "@babel/runtime": "^7.1.2", + "@hypnosphi/create-react-context": "^0.3.1", + "deep-equal": "^1.1.1", + "popper.js": "^1.14.4", + "prop-types": "^15.6.1", + "typed-styles": "^0.0.7", + "warning": "^4.0.2" + } + }, + "react-refresh": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.3.tgz", + "integrity": "sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg==", + "dev": true + }, + "react-router": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.0.tgz", + "integrity": "sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw==", + "requires": { + "@babel/runtime": "^7.1.2", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "mini-create-react-context": "^0.4.0", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } + }, + "react-router-dom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.2.0.tgz", + "integrity": "sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA==", + "requires": { + "@babel/runtime": "^7.1.2", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.2.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + } + }, + "react-scripts": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-4.0.3.tgz", + "integrity": "sha512-S5eO4vjUzUisvkIPB7jVsKtuH2HhWcASREYWHAQ1FP5HyCv3xgn+wpILAEWkmy+A+tTNbSZClhxjT3qz6g4L1A==", + "dev": true, + "requires": { + "@babel/core": "7.12.3", + "@pmmmwh/react-refresh-webpack-plugin": "0.4.3", + "@svgr/webpack": "5.5.0", + "@typescript-eslint/eslint-plugin": "^4.5.0", + "@typescript-eslint/parser": "^4.5.0", + "babel-eslint": "^10.1.0", + "babel-jest": "^26.6.0", + "babel-loader": "8.1.0", + "babel-plugin-named-asset-import": "^0.3.7", + "babel-preset-react-app": "^10.0.0", + "bfj": "^7.0.2", + "camelcase": "^6.1.0", + "case-sensitive-paths-webpack-plugin": "2.3.0", + "css-loader": "4.3.0", + "dotenv": "8.2.0", + "dotenv-expand": "5.1.0", + "eslint": "^7.11.0", + "eslint-config-react-app": "^6.0.0", + "eslint-plugin-flowtype": "^5.2.0", + "eslint-plugin-import": "^2.22.1", + "eslint-plugin-jest": "^24.1.0", + "eslint-plugin-jsx-a11y": "^6.3.1", + "eslint-plugin-react": "^7.21.5", + "eslint-plugin-react-hooks": "^4.2.0", + "eslint-plugin-testing-library": "^3.9.2", + "eslint-webpack-plugin": "^2.5.2", + "file-loader": "6.1.1", + "fs-extra": "^9.0.1", + "fsevents": "^2.1.3", + "html-webpack-plugin": "4.5.0", + "identity-obj-proxy": "3.0.0", + "jest": "26.6.0", + "jest-circus": "26.6.0", + "jest-resolve": "26.6.0", + "jest-watch-typeahead": "0.6.1", + "mini-css-extract-plugin": "0.11.3", + "optimize-css-assets-webpack-plugin": "5.0.4", + "pnp-webpack-plugin": "1.6.4", + "postcss-flexbugs-fixes": "4.2.1", + "postcss-loader": "3.0.0", + "postcss-normalize": "8.0.1", + "postcss-preset-env": "6.7.0", + "postcss-safe-parser": "5.0.2", + "prompts": "2.4.0", + "react-app-polyfill": "^2.0.0", + "react-dev-utils": "^11.0.3", + "react-refresh": "^0.8.3", + "resolve": "1.18.1", + "resolve-url-loader": "^3.1.2", + "sass-loader": "^10.0.5", + "semver": "7.3.2", + "style-loader": "1.3.0", + "terser-webpack-plugin": "4.2.3", + "ts-pnp": "1.2.0", + "url-loader": "4.1.1", + "webpack": "4.44.2", + "webpack-dev-server": "3.11.1", + "webpack-manifest-plugin": "2.2.0", + "workbox-webpack-plugin": "5.1.4" + } + }, + "react-scroll": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/react-scroll/-/react-scroll-1.8.2.tgz", + "integrity": "sha512-f2ZEG5fsPbPTySI9ekcFpETCcNlqbmwbQj9hhzYK8tkgv+PA8APatSt66o/q0KSkDZxyT98ONTtXp9x0lyowEw==", + "requires": { + "lodash.throttle": "^4.1.1", + "prop-types": "^15.7.2" + } + }, + "react-transition-group": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.1.tgz", + "integrity": "sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw==", + "requires": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "dependencies": { + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "dev": true, "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "pify": "^2.0.0" } }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true } } }, - "raw-loader": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", - "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "dev": true, "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" }, "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "locate-path": "^2.0.0" } }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } }, - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "p-try": "^1.0.0" } - } - } - }, - "read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", - "dev": true, - "requires": { - "pify": "^2.3.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true } } }, - "read-package-json-fast": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-1.2.1.tgz", - "integrity": "sha512-OFbpwnHcv74Oa5YN5WvbOBfLw6yPmPcwvyJJw/tj9cWFBF7juQUDLDSZiOjEcgzfweWeeROOmbPpNN1qm4hcRg==", + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, "requires": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", - "util-deprecate": "~1.0.1" + "picomatch": "^2.2.1" } }, - "readdir-scoped-modules": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", - "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", + "recursive-readdir": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", + "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", "dev": true, "requires": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" + "minimatch": "3.0.4" } }, - "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", "dev": true, "requires": { - "picomatch": "^2.2.1" + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" } }, - "reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", - "dev": true - }, "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", "dev": true }, "regenerate-unicode-properties": { @@ -15713,22 +13795,100 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", - "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" } }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, + "regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "regjsparser": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", + "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", "dev": true }, + "renderkid": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.5.tgz", + "integrity": "sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ==", + "dev": true, + "requires": { + "css-select": "^2.0.2", + "dom-converter": "^0.2", + "htmlparser2": "^3.10.1", + "lodash": "^4.17.20", + "strip-ansi": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", "dev": true }, "repeat-string": { @@ -15737,12 +13897,96 @@ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } + } + }, + "request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dev": true, + "requires": { + "lodash": "^4.17.19" + } + }, + "request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "dev": true, + "requires": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "dependencies": { + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", @@ -15756,29 +14000,43 @@ "dev": true }, "resolve": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", - "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", + "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", "dev": true, "requires": { - "path-parse": "^1.0.5" + "is-core-module": "^2.0.0", + "path-parse": "^1.0.6" } }, "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "requires": { - "resolve-from": "^3.0.0" + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } } }, "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, + "resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + }, "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", @@ -15840,15 +14098,21 @@ } } }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { - "safe-buffer": "~5.1.1" + "color-name": "1.1.3" } }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, "emojis-list": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", @@ -15892,12 +14156,6 @@ "supports-color": "^6.1.0" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", @@ -15909,16 +14167,6 @@ } } }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", @@ -15926,9 +14174,9 @@ "dev": true }, "retry": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", - "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", "dev": true }, "reusify": { @@ -15947,12 +14195,6 @@ "css": "^2.0.0" }, "dependencies": { - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, "convert-source-map": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", @@ -15971,12 +14213,6 @@ "urix": "^0.1.0" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "source-map-resolve": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", @@ -15998,12 +14234,6 @@ "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=", "dev": true }, - "rfdc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.2.0.tgz", - "integrity": "sha512-ijLyszTMmUrXvjSooucVQwimGUk84eRcmCuLV8Xghe3UO85mjUtRAHRyoMM6XtyqbECaXuBWx18La3523sXINA==", - "dev": true - }, "rgb-regex": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", @@ -16017,12 +14247,12 @@ "dev": true }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" } }, "ripemd160": { @@ -16035,35 +14265,107 @@ "inherits": "^2.0.1" } }, - "rollup": { - "version": "2.36.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.36.1.tgz", - "integrity": "sha512-eAfqho8dyzuVvrGqpR0ITgEdq0zG2QJeWYh+HeuTbpcaXk8vNFc48B7bJa1xYosTCKx0CuW+447oQOW8HgBIZQ==", + "rollup": { + "version": "1.32.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.32.1.tgz", + "integrity": "sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/node": "*", + "acorn": "^7.1.0" + } + }, + "rollup-plugin-babel": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz", + "integrity": "sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "rollup-pluginutils": "^2.8.1" + } + }, + "rollup-plugin-terser": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.3.1.tgz", + "integrity": "sha512-1pkwkervMJQGFYvM9nscrUoncPwiKR/K+bHdjv6PFgRo3cgPHoRT83y2Aa3GvINj4539S15t/tpFPb775TDs6w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "jest-worker": "^24.9.0", + "rollup-pluginutils": "^2.8.2", + "serialize-javascript": "^4.0.0", + "terser": "^4.6.2" + }, + "dependencies": { + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "jest-worker": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "dev": true, + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" + } + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", "dev": true, "requires": { - "fsevents": "~2.1.2" + "estree-walker": "^0.6.1" }, "dependencies": { - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true + "estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true } } }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", "dev": true }, "run-parallel": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz", - "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==", - "dev": true + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } }, "run-queue": { "version": "1.0.3", @@ -16074,25 +14376,11 @@ "aproba": "^1.1.1" } }, - "rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } - }, "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "safe-regex": { "version": "1.1.0", @@ -16109,13 +14397,160 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "dev": true, + "requires": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "sanitize.css": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-10.0.0.tgz", + "integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==", + "dev": true + }, "sass": { - "version": "1.32.4", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.32.4.tgz", - "integrity": "sha512-N0BT0PI/t3+gD8jKa83zJJUb7ssfQnRRfqN+GIErokW6U4guBpfYl8qYB+OFLEho+QvnV5ZH1R9qhUC/Z2Ch9w==", + "version": "1.32.11", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.32.11.tgz", + "integrity": "sha512-O9tRcob/fegUVSIV1ihLLZcftIOh0AF1VpKgusUfLqnb2jQ0GLDwI5ivv1FYWivGv8eZ/AwntTyTzjcHu0c/qw==", "dev": true, "requires": { - "chokidar": ">=2.0.0 <4.0.0" + "chokidar": ">=3.0.0 <4.0.0" } }, "sass-loader": { @@ -16131,39 +14566,6 @@ "semver": "^7.3.2" }, "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, "schema-utils": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", @@ -16174,21 +14576,6 @@ "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } } }, @@ -16198,6 +14585,24 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } + }, + "scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, "schema-utils": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", @@ -16207,26 +14612,14 @@ "@types/json-schema": "^7.0.5", "ajv": "^6.12.4", "ajv-keywords": "^3.5.2" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - } + } + }, + "scroll-into-view-if-needed": { + "version": "2.2.28", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.28.tgz", + "integrity": "sha512-8LuxJSuFVc92+0AdNv4QOxRL4Abeo1DgLnGNkn1XlaujPH/3cCFz3QI60r2VNu4obJJROzgnIUw5TKQkZvZI1w==", + "requires": { + "compute-scroll-into-view": "^1.0.17" } }, "select-hose": { @@ -16245,27 +14638,10 @@ } }, "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" - }, - "semver-dsl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", - "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", - "dev": true, - "requires": { - "semver": "^5.3.0" - } - }, - "semver-intersect": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.4.0.tgz", - "integrity": "sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ==", - "dev": true, - "requires": { - "semver": "^5.0.0" - } + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true }, "send": { "version": "0.17.1", @@ -16288,60 +14664,28 @@ "statuses": "~1.5.0" }, "dependencies": { - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true } } }, @@ -16354,6 +14698,11 @@ "randombytes": "^2.1.0" } }, + "serialize-query-params": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/serialize-query-params/-/serialize-query-params-1.3.3.tgz", + "integrity": "sha512-rJIIETRuGUVbLekC73IiXV3738ylEHbHK1kxaXAbhxbxfio0yvVXaRMF+OyLZOBMwdgDHYLaj6EMBAEiSf8C/g==" + }, "serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", @@ -16367,6 +14716,47 @@ "http-errors": "~1.6.2", "mime-types": "~2.1.17", "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } } }, "serve-static": { @@ -16379,20 +14769,6 @@ "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "0.17.1" - }, - "dependencies": { - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - } } }, "set-blocking": { @@ -16431,9 +14807,9 @@ "dev": true }, "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", "dev": true }, "sha.js": { @@ -16446,42 +14822,64 @@ "safe-buffer": "^5.0.1" } }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", + "dev": true + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true, + "optional": true + }, + "shortid": { + "version": "2.2.16", + "resolved": "https://registry.npmjs.org/shortid/-/shortid-2.2.16.tgz", + "integrity": "sha512-Ugt+GIZqvGXCIItnsL+lvFJOiN7RYqlGy7QE41O3YC1xbNSeDGIRO7xg2JJXIAj1cAGnOeC1r7/T9pgrtQbv4g==", + "requires": { + "nanoid": "^2.1.0" + }, + "dependencies": { + "nanoid": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz", + "integrity": "sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==" + } + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" } }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, "simple-swizzle": { @@ -16501,12 +14899,29 @@ } } }, - "smart-buffer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", - "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -16523,6 +14938,15 @@ "use": "^3.1.0" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", @@ -16540,6 +14964,31 @@ "requires": { "is-extendable": "^0.1.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } } } }, @@ -16591,12 +15040,6 @@ "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true } } }, @@ -16607,129 +15050,16 @@ "dev": true, "requires": { "kind-of": "^3.2.0" - } - }, - "socket.io": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.4.1.tgz", - "integrity": "sha512-Si18v0mMXGAqLqCVpTxBa8MGqriHGQh8ccEOhmsmNS3thNCGBwO8WGrwMibANsWtQQ5NStdZwHqZR3naJVFc3w==", - "dev": true, - "requires": { - "debug": "~4.1.0", - "engine.io": "~3.5.0", - "has-binary2": "~1.0.2", - "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.4.0", - "socket.io-parser": "~3.4.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } - } - }, - "socket.io-adapter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", - "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", - "dev": true - }, - "socket.io-client": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.4.0.tgz", - "integrity": "sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ==", - "dev": true, - "requires": { - "backo2": "1.0.2", - "component-bind": "1.0.0", - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "engine.io-client": "~3.5.0", - "has-binary2": "~1.0.2", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "socket.io-parser": "~3.3.0", - "to-array": "0.1.4" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - }, - "socket.io-parser": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz", - "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==", - "dev": true, - "requires": { - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "isarray": "2.0.1" - } - } - } - }, - "socket.io-parser": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", - "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "debug": "~4.1.0", - "isarray": "2.0.1" }, "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "ms": "^2.1.1" + "is-buffer": "^1.1.5" } - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true } } }, @@ -16753,9 +15083,9 @@ } }, "sockjs-client": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.0.tgz", - "integrity": "sha512-8Dt3BDi4FYNrCFGTL/HtwVzkARrENdwOUf1ZoW/9p3M8lZdFT35jVdrHza+qgxuG9H3/shR4cuX/X9umUrjP8Q==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.1.tgz", + "integrity": "sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ==", "dev": true, "requires": { "debug": "^3.2.6", @@ -16763,7 +15093,7 @@ "faye-websocket": "^0.11.3", "inherits": "^2.0.4", "json3": "^3.3.3", - "url-parse": "^1.4.7" + "url-parse": "^1.5.1" }, "dependencies": { "debug": { @@ -16774,57 +15104,16 @@ "requires": { "ms": "^2.1.1" } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true } } }, - "socks": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.5.1.tgz", - "integrity": "sha512-oZCsJJxapULAYJaEYBSzMcz8m3jqgGrHaGhkmU/o/PQfFWYWxkAaA0UMGImb6s6tEXfKi959X6VJjMMQ3P6TTQ==", - "dev": true, - "requires": { - "ip": "^1.1.5", - "smart-buffer": "^4.1.0" - } - }, - "socks-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz", - "integrity": "sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA==", + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", "dev": true, "requires": { - "agent-base": "6", - "debug": "4", - "socks": "^2.3.3" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "is-plain-obj": "^1.0.0" } }, "source-list-map": { @@ -16834,102 +15123,73 @@ "dev": true }, "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "source-map-loader": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-1.1.3.tgz", - "integrity": "sha512-6YHeF+XzDOrT/ycFJNI53cgEsp/tHTMl37hi7uVyqFAlTXW109JazaQCkbc+jjoL2637qkH1amLi+JzrIpt5lA==", - "dev": true, - "requires": { - "abab": "^2.0.5", - "iconv-lite": "^0.6.2", - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0", - "source-map": "^0.6.1", - "whatwg-mimetype": "^2.3.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "iconv-lite": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", - "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true }, "source-map-resolve": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", - "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", + "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", "dev": true, "requires": { - "atob": "^2.0.0", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0" } }, "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", "dev": true, "requires": { - "source-map": "^0.5.6" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", "dev": true }, "sourcemap-codec": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz", - "integrity": "sha512-CYAPYdBu34781kLHkaW3m6b/uUSyMOC2R61gcYMWooeuaGtjof86ZA/8T+qVPPt7np1085CR9hmMGrySwEc8Xg==", + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", "dev": true }, "spdy": { @@ -16941,93 +15201,29 @@ "debug": "^4.1.0", "handle-thing": "^2.0.0", "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - } + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" } }, - "speed-measure-webpack-plugin": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.3.3.tgz", - "integrity": "sha512-2ljD4Ch/rz2zG3HsLsnPfp23osuPBS0qPuz9sGpkNXTN1Ic4M+W9xB8l8rS8ob2cO4b1L+WTJw/0AJwWYVgcxQ==", + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "dev": true, "requires": { - "chalk": "^2.0.1" + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" } }, + "split-on-first": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", + "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==" + }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -17061,12 +15257,12 @@ } }, "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", "dev": true, "requires": { - "figgy-pudding": "^3.5.1" + "minipass": "^3.1.1" } }, "stable": { @@ -17075,6 +15271,29 @@ "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", "dev": true }, + "stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } + } + }, + "stackframe": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", + "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==", + "dev": true + }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -17097,9 +15316,15 @@ } }, "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", "dev": true }, "stream-browserify": { @@ -17110,12 +15335,44 @@ "requires": { "inherits": "~2.0.1", "readable-stream": "^2.0.2" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "stream-each": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz", - "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", "dev": true, "requires": { "end-of-stream": "^1.1.0", @@ -17135,10 +15392,10 @@ "xtend": "^4.0.0" }, "dependencies": { - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "readable-stream": { @@ -17168,362 +15425,225 @@ } }, "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", "dev": true }, - "streamroller": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.4.tgz", - "integrity": "sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ==", - "dev": true, - "requires": { - "date-format": "^2.1.0", - "debug": "^4.1.1", - "fs-extra": "^8.1.0" - }, - "dependencies": { - "date-format": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", - "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", - "dev": true - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } + "strict-uri-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", + "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=" }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" } }, - "string.prototype.trimend": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", - "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - } + "string-natural-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", + "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==", + "dev": true }, - "string.prototype.trimstart": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", - "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "dev": true, "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" } }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "string.prototype.matchall": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.4.tgz", + "integrity": "sha512-pknFIWVachNcyqRfaQSeu/FUfpvJTe4uskUSZ9Wc1RijsPuzbZ8TyYT8WCNnntCjUEqQ3vUHMAfVj2+wLAisPQ==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "has-symbols": "^1.0.1", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.3.1", + "side-channel": "^1.0.4" } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "style-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz", - "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==", + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", "dev": true, "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, - "stylehacks": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", - "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true } } }, - "stylus": { - "version": "0.54.8", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.8.tgz", - "integrity": "sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg==", + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", "dev": true, "requires": { - "css-parse": "~2.0.0", - "debug": "~3.1.0", - "glob": "^7.1.6", - "mkdirp": "~1.0.4", - "safer-buffer": "^2.1.2", - "sax": "~1.2.4", - "semver": "^6.3.0", - "source-map": "^0.7.3" + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" }, "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true } } }, - "stylus-loader": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-4.3.2.tgz", - "integrity": "sha512-xXVKHY+J7GBlOmqjCL1VvQfc+pFkBdWGtcpJSvBGE49nWWHaukox7KCjRdLTEzjrmHODm4+rLpqkYWzfJteMXQ==", + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-comments": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz", + "integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==", + "dev": true, + "requires": { + "babel-extract-comments": "^1.0.0", + "babel-plugin-transform-object-rest-spread": "^6.26.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "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" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "style-loader": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.3.0.tgz", + "integrity": "sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==", "dev": true, "requires": { - "fast-glob": "^3.2.4", - "klona": "^2.0.4", "loader-utils": "^2.0.0", - "normalize-path": "^3.0.0", - "schema-utils": "^3.0.0" + "schema-utils": "^2.7.0" + } + }, + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" }, "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", "dev": true, "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } } } }, "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-hyperlinks": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "dev": true, "requires": { - "has-flag": "^2.0.0" + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" } }, + "svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "dev": true + }, "svgo": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", @@ -17565,6 +15685,21 @@ "supports-color": "^5.3.0" } }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -17582,16 +15717,53 @@ } } }, - "symbol-observable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-3.0.0.tgz", - "integrity": "sha512-6tDOXSHiVjuCaasQSWTmHUWn4PuG7qa3+1WT031yTc/swT7+rLiw3GOrFxaH1E3lLP09dH3bVuVDf2gK5rxG3Q==", + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, + "table": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/table/-/table-6.3.2.tgz", + "integrity": "sha512-I9/Ca6Huf2oxFag7crD0DhA+arIdfLtWunSn0NIXSzjtUlDgIBGVZY7SsMkNPNT3Psd/z4gza0nuEpmra9eRbg==", + "dev": true, + "requires": { + "ajv": "^8.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "lodash.clonedeep": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0" + }, + "dependencies": { + "ajv": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.1.0.tgz", + "integrity": "sha512-B/Sk2Ix7A36fs/ZkuGLIR86EdjbgR6fsAcbx9lOP/QBSXujDNbVmIS/U4Itz5k8fPFDeVZl/zQ/gJW4Jrq6XjQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, "tapable": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", - "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", "dev": true }, "tar": { @@ -17608,63 +15780,58 @@ "yallist": "^4.0.0" }, "dependencies": { - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + } + } + }, + "temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=", + "dev": true + }, + "tempy": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz", + "integrity": "sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ==", + "dev": true, + "requires": { + "temp-dir": "^1.0.0", + "type-fest": "^0.3.1", + "unique-string": "^1.0.0" + }, + "dependencies": { + "type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", "dev": true } } }, + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + } + }, "terser": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.5.1.tgz", - "integrity": "sha512-6VGWZNVP2KTUcltUQJ25TtNjx/XgdDsBDKGt8nN0MpydU36LmbPPcMBd2kmtZNNGVVDLg44k7GKeHHj+4zPIBQ==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", "dev": true, "requires": { "commander": "^2.20.0", - "source-map": "~0.7.2", - "source-map-support": "~0.5.19" + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" }, "dependencies": { "commander": { @@ -17672,30 +15839,6 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } } } }, @@ -17716,102 +15859,32 @@ "webpack-sources": "^1.4.3" }, "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "cacache": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", - "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", - "dev": true, - "requires": { - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.0", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", "dev": true, "requires": { - "yallist": "^4.0.0" + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" } }, - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { - "yallist": "^4.0.0" + "semver": "^6.0.0" } }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -17821,13 +15894,13 @@ "yocto-queue": "^0.1.0" } }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "requires": { - "glob": "^7.1.3" + "find-up": "^4.0.0" } }, "schema-utils": { @@ -17841,59 +15914,101 @@ "ajv-keywords": "^3.5.2" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, - "ssri": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", - "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", - "dev": true, - "requires": { - "minipass": "^3.1.1" - } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "terser": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.6.1.tgz", + "integrity": "sha512-yv9YLFQQ+3ZqgWCUk+pvNJwgUTdlIxUk1WTN+RnaFJe2L7ipG2csPT0ra2XRm7Cs8cxN7QXmK1rFzEwYEQkzXw==", "dev": true, "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.19" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } } }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "dev": true }, + "throttle-debounce": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-2.3.0.tgz", + "integrity": "sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ==" + }, "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "requires": { - "readable-stream": "^2.1.5", + "readable-stream": "~2.3.6", "xtend": "~4.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "thunky": { @@ -17917,19 +16032,20 @@ "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", "dev": true }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } + "tiny-invariant": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", + "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==" }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", "dev": true }, "to-arraybuffer": { @@ -17941,7 +16057,8 @@ "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true }, "to-object-path": { "version": "0.3.0", @@ -17950,6 +16067,17 @@ "dev": true, "requires": { "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, "to-regex": { @@ -17965,24 +16093,12 @@ } }, "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - } + "is-number": "^7.0.0" } }, "toidentifier": { @@ -17992,28 +16108,32 @@ "dev": true }, "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", "dev": true, "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" }, "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true } } }, - "tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true + "tr46": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", + "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } }, "tryer": { "version": "1.0.1", @@ -18021,138 +16141,48 @@ "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", "dev": true }, - "ts-node": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-3.2.2.tgz", - "integrity": "sha1-u9KOOK9Kqj6WB2xGbhsiAZfBo84=", - "dev": true, - "requires": { - "arrify": "^1.0.0", - "chalk": "^2.0.0", - "diff": "^3.1.0", - "make-error": "^1.1.1", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.0", - "tsconfig": "^6.0.0", - "v8flags": "^3.0.0", - "yn": "^2.0.0" - } - }, "ts-pnp": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==", "dev": true }, - "tsconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-6.0.0.tgz", - "integrity": "sha1-aw6DdgA9evGGT434+J3QBZ/80DI=", - "dev": true, - "requires": { - "strip-bom": "^3.0.0", - "strip-json-comments": "^2.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } - } - }, - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" - }, - "tslint": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", - "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", + "tsconfig-paths": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", + "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.3", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.13.0", - "tsutils": "^2.29.0" + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "minimist": "^1.2.0" } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true } } }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "requires": { "tslib": "^1.8.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } } }, "tty-browserify": { @@ -18182,10 +16212,25 @@ "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", "dev": true }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, "type-fest": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz", - "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true }, "type-is": { @@ -18196,42 +16241,50 @@ "requires": { "media-typer": "0.3.0", "mime-types": "~2.1.24" - }, - "dependencies": { - "mime-db": { - "version": "1.45.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", - "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", - "dev": true - }, - "mime-types": { - "version": "2.1.28", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", - "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", - "dev": true, - "requires": { - "mime-db": "1.45.0" - } - } } }, + "typed-styles": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.7.tgz", + "integrity": "sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q==" + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, - "typescript": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.3.tgz", - "integrity": "sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg==", - "dev": true + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } }, - "ua-parser-js": { - "version": "0.7.21", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz", - "integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==", - "dev": true + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "uncontrollable": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", + "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", + "requires": { + "@babel/runtime": "^7.6.3", + "@types/react": ">=16.9.11", + "invariant": "^2.2.4", + "react-lifecycles-compat": "^3.0.4" + } }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", @@ -18295,95 +16348,27 @@ } }, "unique-slug": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", - "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "universal-analytics": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.23.tgz", - "integrity": "sha512-lgMIH7XBI6OgYn1woDEmxhGdj8yDefMKg7GkWdeATAlQZFrMrNyxSkpDzY57iY0/6fdlzTbBV03OawvvzG+q7A==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "request": "^2.88.2", - "uuid": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "mime-db": { - "version": "1.45.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", - "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", - "dev": true - }, - "mime-types": { - "version": "2.1.28", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", - "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", - "dev": true, - "requires": { - "mime-db": "1.45.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "requires": { + "crypto-random-string": "^1.0.0" } }, "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true }, "unpipe": { @@ -18435,6 +16420,12 @@ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true } } }, @@ -18445,20 +16436,11 @@ "dev": true }, "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "requires": { "punycode": "^2.1.0" - }, - "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - } } }, "urix": { @@ -18482,49 +16464,96 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + } + } + }, + "url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } } } }, "url-parse": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", - "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", + "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", "dev": true, "requires": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" } }, + "urs": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/urs/-/urs-0.0.8.tgz", + "integrity": "sha512-LaSSPpr91XrVA3vW2zPupw4K6DSQEDKdL4yQZX1mO2fpljIMpB5zctrjRvxLurelWSgKsHsCmfHNCImscryirQ==" + }, "use": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", - "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", - "dev": true, + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "use-http": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/use-http/-/use-http-1.0.20.tgz", + "integrity": "sha512-3JOASSO828AsUwGjH3nhjUxHpR0lxIUSSNO/OM+0YydETX6FWJV5zWiGKTOV1Gsxu/3GLRFUbEJ1Cl3mUGkfnw==", "requires": { - "kind-of": "^6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } + "urs": "^0.0.8", + "use-ssr": "^1.0.24", + "utility-types": "^3.10.0" + } + }, + "use-query-params": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/use-query-params/-/use-query-params-1.2.2.tgz", + "integrity": "sha512-Uyfe+/TECsNNzCSkgUM1MM24OEGxGE4aeWvZEf0a14iQFp/m43wiqI1HZ9oTlrRSZwD5yABeLc9rN+wtiB5B3Q==", + "requires": { + "serialize-query-params": "^1.3.3" } }, + "use-ssr": { + "version": "1.0.24", + "resolved": "https://registry.npmjs.org/use-ssr/-/use-ssr-1.0.24.tgz", + "integrity": "sha512-0MFps7ezL57/3o0yl4CvrHLlp9z20n1rQZV/lSRz7if+TUoM6POU1XdOvEjIgjgKeIhTEye1U0khrIYWCTWw4g==" + }, "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", "dev": true, "requires": { - "inherits": "2.0.1" + "inherits": "2.0.3" }, "dependencies": { "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true } } @@ -18545,102 +16574,19 @@ "es-abstract": "^1.17.2", "has-symbols": "^1.0.1", "object.getownpropertydescriptors": "^2.1.0" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "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.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "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.2", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", - "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", - "dev": true - }, - "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "object-inspect": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", - "dev": true - }, - "object.getownpropertydescriptors": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz", - "integrity": "sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.18.0-next.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.2.tgz", - "integrity": "sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.1", - "object-inspect": "^1.9.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.3", - "string.prototype.trimstart": "^1.0.3" - } - } - } - } } }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "utility-types": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", + "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==" + }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -18648,33 +16594,83 @@ "dev": true }, "uuid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", - "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "optional": true + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, - "v8flags": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.0.1.tgz", - "integrity": "sha1-3Oj8N5wX2fLJ6e142JzgAFKxt2s=", + "v8-to-istanbul": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.1.tgz", + "integrity": "sha512-p0BB09E5FRjx0ELN6RgusIPsSPhtgexSRcKETybEs6IGOTXJSZqfwxp7r//55nnu0f1AxltY5VvdVqy2vZf9AA==", "dev": true, "requires": { - "homedir-polyfill": "^1.0.1" + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } } }, - "validate-npm-package-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "requires": { - "builtins": "^1.0.3" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "validate.io-array": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/validate.io-array/-/validate.io-array-1.0.6.tgz", + "integrity": "sha1-W1osr9j4uFq7L4hroVPy2Tond00=" + }, + "validate.io-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/validate.io-function/-/validate.io-function-1.0.2.tgz", + "integrity": "sha1-NDoZgC7TsZaCaceA5VjpNBHAutc=" + }, + "validate.io-integer": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/validate.io-integer/-/validate.io-integer-1.0.5.tgz", + "integrity": "sha1-FoSWSAuVviJH7EQ/IjPeT4mHgGg=", + "requires": { + "validate.io-number": "^1.0.3" + } + }, + "validate.io-integer-array": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/validate.io-integer-array/-/validate.io-integer-array-1.0.0.tgz", + "integrity": "sha1-LKveAzKTpry+Bj/q/pHq9GsToIk=", + "requires": { + "validate.io-array": "^1.0.3", + "validate.io-integer": "^1.0.4" } }, - "validator": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-12.2.0.tgz", - "integrity": "sha512-jJfE/DW6tIK1Ek8nCfNFqt8Wb3nzMoAbocBF6/Icgg1ZFSBpObdnwVY2jQj6qUqzhx5jc71fpvBWyLGO7Xl+nQ==" + "validate.io-number": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/validate.io-number/-/validate.io-number-1.0.3.tgz", + "integrity": "sha1-9j/+2iSL8opnqNSODjtGGhZluvg=" + }, + "value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" }, "vary": { "version": "1.1.2", @@ -18697,14 +16693,6 @@ "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } } }, "vm-browserify": { @@ -18713,11 +16701,40 @@ "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", "dev": true }, - "void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", - "dev": true + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "requires": { + "xml-name-validator": "^3.0.0" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.x" + } + }, + "warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "requires": { + "loose-envify": "^1.0.0" + } }, "watchpack": { "version": "1.7.5", @@ -18771,6 +16788,35 @@ "dev": true, "optional": true }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, "chokidar": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", @@ -18792,6 +16838,29 @@ "upath": "^1.1.1" } }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, "fsevents": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", @@ -18836,6 +16905,70 @@ "binary-extensions": "^1.0.0" } }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true, + "optional": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, "readdirp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", @@ -18847,6 +16980,26 @@ "micromatch": "^3.1.10", "readable-stream": "^2.0.2" } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } } } }, @@ -18859,14 +17012,16 @@ "minimalistic-assert": "^1.0.0" } }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", - "dev": true, - "requires": { - "defaults": "^1.0.3" - } + "web-vitals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-1.1.1.tgz", + "integrity": "sha512-jYOaqu01Ny1NvMwJ3dBJDUOJ2PGWknZWH4AUnvFOscvbdHMERIKT2TlgiAey5rVyfOePG7so2JcXXZdSnBvioQ==" + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true }, "webpack": { "version": "4.44.2", @@ -18899,46 +17054,129 @@ "webpack-sources": "^1.4.1" }, "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", "dev": true }, - "enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "dependencies": { - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "is-extendable": "^0.1.0" } } } }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, "json5": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", @@ -18959,23 +17197,43 @@ "json5": "^1.0.1" } }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "yallist": "^3.0.2" } }, - "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==", + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "requires": { - "find-up": "^3.0.0" + "glob": "^7.1.3" } }, "schema-utils": { @@ -18989,12 +17247,6 @@ "ajv-keywords": "^3.1.0" } }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, "serialize-javascript": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", @@ -19004,37 +17256,13 @@ "randombytes": "^2.1.0" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true - }, - "terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", "dev": true, "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" + "figgy-pudding": "^3.5.1" } }, "terser-webpack-plugin": { @@ -19054,349 +17282,28 @@ "worker-farm": "^1.7.0" } }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - } - } - }, - "webpack-bundle-analyzer": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.3.2.tgz", - "integrity": "sha512-7qvJLPKB4rRWZGjVp5U1KEjwutbDHSKboAl0IfafnrdXMrgC0tOtZbQD6Rw0u4cmpgRN4O02Fc0t8eAT+FgGzA==", - "dev": true, - "requires": { - "acorn": "^6.0.7", - "acorn-walk": "^6.1.1", - "bfj": "^6.1.1", - "chalk": "^2.4.1", - "commander": "^2.18.0", - "ejs": "^2.6.1", - "express": "^4.16.3", - "filesize": "^3.6.1", - "gzip-size": "^5.0.0", - "lodash": "^4.17.10", - "mkdirp": "^0.5.1", - "opener": "^1.5.1", - "ws": "^6.0.0" - }, - "dependencies": { - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dev": true, - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "body-parser": { - "version": "1.18.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", - "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", - "dev": true, - "requires": { - "bytes": "3.0.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "~1.6.3", - "iconv-lite": "0.4.23", - "on-finished": "~2.3.0", - "qs": "6.5.2", - "raw-body": "2.3.3", - "type-is": "~1.6.16" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "ejs": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", - "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "express": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", - "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "array-flatten": "1.1.1", - "body-parser": "1.18.3", - "content-disposition": "0.5.2", - "content-type": "~1.0.4", - "cookie": "0.3.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.1.1", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.4", - "qs": "6.5.2", - "range-parser": "~1.2.0", - "safe-buffer": "5.1.2", - "send": "0.16.2", - "serve-static": "1.13.2", - "setprototypeof": "1.1.0", - "statuses": "~1.4.0", - "type-is": "~1.6.16", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - } - }, - "finalhandler": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", - "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.4.0", - "unpipe": "~1.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "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==", - "dev": true - }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true - }, - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", - "dev": true - }, - "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", - "dev": true - }, - "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", - "dev": true, - "requires": { - "mime-db": "1.40.0" - } - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.0" - } - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "raw-body": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", - "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", - "dev": true, - "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.3", - "iconv-lite": "0.4.23", - "unpipe": "1.0.0" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" - } - }, - "serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.2", - "send": "0.16.2" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" } }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } } } }, "webpack-dev-middleware": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", - "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", "dev": true, "requires": { "memory-fs": "^0.4.1", @@ -19405,17 +17312,11 @@ "range-parser": "^1.2.1", "webpack-log": "^2.0.0" }, - "dependencies": { - "mime": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.0.tgz", - "integrity": "sha512-ft3WayFSFUVBuJj7BMLKAQcSlItKtfjsKDDsii3rqFDAZ7t11zRe8ASw/GlmivGwVUYtwkQrxiGGpL6gFvB0ag==", - "dev": true - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dependencies": { + "mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", "dev": true } } @@ -19461,6 +17362,21 @@ "yargs": "^13.3.2" }, "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", @@ -19488,6 +17404,41 @@ "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "dev": true }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "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", @@ -19508,13 +17459,85 @@ "upath": "^1.1.1" } }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.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 + }, + "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" + } + } + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "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": { - "ms": "2.1.2" + "locate-path": "^3.0.0" } }, "fsevents": { @@ -19555,6 +17578,28 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + } + }, + "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-absolute-url": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", @@ -19570,12 +17615,99 @@ "binary-extensions": "^1.0.0" } }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "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" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "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" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, "readdirp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", @@ -19587,6 +17719,21 @@ "readable-stream": "^2.0.2" } }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", @@ -19604,6 +17751,52 @@ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "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" + }, + "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 + }, + "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" + } + } + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, "supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", @@ -19613,6 +17806,44 @@ "has-flag": "^3.0.0" } }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "wrap-ansi": { + "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": { + "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 + }, + "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" + } + } + } + }, "ws": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", @@ -19621,6 +17852,34 @@ "requires": { "async-limiter": "~1.0.0" } + }, + "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" + } + }, + "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" + } } } }, @@ -19639,62 +17898,63 @@ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true } } }, - "webpack-merge": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.7.3.tgz", - "integrity": "sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA==", - "dev": true, - "requires": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - } - }, - "webpack-sources": { + "webpack-manifest-plugin": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.2.0.tgz", - "integrity": "sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w==", + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz", + "integrity": "sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ==", "dev": true, "requires": { - "source-list-map": "^2.0.1", - "source-map": "^0.6.1" + "fs-extra": "^7.0.0", + "lodash": ">=3.5 <5", + "object.entries": "^1.1.0", + "tapable": "^1.0.0" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true } } }, - "webpack-subresource-integrity": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.5.2.tgz", - "integrity": "sha512-GBWYBoyalbo5YClwWop9qe6Zclp8CIXYGIz12OPclJhIrSplDxs1Ls1JDMH8xBPPrg1T6ISaTW9Y6zOrwEiAzw==", + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", "dev": true, "requires": { - "webpack-sources": "^1.3.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - } + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" } }, "websocket-driver": { @@ -19714,149 +17974,315 @@ "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-fetch": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", + "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" + }, "whatwg-mimetype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", "dev": true }, + "whatwg-url": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.5.0.tgz", + "integrity": "sha512-fy+R77xWv0AiqfLl4nuGUlQ3/6b5uNfQ4WAbGQVMYshCTCCPK9psC1nWh3XHuxGVCtlcDDQPQW1csmmIQo+fwg==", + "dev": true, + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.0.2", + "webidl-conversions": "^6.1.0" + } + }, "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { "isexe": "^2.0.0" } }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "workbox-background-sync": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-5.1.4.tgz", + "integrity": "sha512-AH6x5pYq4vwQvfRDWH+vfOePfPIYQ00nCEB7dJRU1e0n9+9HMRyvI63FlDvtFT2AvXVRsXvUt7DNMEToyJLpSA==", "dev": true, "requires": { - "string-width": "^1.0.2 || 2" + "workbox-core": "^5.1.4" } }, - "wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true - }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "workbox-broadcast-update": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-5.1.4.tgz", + "integrity": "sha512-HTyTWkqXvHRuqY73XrwvXPud/FN6x3ROzkfFPsRjtw/kGZuZkPzfeH531qdUGfhtwjmtO/ZzXcWErqVzJNdXaA==", "dev": true, "requires": { - "errno": "~0.1.7" + "workbox-core": "^5.1.4" } }, - "worker-plugin": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/worker-plugin/-/worker-plugin-5.0.0.tgz", - "integrity": "sha512-AXMUstURCxDD6yGam2r4E34aJg6kW85IiaeX72hi+I1cxyaMUtrvVY6sbfpGKAj5e7f68Acl62BjQF5aOOx2IQ==", + "workbox-build": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-5.1.4.tgz", + "integrity": "sha512-xUcZn6SYU8usjOlfLb9Y2/f86Gdo+fy1fXgH8tJHjxgpo53VVsqRX0lUDw8/JuyzNmXuo8vXX14pXX2oIm9Bow==", "dev": true, "requires": { - "loader-utils": "^1.1.0" + "@babel/core": "^7.8.4", + "@babel/preset-env": "^7.8.4", + "@babel/runtime": "^7.8.4", + "@hapi/joi": "^15.1.0", + "@rollup/plugin-node-resolve": "^7.1.1", + "@rollup/plugin-replace": "^2.3.1", + "@surma/rollup-plugin-off-main-thread": "^1.1.1", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^8.1.0", + "glob": "^7.1.6", + "lodash.template": "^4.5.0", + "pretty-bytes": "^5.3.0", + "rollup": "^1.31.1", + "rollup-plugin-babel": "^4.3.3", + "rollup-plugin-terser": "^5.3.1", + "source-map": "^0.7.3", + "source-map-url": "^0.4.0", + "stringify-object": "^3.3.0", + "strip-comments": "^1.0.2", + "tempy": "^0.3.0", + "upath": "^1.2.0", + "workbox-background-sync": "^5.1.4", + "workbox-broadcast-update": "^5.1.4", + "workbox-cacheable-response": "^5.1.4", + "workbox-core": "^5.1.4", + "workbox-expiration": "^5.1.4", + "workbox-google-analytics": "^5.1.4", + "workbox-navigation-preload": "^5.1.4", + "workbox-precaching": "^5.1.4", + "workbox-range-requests": "^5.1.4", + "workbox-routing": "^5.1.4", + "workbox-strategies": "^5.1.4", + "workbox-streams": "^5.1.4", + "workbox-sw": "^5.1.4", + "workbox-window": "^5.1.4" }, "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "requires": { - "minimist": "^1.2.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "dev": true, "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" + "graceful-fs": "^4.1.6" } + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true } } }, + "workbox-cacheable-response": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-5.1.4.tgz", + "integrity": "sha512-0bfvMZs0Of1S5cdswfQK0BXt6ulU5kVD4lwer2CeI+03czHprXR3V4Y8lPTooamn7eHP8Iywi5QjyAMjw0qauA==", + "dev": true, + "requires": { + "workbox-core": "^5.1.4" + } + }, + "workbox-core": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-5.1.4.tgz", + "integrity": "sha512-+4iRQan/1D8I81nR2L5vcbaaFskZC2CL17TLbvWVzQ4qiF/ytOGF6XeV54pVxAvKUtkLANhk8TyIUMtiMw2oDg==", + "dev": true + }, + "workbox-expiration": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-5.1.4.tgz", + "integrity": "sha512-oDO/5iC65h2Eq7jctAv858W2+CeRW5e0jZBMNRXpzp0ZPvuT6GblUiHnAsC5W5lANs1QS9atVOm4ifrBiYY7AQ==", + "dev": true, + "requires": { + "workbox-core": "^5.1.4" + } + }, + "workbox-google-analytics": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-5.1.4.tgz", + "integrity": "sha512-0IFhKoEVrreHpKgcOoddV+oIaVXBFKXUzJVBI+nb0bxmcwYuZMdteBTp8AEDJacENtc9xbR0wa9RDCnYsCDLjA==", + "dev": true, + "requires": { + "workbox-background-sync": "^5.1.4", + "workbox-core": "^5.1.4", + "workbox-routing": "^5.1.4", + "workbox-strategies": "^5.1.4" + } + }, + "workbox-navigation-preload": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-5.1.4.tgz", + "integrity": "sha512-Wf03osvK0wTflAfKXba//QmWC5BIaIZARU03JIhAEO2wSB2BDROWI8Q/zmianf54kdV7e1eLaIEZhth4K4MyfQ==", + "dev": true, + "requires": { + "workbox-core": "^5.1.4" + } + }, + "workbox-precaching": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-5.1.4.tgz", + "integrity": "sha512-gCIFrBXmVQLFwvAzuGLCmkUYGVhBb7D1k/IL7pUJUO5xacjLcFUaLnnsoVepBGAiKw34HU1y/YuqvTKim9qAZA==", + "dev": true, + "requires": { + "workbox-core": "^5.1.4" + } + }, + "workbox-range-requests": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-5.1.4.tgz", + "integrity": "sha512-1HSujLjgTeoxHrMR2muDW2dKdxqCGMc1KbeyGcmjZZAizJTFwu7CWLDmLv6O1ceWYrhfuLFJO+umYMddk2XMhw==", + "dev": true, + "requires": { + "workbox-core": "^5.1.4" + } + }, + "workbox-routing": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-5.1.4.tgz", + "integrity": "sha512-8ljknRfqE1vEQtnMtzfksL+UXO822jJlHTIR7+BtJuxQ17+WPZfsHqvk1ynR/v0EHik4x2+826Hkwpgh4GKDCw==", + "dev": true, + "requires": { + "workbox-core": "^5.1.4" + } + }, + "workbox-strategies": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-5.1.4.tgz", + "integrity": "sha512-VVS57LpaJTdjW3RgZvPwX0NlhNmscR7OQ9bP+N/34cYMDzXLyA6kqWffP6QKXSkca1OFo/v6v7hW7zrrguo6EA==", + "dev": true, + "requires": { + "workbox-core": "^5.1.4", + "workbox-routing": "^5.1.4" + } + }, + "workbox-streams": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-5.1.4.tgz", + "integrity": "sha512-xU8yuF1hI/XcVhJUAfbQLa1guQUhdLMPQJkdT0kn6HP5CwiPOGiXnSFq80rAG4b1kJUChQQIGPrq439FQUNVrw==", + "dev": true, + "requires": { + "workbox-core": "^5.1.4", + "workbox-routing": "^5.1.4" + } + }, + "workbox-sw": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-5.1.4.tgz", + "integrity": "sha512-9xKnKw95aXwSNc8kk8gki4HU0g0W6KXu+xks7wFuC7h0sembFnTrKtckqZxbSod41TDaGh+gWUA5IRXrL0ECRA==", + "dev": true + }, + "workbox-webpack-plugin": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-5.1.4.tgz", + "integrity": "sha512-PZafF4HpugZndqISi3rZ4ZK4A4DxO8rAqt2FwRptgsDx7NF8TVKP86/huHquUsRjMGQllsNdn4FNl8CD/UvKmQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.5.5", + "fast-json-stable-stringify": "^2.0.0", + "source-map-url": "^0.4.0", + "upath": "^1.1.2", + "webpack-sources": "^1.3.0", + "workbox-build": "^5.1.4" + } + }, + "workbox-window": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-5.1.4.tgz", + "integrity": "sha512-vXQtgTeMCUq/4pBWMfQX8Ee7N2wVC4Q7XYFqLnfbXJ2hqew/cU1uMTD2KqGEgEpE4/30luxIxgE+LkIa8glBYw==", + "dev": true, + "requires": { + "workbox-core": "^5.1.4" + } + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "worker-rpc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", + "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", + "dev": true, + "requires": { + "microevent.ts": "~0.1.1" + } + }, "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } } }, "wrappy": { @@ -19865,114 +18291,83 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "ws": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.2.tgz", - "integrity": "sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA==", - "dev": true - }, - "xml-formatter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml-formatter/-/xml-formatter-1.0.1.tgz", - "integrity": "sha1-OAgz3dC86iwJht7+u6cfhDhPNT0=", + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, "requires": { - "xml-parser-xo": "^2.1.1" + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" } }, - "xml-parser-xo": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/xml-parser-xo/-/xml-parser-xo-2.1.3.tgz", - "integrity": "sha1-TqjrhW36TddcSrVLJRVY3grcHGE=", - "requires": { - "debug": "^2.2.0" - } + "ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "dev": true }, - "xmlhttprequest-ssl": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", - "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true }, "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, "yaml": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", - "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true }, "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.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", + "string-width": "^4.2.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 - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "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" - } - } + "yargs-parser": "^18.1.2" } }, "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "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", @@ -19987,49 +18382,11 @@ } } }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", - "dev": true - }, - "yn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", - "dev": true - }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true - }, - "z-schema": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.0.tgz", - "integrity": "sha512-58TxNEurHQEEgbrNbQnoUHXgh6tiplSvKb7D3o4K6KzICQk9vFyl8B0zycC/p3gW92qBZCmq5NJIhJODKrV7JQ==", - "requires": { - "commander": "^2.7.1", - "lodash.get": "^4.4.2", - "lodash.isequal": "^4.5.0", - "validator": "^12.0.0" - } - }, - "zone.js": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.3.tgz", - "integrity": "sha512-Y4hTHoh4VcxU5BDGAqEoOnOiyT254w6CiHtpQxAJUSMZPyVgdbKf+5R7Mwz6xsPhMIeBXk5rTopRZDpjssTCUg==", - "requires": { - "tslib": "^2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" - } - } } } } diff --git a/ui/package.json b/ui/package.json index 9dd290529..1046146a3 100644 --- a/ui/package.json +++ b/ui/package.json @@ -1,79 +1,75 @@ { "name": "ui", - "version": "0.0.0", - "license": "MIT", - "scripts": { - "ng": "ng", - "start": "ng serve --proxy-config proxy.conf.json", - "build": "ng build", - "test": "ng test --code-coverage --source-map=true", - "lint": "ng lint", - "e2e": "ng e2e", - "build:static": "sass src/static.scss ./dist/unsecured/static.css", - "copy:static": "node ./build", - "copy": "npm run copy:static && npm run build:static", - "buildProd": "ng build --prod && npm run copy", - "bundle-report": "webpack-bundle-analyzer dist/stats.json" - }, + "version": "0.1.0", "private": true, "dependencies": { - "@angular/animations": "11.1.0", - "@angular/cdk": "^11.1.0", - "@angular/common": "11.1.0", - "@angular/compiler": "11.1.0", - "@angular/core": "11.1.0", - "@angular/forms": "11.1.0", - "@angular/platform-browser": "11.1.0", - "@angular/platform-browser-dynamic": "11.1.0", - "@angular/router": "11.1.0", - "@ng-bootstrap/ng-bootstrap": "9.0.2", - "@ngrx/effects": "10.1.2", - "@ngrx/entity": "10.1.2", - "@ngrx/router-store": "10.1.2", - "@ngrx/store": "10.1.2", - "@ngrx/store-devtools": "10.1.2", + "@fortawesome/fontawesome-free": "^5.15.3", + "@fortawesome/fontawesome-svg-core": "^1.2.35", + "@fortawesome/free-regular-svg-icons": "^5.15.3", + "@fortawesome/free-solid-svg-icons": "^5.15.3", + "@fortawesome/react-fontawesome": "^0.1.14", + "@rjsf/bootstrap-4": "^2.5.1", + "@rjsf/core": "^2.5.1", "bootstrap": "^4.6.0", - "core-js": "^2.4.1", + "date-fns": "^2.21.1", "deep-object-diff": "^1.1.0", - "deepmerge": "^2.2.1", - "file-saver": "^1.3.3", - "font-awesome": "^4.7.0", - "jexl": "^2.3.0", - "ngx-infinite-scroll": "^7.2.0", - "ngx-schema-form": "2.6.0", - "rxjs": "^6.6.3", - "tslib": "^2.0.0", - "xml-formatter": "^1.0.1", - "z-schema": "^5.0.0", - "zone.js": "~0.11.3" + "file-saver": "^2.0.5", + "lodash": "^4.17.21", + "prop-types": "^15.7.2", + "query-string": "^7.0.0", + "react": "^17.0.2", + "react-bootstrap": "^1.5.2", + "react-bootstrap-typeahead": "^5.1.4", + "react-contenteditable": "^3.3.5", + "react-dom": "^17.0.2", + "react-hook-form": "^7.5.2", + "react-infinite-scroll-component": "^6.1.0", + "react-router-dom": "^5.2.0", + "react-scroll": "^1.8.2", + "use-http": "^1.0.20", + "use-query-params": "^1.2.2", + "web-vitals": "^1.0.1" }, "devDependencies": { - "@angular-devkit/build-angular": "~0.1101.1", - "@angular/cli": "^11.1.1", - "@angular/compiler-cli": "^11.1.0", - "@angular/language-service": "^11.1.0", - "@angular/localize": "^11.1.0", - "@types/file-saver": "^1.3.0", - "@types/jasmine": "~3.6.0", - "@types/jasminewd2": "~2.0.6", - "@types/node": "^12.11.1", - "codelyzer": "^6.0.1", - "fs-extra": "^7.0.1", - "jasmine-core": "~3.6.0", - "jasmine-marbles": "^0.5.0", - "jasmine-spec-reporter": "~5.0.0", - "karma": "~5.0.0", - "karma-chrome-launcher": "~3.1.0", - "karma-cli": "^2.0.0", - "karma-jasmine": "~4.0.0", - "karma-jasmine-html-reporter": "^1.5.0", - "karma-coverage": "^2.0.3", - "karma-spec-reporter": "0.0.32", - "ncp": "^2.0.0", - "path": "^0.12.7", - "ts-node": "~3.2.0", - "tslint": "~6.1.0", - "typescript": "4.1.3", - "webpack-bundle-analyzer": "^3.3.2" + "@testing-library/jest-dom": "^5.13.0", + "@testing-library/react": "^11.2.7", + "@testing-library/user-event": "^12.1.10", + "http-proxy-middleware": "^1.2.0", + "react-scripts": "4.0.3", + "sass": "1.32.11" + }, + "scripts": { + "start": "react-scripts start", + "build": "GENERATE_SOURCEMAP=true react-scripts build", + "buildProd": "react-scripts build && npm run copy", + "test": "react-scripts test", + "eject": "react-scripts eject", + "build:static": "sass src/static.scss ./build/unsecured/static.css", + "copy:static": "node ./build", + "copy": "npm run copy:static && npm run build:static" + }, + "jest": { + "collectCoverageFrom": [ + "src/**/*.{js,jsx}", + "!src/test/**/*.*" + ] + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] } } diff --git a/ui/protractor.conf.js b/ui/protractor.conf.js deleted file mode 100644 index cc76abe2f..000000000 --- a/ui/protractor.conf.js +++ /dev/null @@ -1,28 +0,0 @@ -// Protractor configuration file, see link for more information -// https://github.com/angular/protractor/blob/master/lib/config.ts - -const { SpecReporter } = require('jasmine-spec-reporter'); - -exports.config = { - allScriptsTimeout: 11000, - specs: [ - './e2e/**/*.e2e-spec.ts' - ], - capabilities: { - 'browserName': 'chrome' - }, - directConnect: true, - baseUrl: 'http://localhost:4200/', - framework: 'jasmine', - jasmineNodeOpts: { - showColors: true, - defaultTimeoutInterval: 30000, - print: function () { } - }, - onPrepare() { - require('ts-node').register({ - project: 'e2e/tsconfig.e2e.json' - }); - jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); - } -}; diff --git a/ui/proxy.conf.json b/ui/proxy.conf.json deleted file mode 100644 index be9b3e364..000000000 --- a/ui/proxy.conf.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "/api": { - "target": "http://localhost:8080", - "secure": false, - "logLevel": "debug" - }, - "/actuator": { - "target": "http://localhost:8080", - "secure": false, - "logLevel": "debug" - }, - "/login": { - "target": "http://localhost:8080", - "secure": false, - "logLevel": "debug" - }, - "/logout": { - "target": "http://localhost:8080", - "secure": false, - "logLevel": "debug" - } -} diff --git a/ui/src/assets/favicon-96x96.png b/ui/public/assets/favicon-96x96.png similarity index 100% rename from ui/src/assets/favicon-96x96.png rename to ui/public/assets/favicon-96x96.png diff --git a/ui/src/assets/logo_internet2.png b/ui/public/assets/logo_internet2.png similarity index 100% rename from ui/src/assets/logo_internet2.png rename to ui/public/assets/logo_internet2.png diff --git a/ui/src/assets/logo_unicon.png b/ui/public/assets/logo_unicon.png similarity index 100% rename from ui/src/assets/logo_unicon.png rename to ui/public/assets/logo_unicon.png diff --git a/ui/public/assets/schema/attribute/attribute.schema.json b/ui/public/assets/schema/attribute/attribute.schema.json new file mode 100644 index 000000000..cc99dc3a6 --- /dev/null +++ b/ui/public/assets/schema/attribute/attribute.schema.json @@ -0,0 +1,102 @@ +{ + "type": "object", + "required": [ + "name", + "attributeType" + ], + "properties": { + "name": { + "title": "label.entity-attribute-name", + "description": "tooltip.entity-attribute-name", + "type": "string", + "minLength": 1, + "maxLength": 255 + }, + "attributeType": { + "title": "label.entity-attribute-type", + "description": "tooltip.entity-attribute-type", + "type": "string", + "enum": [ + "STRING", + "BOOLEAN", + "SELECTION_LIST" + ], + "enumNames": [ + "value.string", + "value.boolean", + "value.list" + ] + }, + "helpText": { + "title": "label.entity-attribute-help", + "description": "tooltip.entity-attribute-help", + "type": "string", + "minLength": 1, + "maxLength": 255 + } + }, + "dependencies": { + "attributeType": { + "oneOf": [ + { + "properties": { + "attributeType": { + "enum": [ + "STRING" + ] + }, + "defaultValueString": { + "title": "label.entity-attribute-default", + "description": "tooltip.entity-attribute-default", + "type": "string" + } + } + }, + { + "properties": { + "attributeType": { + "enum": [ + "BOOLEAN" + ] + }, + "defaultValueBoolean": { + "title": "label.entity-attribute-default", + "description": "tooltip.entity-attribute-default", + "type": "boolean", + "default": true, + "enumNames": ["True", "False"] + } + } + }, + { + "properties": { + "attributeType": { + "enum": [ + "SELECTION_LIST" + ] + }, + "customAttrListDefinitions": { + "title": "label.entity-attribute-list-options", + "description": "tooltip.entity-attribute-list-options", + "type": "array", + "items": { + "title": "label.list-options", + "type": "object", + "properties": { + "value": { + "type": "string", + "placeholder": "Option" + }, + "default": { + "type": "boolean", + "default": false + } + } + } + } + } + } + ] + } + } +} \ No newline at end of file diff --git a/ui/public/assets/schema/filter/entity-attributes.schema.json b/ui/public/assets/schema/filter/entity-attributes.schema.json new file mode 100644 index 000000000..e754c4983 --- /dev/null +++ b/ui/public/assets/schema/filter/entity-attributes.schema.json @@ -0,0 +1,181 @@ +{ + "type": "object", + "properties": { + "name": { + "title": "label.filter-name", + "description": "tooltip.filter-name", + "type": "string" + }, + "@type": { + "type": "string", + "default": "EntityAttributes" + }, + "resourceId": { + "type": "string" + }, + "version": { + "type": "integer" + }, + "filterEnabled": { + "title": "label.enable-filter", + "description": "tooltip.enable-filter", + "type": "boolean", + "default": false + }, + "entityAttributesFilterTarget": { + "title": "label.search-criteria", + "description": "tooltip.search-criteria", + "type": "object", + "properties": { + "entityAttributesFilterTargetType": { + "title": "label.filter-target-type", + "type": "string", + "default": "ENTITY", + "enum": [ + "ENTITY", + "REGEX", + "CONDITION_SCRIPT" + ], + "enumNames": [ + "value.entity-id", + "value.regex", + "value.script" + ] + }, + "value": { + "title": "label.filter-target-value", + "type": "array", + "buttons": [ + { + "id": "preview", + "label": "action.preview", + "widget": "icon-button" + } + ], + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string" + } + } + }, + "required": [ + "value", + "entityAttributesFilterTargetType" + ] + }, + "relyingPartyOverrides": { + "type": "object", + "properties": { + "signAssertion": { + "title": "label.sign-the-assertion", + "description": "tooltip.sign-assertion", + "type": "boolean" + }, + "dontSignResponse": { + "title": "label.dont-sign-the-response", + "description": "tooltip.dont-sign-response", + "type": "boolean" + }, + "turnOffEncryption": { + "title": "label.turn-off-encryption-of-response", + "description": "tooltip.turn-off-encryption", + "type": "boolean" + }, + "useSha": { + "title": "label.use-sha1-signing-algorithm", + "description": "tooltip.usa-sha-algorithm", + "type": "boolean" + }, + "ignoreAuthenticationMethod": { + "title": "label.ignore-any-sp-requested-authentication-method", + "description": "tooltip.ignore-auth-method", + "type": "boolean" + }, + "omitNotBefore": { + "title": "label.omit-not-before-condition", + "description": "tooltip.omit-not-before-condition", + "type": "boolean" + }, + "responderId": { + "title": "label.responder-id", + "description": "tooltip.responder-id", + "type": "string" + }, + "nameIdFormats": { + "$ref": "#/definitions/nameIdFormats" + }, + "authenticationMethods": { + "$ref": "#/definitions/authenticationMethods" + }, + "forceAuthn": { + "title": "label.force-authn", + "description": "tooltip.force-authn", + "type": "boolean", + "default": false + } + } + }, + "attributeRelease": { + "title": "label.attribute-release", + "type": "array", + "description": "Attribute release table - select the attributes you want to release (default unchecked)", + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "eduPersonPrincipalName", + "uid", + "mail", + "surname", + "givenName", + "eduPersonAffiliation", + "eduPersonScopedAffiliation", + "eduPersonPrimaryAffiliation", + "eduPersonEntitlement", + "eduPersonAssurance", + "eduPersonUniqueId", + "employeeNumber" + ] + } + } + }, + "required": [ + "name" + ], + "definitions": { + "nameIdFormats": { + "title": "label.nameid-format-to-send", + "description": "tooltip.nameid-format", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "examples": [ + "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified", + "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress", + "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent", + "urn:oasis:names:tc:SAML:2.0:nameid-format:transient" + ] + } + }, + "authenticationMethods": { + "title": "label.authentication-methods-to-use", + "description": "tooltip.authentication-methods-to-use", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "examples": [ + "https://refeds.org/profile/mfa", + "urn:oasis:names:tc:SAML:2.0:ac:classes:TimeSyncToken", + "urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport" + ] + } + } + } +} \ No newline at end of file diff --git a/ui/src/assets/schema/filter/nameid.schema.json b/ui/public/assets/schema/filter/nameid.schema.json similarity index 71% rename from ui/src/assets/schema/filter/nameid.schema.json rename to ui/public/assets/schema/filter/nameid.schema.json index 2ddb21915..72733bf07 100644 --- a/ui/src/assets/schema/filter/nameid.schema.json +++ b/ui/public/assets/schema/filter/nameid.schema.json @@ -1,25 +1,5 @@ { "type": "object", - "fieldsets": [ - { - "type": "group-lg", - "fields": [ - "name", - "nameIdFormatFilterTarget", - "filterEnabled", - "@type", - "resourceId", - "version", - "removeExistingFormats" - ] - }, - { - "type": "group", - "fields": [ - "formats" - ] - } - ], "required": [ "name" ], @@ -43,37 +23,24 @@ "title": "label.search-criteria", "description": "tooltip.search-criteria", "type": "object", - "widget": { - "id": "filter-target", - "target": "nameIdFormatFilterTargetType" - }, "properties": { "nameIdFormatFilterTargetType": { "title": "", "type": "string", "default": "ENTITY", - "oneOf": [ - { - "enum": [ - "ENTITY" - ], - "description": "value.entity-id" - }, - { - "enum": [ - "REGEX" - ], - "description": "value.regex" - }, - { - "enum": [ - "CONDITION_SCRIPT" - ], - "description": "value.script" - } + "enum": [ + "ENTITY", + "REGEX", + "CONDITION_SCRIPT" + ], + "enumNames": [ + "value.entity-id", + "value.regex", + "value.script" ] }, "value": { + "title": "label.filter-target-value", "type": "array", "buttons": [ { diff --git a/ui/src/assets/schema/provider/dynamic-http.schema.json b/ui/public/assets/schema/provider/dynamic-http.schema.json similarity index 59% rename from ui/src/assets/schema/provider/dynamic-http.schema.json rename to ui/public/assets/schema/provider/dynamic-http.schema.json index 1969c9ab4..a948e7be6 100644 --- a/ui/src/assets/schema/provider/dynamic-http.schema.json +++ b/ui/public/assets/schema/provider/dynamic-http.schema.json @@ -1,11 +1,23 @@ { "type": "object", "required": [ + "name", + "@type", "xmlId", - "metadataURL", "metadataRequestURLConstructionScheme" ], "properties": { + "name": { + "title": "label.metadata-provider-name-dashboard-display-only", + "description": "tooltip.metadata-provider-name-dashboard-display-only", + "type": "string" + }, + "@type": { + "title": "label.metadata-provider-type", + "description": "tooltip.metadata-provider-type", + "type": "string", + "const": "DynamicHttpMetadataResolver" + }, "enabled": { "title": "label.enable-provider-upon-saving", "description": "tooltip.enable-provider-upon-saving", @@ -16,7 +28,6 @@ "title": "label.xml-id", "description": "tooltip.xml-id", "type": "string", - "default": "", "minLength": 1 }, "metadataRequestURLConstructionScheme": { @@ -25,6 +36,48 @@ "@type", "content" ], + "dependencies": { + "@type": { + "oneOf": [ + { + "properties": { + "@type": { + "enum": [ + "Regex" + ] + }, + "match": { + "title": "label.match", + "description": "tooltip.match", + "type": "string", + "widget": { + "id": "string", + "required": true + } + } + }, + "required": [ + "@type", + "content", + "match" + ] + }, + { + "properties": { + "@type": { + "enum": [ + "MetadataQueryProtocol" + ] + } + }, + "required": [ + "@type", + "content" + ] + } + ] + } + }, "properties": { "@type": { "title": "label.md-request-type", @@ -33,267 +86,105 @@ "widget": { "id": "select" }, - "oneOf": [ - { - "enum": [ - "MetadataQueryProtocol" - ], - "description": "value.md-query-protocol" - }, - { - "enum": [ - "Regex" - ], - "description": "value.regex" - } + "enum": [ + "MetadataQueryProtocol", + "Regex" ] }, "content": { "title": "label.md-request-value", "description": "tooltip.md-request-value", "type": "string" - }, - "match": { - "title": "label.match", - "description": "tooltip.match", - "type": "string", - "visibleIf": { - "@type": [ - "Regex" - ] - } } } }, "requireValidMetadata": { "title": "label.require-valid-metadata", "description": "tooltip.require-valid-metadata", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ], - "default": true + "type": "boolean" }, "failFastInitialization": { "title": "label.fail-fast-init", "description": "tooltip.fail-fast-init", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ], - "default": true + "type": "boolean" }, "dynamicMetadataResolverAttributes": { "type": "object", + "dependencies": { + "initializeFromPersistentCacheInBackground": { + "oneOf": [ + { + "properties": { + "initializeFromPersistentCacheInBackground": { + "enum": [true] + }, + "backgroundInitializationFromCacheDelay": { + "title": "label.background-init-from-cache-delay", + "description": "tooltip.background-init-from-cache-delay", + "type": "string", + "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" + } + } + }, + { + "properties": { + "initializeFromPersistentCacheInBackground": { + "enum": [false] + } + } + + } + ] + } + }, "properties": { "refreshDelayFactor": { "title": "label.refresh-delay-factor", "description": "tooltip.refresh-delay-factor", "type": "number", - "widget": { - "id": "number", - "step": 0.01 - }, - "placeholder": "label.real-number", - "minimum": 0.01, - "maximum": 0.99, - "default": null + "multipleOf": 0.01, + "minimum": 0.001, + "maximum": 0.999 }, "minCacheDuration": { "title": "label.min-cache-duration", "description": "tooltip.min-cache-duration", "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" }, "maxCacheDuration": { "title": "label.max-cache-duration", "description": "tooltip.max-cache-duration", "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" }, "maxIdleEntityData": { "title": "label.max-idle-entity-data", "description": "tooltip.max-idle-entity-data", "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" }, "removeIdleEntityData": { "title": "label.remove-idle-entity-data", "description": "tooltip.remove-idle-entity-data", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ], - "default": true + "type": "boolean" }, "cleanupTaskInterval": { "title": "label.cleanup-task-interval", "description": "tooltip.cleanup-task-interval", "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" }, "persistentCacheManagerDirectory": { "title": "label.persistent-cache-manager-directory", "description": "tooltip.persistent-cache-manager-directory", "type": "string", - "default": "", "minLength": 1 }, "initializeFromPersistentCacheInBackground": { "title": "label.initialize-from-persistent-cache-in-background", "description": "tooltip.initialize-from-persistent-cache-in-background", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ], - "default": true - }, - "backgroundInitializationFromCacheDelay": { - "title": "label.background-init-from-cache-delay", - "description": "tooltip.background-init-from-cache-delay", - "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "visibleIf": { - "initializeFromPersistentCacheInBackground": [ - true - ] - }, - "default": null, - "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" + "type": "boolean" } } }, @@ -355,39 +246,18 @@ "disregardTLSCertificate": { "type": "boolean", "title": "label.disregard-tls-cert", - "description": "tooltip.disregard-tls-cert", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "True" - }, - { - "enum": [ - false - ], - "description": "False" - } - ], - "default": false + "description": "tooltip.disregard-tls-cert" }, "httpClientRef": { "type": "string", "title": "", "description": "", - "placeholder": "", - "widget": "hidden", - "default": "" + "widget": "hidden" }, "connectionRequestTimeout": { "type": "string", "title": "label.connection-request-timeout", "description": "tooltip.connection-request-timeout", - "placeholder": "label.duration", "widget": { "id": "datalist", "data": [ @@ -402,14 +272,12 @@ "PT24H" ] }, - "default": null, "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" }, "connectionTimeout": { "type": "string", "title": "label.connection-timeout", "description": "tooltip.connection-timeout", - "placeholder": "label.duration", "widget": { "id": "datalist", "data": [ @@ -424,14 +292,12 @@ "PT24H" ] }, - "default": null, "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" }, "socketTimeout": { "type": "string", "title": "label.socket-timeout", "description": "tooltip.socket-timeout", - "placeholder": "label.duration", "widget": { "id": "datalist", "data": [ @@ -446,58 +312,42 @@ "PT24H" ] }, - "default": null, "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" }, "tlsTrustEngineRef": { "type": "string", "title": "", - "description": "", - "placeholder": "", - "widget": "hidden", - "default": "" + "description": "" }, "httpClientSecurityParametersRef": { "type": "string", "title": "", - "description": "", - "placeholder": "", - "widget": "hidden", - "default": "" + "description": "" }, "proxyHost": { "type": "string", "title": "label.proxy-host", - "description": "tooltip.proxy-host", - "placeholder": "", - "default": "" + "description": "tooltip.proxy-host" }, "proxyPort": { "type": "string", "title": "label.proxy-port", - "description": "tooltip.proxy-port", - "placeholder": "", - "default": "" + "description": "tooltip.proxy-port" }, "proxyUser": { "type": "string", "title": "label.proxy-user", - "description": "tooltip.proxy-user", - "placeholder": "", - "default": "" + "description": "tooltip.proxy-user" }, "proxyPassword": { "type": "string", "title": "label.proxy-password", - "description": "tooltip.proxy-password", - "placeholder": "", - "default": "" + "description": "tooltip.proxy-password" }, "httpCaching": { "type": "string", "title": "label.http-caching", "description": "tooltip.http-caching", - "placeholder": "label.select-caching-type", "widget": { "id": "select" }, @@ -525,114 +375,107 @@ "httpCacheDirectory": { "type": "string", "title": "label.http-caching-directory", - "description": "tooltip.http-caching-directory", - "placeholder": "" + "description": "tooltip.http-caching-directory" }, "httpMaxCacheEntries": { "type": "integer", "title": "label.http-max-cache-entries", "description": "tooltip.http-max-cache-entries", - "placeholder": "", - "default": 0, "minimum": 0 }, "httpMaxCacheEntrySize": { "type": "integer", "title": "label.max-cache-entry-size", "description": "tooltip.max-cache-entry-size", - "placeholder": "", - "default": 0, "minimum": 0 } } }, "metadataFilters": { + "$id": "metadataFilters", "title": "", "description": "", - "type": "object", - "properties": { - "RequiredValidUntil": { + "type": "array", + "items": [ + { + "$id": "RequiredValidUntil", "title": "label.required-valid-until", "type": "object", "widget": { "id": "fieldset" }, "properties": { + "@type": { + "type": "string", + "default": "RequiredValidUntil" + }, "maxValidityInterval": { "title": "label.max-validity-interval", "description": "tooltip.max-validity-interval", "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" } } }, - "SignatureValidation": { + { + "$id": "SignatureValidation", "title": "label.signature-validation-filter", "type": "object", "widget": { "id": "fieldset" }, "properties": { + "@type": { + "type": "string", + "default": "SignatureValidation" + }, "requireSignedRoot": { "title": "label.require-signed-root", "description": "tooltip.require-signed-root", - "type": "boolean", - "default": true + "type": "boolean" }, "certificateFile": { "title": "label.certificate-file", "description": "tooltip.certificate-file", - "type": "string", - "default": "" + "type": "string" } }, - "anyOf": [ - { - "properties": { - "requireSignedRoot": { - "enum": [ - true + "dependencies": { + "requireSignedRoot": { + "oneOf": [ + { + "properties": { + "requireSignedRoot": { + "const": true + } + }, + "required": [ + "certificateFile" ] + }, + { + "properties": { + "requireSignedRoot": { + "const": false + } + } } - }, - "required": [ - "certificateFile" ] - }, - { - "properties": { - "requireSignedRoot": { - "enum": [ - false - ] - } - } } - ] + } }, - "EntityRoleWhiteList": { + { + "$id": "EntityRoleWhiteList", "title": "label.entity-role-whitelist", "type": "object", "widget": { "id": "fieldset" }, "properties": { + "@type": { + "type": "string", + "default": "EntityRoleWhiteList" + }, "retainedRoles": { "title": "label.retained-roles", "description": "tooltip.retained-roles", @@ -642,37 +485,29 @@ "id": "select" }, "type": "string", - "oneOf": [ - { - "enum": [ - "SPSSODescriptor" - ], - "description": "value.spdescriptor" - }, - { - "enum": [ - "AttributeAuthorityDescriptor" - ], - "description": "value.attr-auth-descriptor" - } + "enum": [ + "SPSSODescriptor", + "AttributeAuthorityDescriptor" + ], + "enumNames": [ + "value.spdescriptor", + "value.attr-auth-descriptor" ] } }, "removeRolelessEntityDescriptors": { "title": "label.remove-roleless-entity-descriptors", "description": "tooltip.remove-roleless-entity-descriptors", - "type": "boolean", - "default": true + "type": "boolean" }, "removeEmptyEntitiesDescriptors": { "title": "label.remove-empty-entities-descriptors", "description": "tooltip.remove-empty-entities-descriptors", - "type": "boolean", - "default": true + "type": "boolean" } } } - } + ] } } } \ No newline at end of file diff --git a/ui/public/assets/schema/provider/file-system.schema.json b/ui/public/assets/schema/provider/file-system.schema.json new file mode 100644 index 000000000..38d0d90e3 --- /dev/null +++ b/ui/public/assets/schema/provider/file-system.schema.json @@ -0,0 +1,74 @@ +{ + "type": "object", + "required": [ + "name", + "@type", + "xmlId", + "metadataFile" + ], + "properties": { + "name": { + "title": "label.metadata-provider-name-dashboard-display-only", + "description": "tooltip.metadata-provider-name-dashboard-display-only", + "type": "string", + "widget": { + "id": "string", + "help": "message.must-be-unique" + } + }, + "@type": { + "title": "label.metadata-provider-type", + "description": "tooltip.metadata-provider-type", + "type": "string", + "const": "FilesystemMetadataResolver" + }, + "xmlId": { + "title": "label.xml-id", + "description": "tooltip.xml-id", + "type": "string", + "minLength": 1 + }, + "metadataFile": { + "title": "label.metadata-file", + "description": "tooltip.metadata-file", + "type": "string", + "minLength": 1 + }, + "enabled": { + "title": "label.enable-provider-upon-saving", + "description": "tooltip.enable-provider-upon-saving", + "type": "boolean", + "default": false + }, + "doInitialization": { + "title": "label.do-resolver-initialization", + "description": "tooltip.do-resolver-initialization", + "type": "boolean" + }, + "reloadableMetadataResolverAttributes": { + "type": "object", + "properties": { + "minRefreshDelay": { + "title": "label.min-refresh-delay", + "description": "tooltip.min-refresh-delay", + "type": "string", + "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" + }, + "maxRefreshDelay": { + "title": "label.max-refresh-delay", + "description": "tooltip.max-refresh-delay", + "type": "string", + "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" + }, + "refreshDelayFactor": { + "title": "label.refresh-delay-factor", + "description": "tooltip.refresh-delay-factor", + "type": "number", + "multipleOf": 0.01, + "minimum": 0.001, + "maximum": 0.999 + } + } + } + } +} \ No newline at end of file diff --git a/ui/src/assets/schema/provider/filebacked-http.schema.json b/ui/public/assets/schema/provider/filebacked-http.schema.json similarity index 56% rename from ui/src/assets/schema/provider/filebacked-http.schema.json rename to ui/public/assets/schema/provider/filebacked-http.schema.json index 505fe6ebd..a85d1e400 100644 --- a/ui/src/assets/schema/provider/filebacked-http.schema.json +++ b/ui/public/assets/schema/provider/filebacked-http.schema.json @@ -38,21 +38,8 @@ "@type": { "title": "label.metadata-provider-type", "description": "tooltip.metadata-provider-type", - "placeholder": "label.select-metadata-type", "type": "string", - "readOnly": true, - "widget": { - "id": "select", - "disabled": true - }, - "oneOf": [ - { - "enum": [ - "FileBackedHttpMetadataResolver" - ], - "description": "value.file-backed-http-metadata-provider" - } - ] + "const": "FileBackedHttpMetadataResolver" }, "enabled": { "title": "label.enable-service", @@ -64,227 +51,71 @@ "title": "label.xml-id", "description": "tooltip.xml-id", "type": "string", - "default": "", "minLength": 1 }, "metadataURL": { "title": "label.metadata-url", "description": "tooltip.metadata-url", "type": "string", - "default": "", "minLength": 1 }, "initializeFromBackupFile": { "title": "label.init-from-backup", "description": "tooltip.init-from-backup", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ], - "default": true + "type": "boolean" }, "backingFile": { "title": "label.backing-file", "description": "tooltip.backing-file", - "type": "string", - "default": "" + "type": "string" }, "backupFileInitNextRefreshDelay": { "title": "label.backup-file-init-refresh-delay", "description": "tooltip.backup-file-init-refresh-delay", "type": "string", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" }, "requireValidMetadata": { "title": "label.require-valid-metadata", "description": "tooltip.require-valid-metadata", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ], - "default": true + "type": "boolean" }, "failFastInitialization": { "title": "label.fail-fast-init", "description": "tooltip.fail-fast-init", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ], - "default": true + "type": "boolean" }, "useDefaultPredicateRegistry": { "title": "label.use-default-predicate-reg", "description": "tooltip.use-default-predicate-reg", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ], - "default": true + "type": "boolean" }, "satisfyAnyPredicates": { "$id": "satisfyAnyPredicates", "title": "label.satisfy-any-predicates", "description": "tooltip.satisfy-any-predicates", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ], - "default": false + "type": "boolean" }, "httpMetadataResolverAttributes": { "$id": "httpMetadataResolverAttributes", "order": [], "type": "object", - "fieldsets": [ - { - "title": "label.http-connection-attributes", - "type": "section", - "fields": [ - "connectionRequestTimeout", - "connectionTimeout", - "socketTimeout" - ] - }, - { - "title": "label.http-security-attributes", - "type": "section", - "class": "col-12", - "fields": [ - "disregardTLSCertificate" - ] - }, - { - "title": "label.http-proxy-attributes", - "type": "section", - "class": "col-12", - "fields": [ - "proxyHost", - "proxyPort", - "proxyUser", - "proxyPassword" - ] - }, - { - "title": "label.http-caching-attributes", - "type": "section", - "class": "col-12", - "fields": [ - "httpCaching", - "httpCacheDirectory", - "httpMaxCacheEntries", - "httpMaxCacheEntrySize" - ] - }, - { - "title": "", - "type": "hidden", - "class": "col-12", - "fields": [ - "tlsTrustEngineRef", - "httpClientSecurityParametersRef", - "httpClientRef" - ] - } - ], "properties": { + "disregardTLSCertificate": { + "type": "boolean", + "title": "label.disregard-tls-cert", + "description": "tooltip.disregard-tls-cert" + }, "httpClientRef": { "type": "string", "title": "", "description": "", - "placeholder": "", "widget": "hidden" }, "connectionRequestTimeout": { "type": "string", "title": "label.connection-request-timeout", "description": "tooltip.connection-request-timeout", - "placeholder": "label.duration", "widget": { "id": "datalist", "data": [ @@ -305,7 +136,6 @@ "type": "string", "title": "label.connection-timeout", "description": "tooltip.connection-timeout", - "placeholder": "label.duration", "widget": { "id": "datalist", "data": [ @@ -326,7 +156,6 @@ "type": "string", "title": "label.socket-timeout", "description": "tooltip.socket-timeout", - "placeholder": "label.duration", "widget": { "id": "datalist", "data": [ @@ -343,71 +172,40 @@ }, "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" }, - "disregardTLSCertificate": { - "type": "boolean", - "title": "label.disregard-tls-cert", - "description": "tooltip.disregard-tls-cert", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "True" - }, - { - "enum": [ - false - ], - "description": "False" - } - ] - }, "tlsTrustEngineRef": { "type": "string", "title": "", - "description": "", - "placeholder": "", - "widget": "hidden" + "description": "" }, "httpClientSecurityParametersRef": { "type": "string", "title": "", - "description": "", - "placeholder": "", - "widget": "hidden" + "description": "" }, "proxyHost": { "type": "string", "title": "label.proxy-host", - "description": "tooltip.proxy-host", - "placeholder": "" + "description": "tooltip.proxy-host" }, "proxyPort": { "type": "string", "title": "label.proxy-port", - "description": "tooltip.proxy-port", - "placeholder": "" + "description": "tooltip.proxy-port" }, "proxyUser": { "type": "string", "title": "label.proxy-user", - "description": "tooltip.proxy-user", - "placeholder": "" + "description": "tooltip.proxy-user" }, "proxyPassword": { "type": "string", "title": "label.proxy-password", - "description": "tooltip.proxy-password", - "placeholder": "" + "description": "tooltip.proxy-password" }, "httpCaching": { "type": "string", "title": "label.http-caching", "description": "tooltip.http-caching", - "placeholder": "label.select-caching-type", "widget": { "id": "select" }, @@ -435,21 +233,18 @@ "httpCacheDirectory": { "type": "string", "title": "label.http-caching-directory", - "description": "tooltip.http-caching-directory", - "placeholder": "" + "description": "tooltip.http-caching-directory" }, "httpMaxCacheEntries": { "type": "integer", "title": "label.http-max-cache-entries", "description": "tooltip.http-max-cache-entries", - "placeholder": "", "minimum": 0 }, "httpMaxCacheEntrySize": { "type": "integer", "title": "label.max-cache-entry-size", "description": "tooltip.max-cache-entry-size", - "placeholder": "", "minimum": 0 } } @@ -462,56 +257,19 @@ "title": "label.min-refresh-delay", "description": "tooltip.min-refresh-delay", "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" }, "maxRefreshDelay": { "title": "label.max-refresh-delay", "description": "tooltip.max-refresh-delay", "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" }, "refreshDelayFactor": { "title": "label.refresh-delay-factor", "description": "tooltip.refresh-delay-factor", "type": "number", - "widget": { - "id": "float", - "help": "message.real-number", - "step": 0.01 - }, - "placeholder": "label.real-number", + "multipleOf": 0.01, "minimum": 0.001, "maximum": 0.999 } @@ -522,7 +280,6 @@ "title": "", "description": "", "type": "array", - "additionalItems": true, "items": [ { "$id": "RequiredValidUntil", @@ -532,26 +289,14 @@ "id": "fieldset" }, "properties": { + "@type": { + "type": "string", + "default": "RequiredValidUntil" + }, "maxValidityInterval": { "title": "label.max-validity-interval", "description": "tooltip.max-validity-interval", "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" } } @@ -564,11 +309,14 @@ "id": "fieldset" }, "properties": { + "@type": { + "type": "string", + "default": "SignatureValidation" + }, "requireSignedRoot": { "title": "label.require-signed-root", "description": "tooltip.require-signed-root", - "type": "boolean", - "default": true + "type": "boolean" }, "certificateFile": { "title": "label.certificate-file", @@ -576,29 +324,29 @@ "type": "string" } }, - "anyOf": [ - { - "properties": { - "requireSignedRoot": { - "enum": [ - true + "dependencies": { + "requireSignedRoot": { + "oneOf": [ + { + "properties": { + "requireSignedRoot": { + "const": true + } + }, + "required": [ + "certificateFile" ] + }, + { + "properties": { + "requireSignedRoot": { + "const": false + } + } } - }, - "required": [ - "certificateFile" ] - }, - { - "properties": { - "requireSignedRoot": { - "enum": [ - false - ] - } - } } - ] + } }, { "$id": "EntityRoleWhiteList", @@ -608,6 +356,10 @@ "id": "fieldset" }, "properties": { + "@type": { + "type": "string", + "default": "EntityRoleWhiteList" + }, "retainedRoles": { "title": "label.retained-roles", "description": "tooltip.retained-roles", @@ -617,33 +369,25 @@ "id": "select" }, "type": "string", - "oneOf": [ - { - "enum": [ - "SPSSODescriptor" - ], - "description": "value.spdescriptor" - }, - { - "enum": [ - "AttributeAuthorityDescriptor" - ], - "description": "value.attr-auth-descriptor" - } + "enum": [ + "SPSSODescriptor", + "AttributeAuthorityDescriptor" + ], + "enumNames": [ + "value.spdescriptor", + "value.attr-auth-descriptor" ] } }, "removeRolelessEntityDescriptors": { "title": "label.remove-roleless-entity-descriptors", "description": "tooltip.remove-roleless-entity-descriptors", - "type": "boolean", - "default": true + "type": "boolean" }, "removeEmptyEntitiesDescriptors": { "title": "label.remove-empty-entities-descriptors", "description": "tooltip.remove-empty-entities-descriptors", - "type": "boolean", - "default": true + "type": "boolean" } } } diff --git a/ui/public/assets/schema/provider/local-dynamic.schema.json b/ui/public/assets/schema/provider/local-dynamic.schema.json new file mode 100644 index 000000000..be547ae24 --- /dev/null +++ b/ui/public/assets/schema/provider/local-dynamic.schema.json @@ -0,0 +1,86 @@ +{ + "type": "object", + "required": [ + "name", + "@type", + "xmlId", + "sourceDirectory" + ], + "properties": { + "name": { + "title": "label.metadata-provider-name-dashboard-display-only", + "description": "tooltip.metadata-provider-name-dashboard-display-only", + "type": "string", + "widget": { + "id": "string", + "help": "message.must-be-unique" + } + }, + "@type": { + "title": "label.metadata-provider-type", + "description": "tooltip.metadata-provider-type", + "type": "string", + "const": "LocalDynamicMetadataResolver" + }, + "xmlId": { + "title": "label.xml-id", + "description": "tooltip.xml-id", + "type": "string", + "minLength": 1 + }, + "sourceDirectory": { + "title": "label.source-directory", + "description": "tooltip.source-directory", + "type": "string", + "minLength": 1 + }, + "enabled": { + "title": "label.enable-provider-upon-saving", + "description": "tooltip.enable-provider-upon-saving", + "type": "boolean", + "default": false + }, + "dynamicMetadataResolverAttributes": { + "type": "object", + "properties": { + "refreshDelayFactor": { + "title": "label.refresh-delay-factor", + "description": "tooltip.refresh-delay-factor", + "type": "number", + "multipleOf": 0.01, + "minimum": 0.001, + "maximum": 0.999 + }, + "minCacheDuration": { + "title": "label.min-cache-duration", + "description": "tooltip.min-cache-duration", + "type": "string", + "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" + }, + "maxCacheDuration": { + "title": "label.max-cache-duration", + "description": "tooltip.max-cache-duration", + "type": "string", + "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" + }, + "maxIdleEntityData": { + "title": "label.max-idle-entity-data", + "description": "tooltip.max-idle-entity-data", + "type": "string", + "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" + }, + "removeIdleEntityData": { + "title": "label.remove-idle-entity-data", + "description": "tooltip.remove-idle-entity-data", + "type": "boolean" + }, + "cleanupTaskInterval": { + "title": "label.cleanup-task-interval", + "description": "tooltip.cleanup-task-interval", + "type": "string", + "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" + } + } + } + } +} \ No newline at end of file diff --git a/ui/src/assets/schema/provider/metadata-provider-summary.schema.json b/ui/public/assets/schema/provider/metadata-provider-summary.schema.json similarity index 100% rename from ui/src/assets/schema/provider/metadata-provider-summary.schema.json rename to ui/public/assets/schema/provider/metadata-provider-summary.schema.json diff --git a/ui/src/assets/schema/provider/metadata-provider.schema.json b/ui/public/assets/schema/provider/metadata-provider.schema.json similarity index 93% rename from ui/src/assets/schema/provider/metadata-provider.schema.json rename to ui/public/assets/schema/provider/metadata-provider.schema.json index 5849ec8d8..24d43a8ab 100644 --- a/ui/src/assets/schema/provider/metadata-provider.schema.json +++ b/ui/public/assets/schema/provider/metadata-provider.schema.json @@ -17,7 +17,6 @@ "@type": { "title": "label.metadata-provider-type", "description": "tooltip.metadata-provider-type", - "placeholder": "label.select-metadata-type", "type": "string", "widget": { "id": "select", diff --git a/ui/src/assets/schema/source/metadata-source.json b/ui/public/assets/schema/source/metadata-source.json similarity index 74% rename from ui/src/assets/schema/source/metadata-source.json rename to ui/public/assets/schema/source/metadata-source.json index c06e299a6..dc19fe8d4 100644 --- a/ui/src/assets/schema/source/metadata-source.json +++ b/ui/public/assets/schema/source/metadata-source.json @@ -5,16 +5,16 @@ "entityId" ], "properties": { - "entityId": { - "title": "label.entity-id", - "description": "tooltip.entity-id", + "serviceProviderName": { + "title": "label.service-provider-name", + "description": "tooltip.service-provider-name", "type": "string", "minLength": 1, "maxLength": 255 }, - "serviceProviderName": { - "title": "label.service-provider-name", - "description": "tooltip.service-provider-name", + "entityId": { + "title": "label.entity-id", + "description": "tooltip.entity-id", "type": "string", "minLength": 1, "maxLength": 255 @@ -26,38 +26,7 @@ "default": false }, "organization": { - "type": "object", - "properties": { - "name": { - "title": "label.organization-name", - "description": "tooltip.organization-name", - "type": "string" - }, - "displayName": { - "title": "label.organization-display-name", - "description": "tooltip.organization-display-name", - "type": "string" - }, - "url": { - "title": "label.organization-url", - "description": "tooltip.organization-url", - "type": "string" - } - }, - "dependencies": { - "name": [ - "displayName", - "url" - ], - "displayName": [ - "name", - "url" - ], - "url": [ - "name", - "displayName" - ] - } + "$ref": "#/definitions/Organization" }, "contacts": { "title": "label.contact-information", @@ -68,164 +37,65 @@ } }, "mdui": { - "type": "object", - "widget": { - "id": "fieldset" - }, - "fieldsets": [ - { - "type": "group", - "fields": [ - "displayName", - "informationUrl", - "description" - ] - }, - { - "type": "group", - "fields": [ - "privacyStatementUrl", - "logoUrl", - "logoWidth", - "logoHeight" - ] - } - ], - "properties": { - "displayName": { - "title": "label.display-name", - "description": "tooltip.mdui-display-name", - "type": "string" - }, - "informationUrl": { - "title": "label.information-url", - "description": "tooltip.mdui-information-url", - "type": "string" - }, - "privacyStatementUrl": { - "title": "label.privacy-statement-url", - "description": "tooltip.mdui-privacy-statement-url", - "type": "string" - }, - "description": { - "title": "label.description", - "description": "tooltip.mdui-description", - "type": "string", - "widget": { - "id": "textarea" - } - }, - "logoUrl": { - "title": "label.logo-url", - "description": "tooltip.mdui-logo-url", - "type": "string" - }, - "logoHeight": { - "title": "label.logo-height", - "description": "tooltip.mdui-logo-height", - "min": 0, - "type": "integer", - "default": 0 - }, - "logoWidth": { - "title": "label.logo-width", - "description": "tooltip.mdui-logo-width", - "min": 0, - "type": "integer", - "default": 0 - } - } + "$ref": "#/definitions/MDUI" }, "securityInfo": { "type": "object", "widget": { "id": "fieldset" }, - "fieldsets": [ - { - "type": "group", - "fields": [ - "x509CertificateAvailable", - "authenticationRequestsSigned", - "wantAssertionsSigned" - ] - }, - { - "type": "group", - "fields": [ - "x509Certificates" - ] - } - ], - "properties": { - "x509CertificateAvailable": { - "title": "label.is-there-a-x509-certificate", - "description": "tooltip.is-there-a-x509-certificate", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, + "dependencies": { + "authenticationRequestsSigned": { "oneOf": [ { - "enum": [ - true - ], - "description": "value.true" + "properties": { + "authenticationRequestsSigned": { + "enum": [ + true + ] + }, + "x509Certificates": { + "minItems": 1 + } + } }, { - "enum": [ - false - ], - "description": "value.false" + "properties": { + "authenticationRequestsSigned": { + "enum": [ + false + ] + }, + "x509Certificates": { + "minItems": 0 + } + } } - ], - "default": false + ] + } + }, + "properties": { + "x509CertificateAvailable": { + "type": "boolean", + "default": true }, "authenticationRequestsSigned": { "title": "label.authentication-requests-signed", "description": "tooltip.authentication-requests-signed", "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ], - "default": false + "enumNames": [ + "value.true", + "value.false" + ] }, "wantAssertionsSigned": { "title": "label.want-assertions-signed", "description": "tooltip.want-assertions-signed", "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ], - "default": false + "enumNames": [ + "value.true", + "value.false" + ] }, "x509Certificates": { "title": "label.x509-certificates", @@ -246,27 +116,11 @@ }, "serviceProviderSsoDescriptor": { "type": "object", - "widget": { - "id": "fieldset" - }, - "fieldsets": [ - { - "type": "group", - "fields": [ - "protocolSupportEnum", - "nameIdFormats" - ] - } - ], - "required": [ - "nameIdFormats" - ], "properties": { "protocolSupportEnum": { "title": "label.protocol-support-enumeration", "description": "tooltip.protocol-support-enumeration", "type": "string", - "placeholder": "label.select-protocol", "widget": { "id": "select" }, @@ -286,7 +140,7 @@ ] }, "nameIdFormats": { - "$ref": "#/definitions/NameIdFormatList" + "$ref": "#/definitions/nameIdFormats" } } }, @@ -331,41 +185,54 @@ "type": "boolean", "default": false }, - "forceAuthn": { - "title": "label.force-authn", - "description": "tooltip.force-authn", - "type": "boolean", - "default": false - }, "omitNotBefore": { "title": "label.omit-not-before-condition", - "type": "boolean", "description": "tooltip.omit-not-before-condition", + "type": "boolean", "default": false }, + "responderId": { + "title": "label.responder-id", + "description": "tooltip.responder-id", + "type": "string", + "default": "" + }, "nameIdFormats": { - "$ref": "#/definitions/NameIdFormatList" + "$ref": "#/definitions/nameIdFormats" }, "authenticationMethods": { - "$ref": "#/definitions/AuthenticationMethodList" + "$ref": "#/definitions/authenticationMethods" }, - "responderId": { - "title": "label.responder-id", - "description": "tooltip.responder-id", - "type": "string" + "forceAuthn": { + "title": "label.force-authn", + "description": "tooltip.force-authn", + "type": "boolean", + "default": false } } }, "attributeRelease": { "type": "array", + "title": "label.attribute-release", "description": "Attribute release table - select the attributes you want to release (default unchecked)", - "widget": { - "id": "checklist", - "dataUrl": "/customAttributes" - }, "items": { - "type": "string" - } + "type": "string", + "enum": [ + "eduPersonPrincipalName", + "uid", + "mail", + "surname", + "givenName", + "eduPersonAffiliation", + "eduPersonScopedAffiliation", + "eduPersonPrimaryAffiliation", + "eduPersonEntitlement", + "eduPersonAssurance", + "eduPersonUniqueId", + "employeeNumber" + ] + }, + "uniqueItems": true } }, "definitions": { @@ -421,7 +288,7 @@ "title": "label.contact-email-address", "description": "tooltip.contact-email", "type": "string", - "pattern": "^(?=.{1,254}$)(?=.{1,64}@)[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+(\\.[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+)*@[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*$", + "pattern": "^(mailto:)?(?=.{1,254}$)(?=.{1,64}@)[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+(\\.[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+)*@[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*$", "minLength": 1, "maxLength": 255 } @@ -429,9 +296,7 @@ }, "Certificate": { "type": "object", - "title": "label.certificate", "required": [ - "name", "type", "value" ], @@ -440,12 +305,10 @@ "title": "label.certificate-name-display-only", "description": "tooltip.certificate-name", "type": "string", - "minLength": 1, "maxLength": 255 }, "type": { "title": "label.certificate-type", - "description": "tooltip.certificate-type", "type": "string", "widget": { "id": "radio", @@ -470,8 +333,7 @@ ], "description": "value.both" } - ], - "default": "both" + ] }, "value": { "title": "label.certificate", @@ -484,7 +346,10 @@ }, "AssertionConsumerService": { "type": "object", - "title": "label.assertion-consumer-service-endpoint", + "required": [ + "locationUrl", + "binding" + ], "properties": { "locationUrl": { "title": "label.assertion-consumer-service-location", @@ -509,68 +374,46 @@ ], "description": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" }, + { + "enum": [ + "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST-SimpleSign" + ], + "description": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST-SimpleSign" + }, + { + "enum": [ + "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact" + ], + "description": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact" + }, + { + "enum": [ + "urn:oasis:names:tc:SAML:2.0:bindings:PAOS" + ], + "description": "urn:oasis:names:tc:SAML:2.0:bindings:PAOS" + }, { "enum": [ "urn:oasis:names:tc:SAML:1.0:profiles:browser-post" ], "description": "urn:oasis:names:tc:SAML:1.0:profiles:browser-post" + }, + { + "enum": [ + "urn:oasis:names:tc:SAML:1.0:profiles:artifact-01" + ], + "description": "urn:oasis:names:tc:SAML:1.0:profiles:artifact-01" } ] }, "makeDefault": { "title": "label.mark-as-default", "description": "tooltip.mark-as-default", - "type": "boolean", - "default": false + "type": "boolean" } } }, - "NameIdFormatList": { - "title": "label.nameid-format-to-send", - "placeholder": "label.nameid-format", - "description": "tooltip.nameid-format", - "type": "array", - "uniqueItems": true, - "items": { - "type": "string", - "minLength": 1, - "maxLength": 255, - "widget": { - "id": "datalist", - "data": [ - "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified", - "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress", - "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent", - "urn:oasis:names:tc:SAML:2.0:nameid-format:transient" - ] - } - }, - "default": null - }, - "AuthenticationMethodList": { - "title": "label.authentication-methods-to-use", - "description": "tooltip.authentication-methods-to-use", - "type": "array", - "placeholder": "label.authentication-method", - "uniqueItems": true, - "items": { - "type": "string", - "title": "label.authentication-method", - "minLength": 1, - "maxLength": 255, - "widget": { - "id": "datalist", - "data": [ - "https://refeds.org/profile/mfa", - "urn:oasis:names:tc:SAML:2.0:ac:classes:TimeSyncToken", - "urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport" - ] - } - }, - "default": null - }, "LogoutEndpoint": { - "title": "label.new-endpoint", "description": "tooltip.new-endpoint", "type": "object", "fieldsets": [ @@ -610,10 +453,178 @@ "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" ], "description": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" + }, + { + "enum": [ + "urn:oasis:names:tc:SAML:2.0:bindings:SOAP" + ], + "description": "urn:oasis:names:tc:SAML:2.0:bindings:SOAP" + }, + { + "enum": [ + "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact" + ], + "description": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact" } ] } } + }, + "MDUI": { + "type": "object", + "widget": { + "id": "fieldset" + }, + "fieldsets": [ + { + "type": "group", + "fields": [ + "displayName", + "informationUrl", + "description" + ] + }, + { + "type": "group", + "fields": [ + "privacyStatementUrl", + "logoUrl", + "logoWidth", + "logoHeight" + ] + } + ], + "properties": { + "displayName": { + "title": "label.display-name", + "description": "tooltip.mdui-display-name", + "type": "string", + "minLength": 1, + "maxLength": 255 + }, + "informationUrl": { + "title": "label.information-url", + "description": "tooltip.mdui-information-url", + "type": "string", + "minLength": 1, + "maxLength": 255 + }, + "privacyStatementUrl": { + "title": "label.privacy-statement-url", + "description": "tooltip.mdui-privacy-statement-url", + "type": "string", + "minLength": 1, + "maxLength": 255 + }, + "description": { + "title": "label.description", + "description": "tooltip.mdui-description", + "type": "string", + "widget": { + "id": "textarea" + }, + "minLength": 1, + "maxLength": 255 + }, + "logoUrl": { + "title": "label.logo-url", + "description": "tooltip.mdui-logo-url", + "type": "string", + "minLength": 1, + "maxLength": 255 + }, + "logoHeight": { + "title": "label.logo-height", + "description": "tooltip.mdui-logo-height", + "minimum": 0, + "type": "integer" + }, + "logoWidth": { + "title": "label.logo-width", + "description": "tooltip.mdui-logo-width", + "minimum": 0, + "type": "integer" + } + } + }, + "Organization": { + "type": "object", + "properties": { + "name": { + "title": "label.organization-name", + "description": "tooltip.organization-name", + "type": "string", + "minLength": 1, + "maxLength": 255 + }, + "displayName": { + "title": "label.organization-display-name", + "description": "tooltip.organization-display-name", + "type": "string", + "minLength": 1, + "maxLength": 255 + }, + "url": { + "title": "label.organization-url", + "description": "tooltip.organization-url", + "type": "string", + "minLength": 1, + "maxLength": 255 + } + }, + "dependencies": { + "name": { + "required": [ + "displayName", + "url" + ] + }, + "displayName": { + "required": [ + "name", + "url" + ] + }, + "url": { + "required": [ + "name", + "displayName" + ] + } + } + }, + "nameIdFormats": { + "title": "label.nameid-format-to-send", + "description": "tooltip.nameid-format", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "examples": [ + "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified", + "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress", + "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent", + "urn:oasis:names:tc:SAML:2.0:nameid-format:transient" + ] + } + }, + "authenticationMethods": { + "title": "label.authentication-methods-to-use", + "description": "tooltip.authentication-methods-to-use", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "examples": [ + "https://refeds.org/profile/mfa", + "urn:oasis:names:tc:SAML:2.0:ac:classes:TimeSyncToken", + "urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport" + ] + } } } } \ No newline at end of file diff --git a/ui/src/assets/shibboleth_icon_color_130x130.png b/ui/public/assets/shibboleth_icon_color_130x130.png similarity index 100% rename from ui/src/assets/shibboleth_icon_color_130x130.png rename to ui/public/assets/shibboleth_icon_color_130x130.png diff --git a/ui/src/assets/shibboleth_logowordmark_color.png b/ui/public/assets/shibboleth_logowordmark_color.png similarity index 100% rename from ui/src/assets/shibboleth_logowordmark_color.png rename to ui/public/assets/shibboleth_logowordmark_color.png diff --git a/ui/public/favicon.ico b/ui/public/favicon.ico new file mode 100644 index 000000000..9c1f419d3 Binary files /dev/null and b/ui/public/favicon.ico differ diff --git a/ui/public/index.html b/ui/public/index.html new file mode 100644 index 000000000..0f51e6aca --- /dev/null +++ b/ui/public/index.html @@ -0,0 +1,15 @@ + + + + Shibboleth IDP UI + + + + + + + + +
+ + diff --git a/ui/public/manifest.json b/ui/public/manifest.json new file mode 100644 index 000000000..9d4bf8fb5 --- /dev/null +++ b/ui/public/manifest.json @@ -0,0 +1,15 @@ +{ + "short_name": "Shibboleth IDP UI", + "name": "Manage your Shibboleth metadata", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/ui/public/robots.txt b/ui/public/robots.txt new file mode 100644 index 000000000..e9e57dc4d --- /dev/null +++ b/ui/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/ui/src/error.html b/ui/public/unsecured/error.html similarity index 100% rename from ui/src/error.html rename to ui/public/unsecured/error.html diff --git a/ui/src/app/App.constant.js b/ui/src/app/App.constant.js new file mode 100644 index 000000000..c08fda543 --- /dev/null +++ b/ui/src/app/App.constant.js @@ -0,0 +1,7 @@ +export const API_BASE_PATH = 'api'; + +export const FILTER_PLUGIN_TYPES = ['RequiredValidUntil', 'SignatureValidation', 'EntityRoleWhiteList']; + + + +export default API_BASE_PATH; diff --git a/ui/src/app/App.js b/ui/src/app/App.js new file mode 100644 index 000000000..097c0095d --- /dev/null +++ b/ui/src/app/App.js @@ -0,0 +1,100 @@ +import React from 'react'; +import { + BrowserRouter as Router, + Switch, + Redirect, + Route +} from "react-router-dom"; +import { QueryParamProvider } from 'use-query-params'; +import { Provider as HttpProvider } from 'use-http'; + +import './App.scss'; +import { I18nProvider } from './i18n/context/I18n.provider'; +import Footer from './core/components/Footer'; +import { get_cookie } from './core/utility/get_cookie'; + +import Dashboard from './dashboard/view/Dashboard'; +import Header from './core/components/Header'; +import { UserProvider } from './core/user/UserContext'; +import { Metadata } from './metadata/Metadata'; +import { Attribute } from './metadata/Attribute'; +import { Notifications } from './notifications/hoc/Notifications'; +import { NotificationList } from './notifications/component/NotificationList'; +import { UserConfirmation, ConfirmWindow } from './core/components/UserConfirmation'; +import { NewSource } from './metadata/new/NewSource'; +import { NewProvider } from './metadata/new/NewProvider'; +import { Filter } from './metadata/Filter'; +import { Contention } from './metadata/contention/ContentionContext'; +import { SessionModal } from './core/user/SessionModal'; +import Button from 'react-bootstrap/Button'; + + +function App() { + + const [showTimeout] = React.useState(); + + const httpOptions = { + redirect: 'manual', + interceptors: { + request: async ({options, url, path, route}) => { + options.headers['X-XSRF-TOKEN'] = get_cookie('XSRF-TOKEN'); + + return options; + }, + response: async ({response}) => { + if (response.type === "opaqueredirect") { + //setShowTimeout(true); + } + + return response; + } + } + }; + + return ( +
+ + + + + + + + + + {(message, confirm, confirmCallback, setConfirm, getConfirmation) => + + + +
+
+ + + + + + + + + + + + + + + +
+
+ + + } + + + + + + +
+ ); +} +export default App; diff --git a/ui/src/app/contention/component/change-item.component.spec.ts b/ui/src/app/App.scss similarity index 100% rename from ui/src/app/contention/component/change-item.component.spec.ts rename to ui/src/app/App.scss diff --git a/ui/src/app/App.test.js b/ui/src/app/App.test.js new file mode 100644 index 000000000..0b91c687f --- /dev/null +++ b/ui/src/app/App.test.js @@ -0,0 +1,8 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import App from './App'; + +it('renders without crashing', () => { + const div = document.createElement('div'); + ReactDOM.render(, div); +}); \ No newline at end of file diff --git a/ui/src/app/admin/action/admin-collection.action.ts b/ui/src/app/admin/action/admin-collection.action.ts deleted file mode 100644 index f9dacfd34..000000000 --- a/ui/src/app/admin/action/admin-collection.action.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { Action } from '@ngrx/store'; -import { Update } from '@ngrx/entity'; -import { Admin } from '../model/admin'; - -export enum AdminCollectionActionTypes { - - UPDATE_ADMIN_REQUEST = '[Admin Collection] Update Admin Request', - UPDATE_ADMIN_SUCCESS = '[Admin Collection] Update Admin Success', - UPDATE_ADMIN_FAIL = '[Admin Collection] Update Admin Fail', - - LOAD_ADMIN_REQUEST = '[Admin Collection] Load Admin Request', - LOAD_ADMIN_SUCCESS = '[Admin Collection] Load Admin Success', - LOAD_ADMIN_ERROR = '[Admin Collection] Load Admin Error', - - ADD_ADMIN_REQUEST = '[Admin Collection] Add Admin Request', - ADD_ADMIN_SUCCESS = '[Admin Collection] Add Admin Success', - ADD_ADMIN_FAIL = '[Admin Collection] Add Admin Fail', - - REMOVE_ADMIN_REQUEST = '[Admin Collection] Remove Admin Request', - REMOVE_ADMIN_SUCCESS = '[Admin Collection] Remove Admin Success', - REMOVE_ADMIN_FAIL = '[Admin Collection] Remove Admin Fail', - - CLEAR_ADMINS = '[Admin Collection] Clear Admins' - -} - -export class LoadAdminRequest implements Action { - readonly type = AdminCollectionActionTypes.LOAD_ADMIN_REQUEST; - - constructor() { } -} - -export class LoadAdminSuccess implements Action { - readonly type = AdminCollectionActionTypes.LOAD_ADMIN_SUCCESS; - - constructor(public payload: Admin[]) { } -} - -export class LoadAdminError implements Action { - readonly type = AdminCollectionActionTypes.LOAD_ADMIN_ERROR; - - constructor(public payload: any) { } -} - -export class UpdateAdminRequest implements Action { - readonly type = AdminCollectionActionTypes.UPDATE_ADMIN_REQUEST; - - constructor(public payload: Admin) { } -} - -export class UpdateAdminSuccess implements Action { - readonly type = AdminCollectionActionTypes.UPDATE_ADMIN_SUCCESS; - - constructor(public payload: Update) { } -} - -export class UpdateAdminFail implements Action { - readonly type = AdminCollectionActionTypes.UPDATE_ADMIN_FAIL; - - constructor(public payload: Admin) { } -} - -export class AddAdminRequest implements Action { - readonly type = AdminCollectionActionTypes.ADD_ADMIN_REQUEST; - - constructor(public payload: Admin) { } -} - -export class AddAdminSuccess implements Action { - readonly type = AdminCollectionActionTypes.ADD_ADMIN_SUCCESS; - - constructor(public payload: Admin) { } -} - -export class AddAdminFail implements Action { - readonly type = AdminCollectionActionTypes.ADD_ADMIN_FAIL; - - constructor(public payload: any) { } -} - -export class RemoveAdminRequest implements Action { - readonly type = AdminCollectionActionTypes.REMOVE_ADMIN_REQUEST; - - constructor(public payload: string) { } -} - -export class RemoveAdminSuccess implements Action { - readonly type = AdminCollectionActionTypes.REMOVE_ADMIN_SUCCESS; - - constructor(public payload: string) { } -} - -export class RemoveAdminFail implements Action { - readonly type = AdminCollectionActionTypes.REMOVE_ADMIN_FAIL; - - constructor(public error: Error) { } -} - -export class ClearAdmins implements Action { - readonly type = AdminCollectionActionTypes.CLEAR_ADMINS; -} - - -export type AdminCollectionActionsUnion = - | LoadAdminRequest - | LoadAdminSuccess - | LoadAdminError - | AddAdminRequest - | AddAdminSuccess - | AddAdminFail - | RemoveAdminRequest - | RemoveAdminSuccess - | RemoveAdminFail - | UpdateAdminRequest - | UpdateAdminSuccess - | UpdateAdminFail - | ClearAdmins; diff --git a/ui/src/app/admin/action/metadata-collection.action.ts b/ui/src/app/admin/action/metadata-collection.action.ts deleted file mode 100644 index 07565cb6a..000000000 --- a/ui/src/app/admin/action/metadata-collection.action.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { Action } from '@ngrx/store'; -import { MetadataResolver } from '../../metadata/domain/model'; -import { Update } from '@ngrx/entity'; - -export enum MetadataCollectionActionTypes { - UPDATE_METADATA_REQUEST = '[Admin Metadata Collection] Update Request', - UPDATE_METADATA_SUCCESS = '[Admin Metadata Collection] Update Success', - UPDATE_METADATA_FAIL = '[Admin Metadata Collection] Update Fail', - UPDATE_METADATA_CONFLICT = '[Admin Metadata Collection] Update Conflict', - - LOAD_METADATA_REQUEST = '[Admin Metadata Collection] Load Metadata REQUEST', - LOAD_METADATA_SUCCESS = '[Admin Metadata Collection] Load Metadata SUCCESS', - LOAD_METADATA_ERROR = '[Admin Metadata Collection] Load Metadata ERROR', - - REMOVE_METADATA = '[Admin Metadata Collection] Remove Metadata', - REMOVE_METADATA_SUCCESS = '[Admin Metadata Collection] Remove Metadata Success', - REMOVE_METADATA_FAIL = '[Admin Metadata Collection] Remove Metadata Fail', -} - -export class LoadMetadataRequest implements Action { - readonly type = MetadataCollectionActionTypes.LOAD_METADATA_REQUEST; - - constructor() { } -} - -export class LoadMetadataSuccess implements Action { - readonly type = MetadataCollectionActionTypes.LOAD_METADATA_SUCCESS; - - constructor(public payload: MetadataResolver[]) { } -} - -export class LoadMetadataError implements Action { - readonly type = MetadataCollectionActionTypes.LOAD_METADATA_ERROR; - - constructor(public payload: any) { } -} - -export class UpdateMetadataRequest implements Action { - readonly type = MetadataCollectionActionTypes.UPDATE_METADATA_REQUEST; - - constructor(public payload: MetadataResolver) { } -} - -export class UpdateMetadataSuccess implements Action { - readonly type = MetadataCollectionActionTypes.UPDATE_METADATA_SUCCESS; - - constructor(public payload: Update) { } -} - -export class UpdateMetadataFail implements Action { - readonly type = MetadataCollectionActionTypes.UPDATE_METADATA_FAIL; - - constructor(public payload: any) { } -} - -export class UpdateMetadataConflict implements Action { - readonly type = MetadataCollectionActionTypes.UPDATE_METADATA_CONFLICT; - - constructor(public payload: MetadataResolver) { } -} - -export class RemoveMetadataRequest implements Action { - readonly type = MetadataCollectionActionTypes.REMOVE_METADATA; - - constructor(public payload: string) { } -} - -export class RemoveMetadataSuccess implements Action { - readonly type = MetadataCollectionActionTypes.REMOVE_METADATA_SUCCESS; - - constructor(public payload: string) { } -} - -export class RemoveMetadataFail implements Action { - readonly type = MetadataCollectionActionTypes.REMOVE_METADATA_FAIL; - - constructor(public payload: MetadataResolver) { } -} - -export type MetadataCollectionActionsUnion = - | LoadMetadataRequest - | LoadMetadataSuccess - | LoadMetadataError - | RemoveMetadataRequest - | RemoveMetadataSuccess - | RemoveMetadataFail - | UpdateMetadataRequest - | UpdateMetadataSuccess - | UpdateMetadataFail - | UpdateMetadataConflict; diff --git a/ui/src/app/admin/admin.component.html b/ui/src/app/admin/admin.component.html deleted file mode 100644 index 90c6b6463..000000000 --- a/ui/src/app/admin/admin.component.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/src/app/admin/admin.component.spec.ts b/ui/src/app/admin/admin.component.spec.ts deleted file mode 100644 index 79f45c1bd..000000000 --- a/ui/src/app/admin/admin.component.spec.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { AdminComponent } from './admin.component'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, combineReducers, Store } from '@ngrx/store'; -import * as fromAdmin from './reducer'; - -describe('Admin Root Component', () => { - let fixture: ComponentFixture; - let instance: AdminComponent; - let store: Store; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - RouterTestingModule, - StoreModule.forRoot({ - admin: combineReducers(fromAdmin.reducers) - }) - ], - declarations: [ - AdminComponent - ], - }); - - store = TestBed.get(Store); - spyOn(store, 'dispatch'); - - fixture = TestBed.createComponent(AdminComponent); - instance = fixture.componentInstance; - }); - - it('should compile', () => { - fixture.detectChanges(); - expect(fixture).toBeDefined(); - }); -}); diff --git a/ui/src/app/admin/admin.component.ts b/ui/src/app/admin/admin.component.ts deleted file mode 100644 index ae1469443..000000000 --- a/ui/src/app/admin/admin.component.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'admin-page', - templateUrl: './admin.component.html', - styleUrls: [] -}) -export class AdminComponent { - constructor() {} -} diff --git a/ui/src/app/admin/admin.module.ts b/ui/src/app/admin/admin.module.ts deleted file mode 100644 index fd25105a4..000000000 --- a/ui/src/app/admin/admin.module.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { NgModule } from '@angular/core'; -import { HttpClientModule } from '@angular/common/http'; -import { RouterModule } from '@angular/router'; -import { CommonModule } from '@angular/common'; -import { FormsModule } from '@angular/forms'; -import { StoreModule } from '@ngrx/store'; - -import { SharedModule } from '../shared/shared.module'; -import { I18nModule } from '../i18n/i18n.module'; -import { AdminManagementPageComponent } from './container/admin-management.component'; -import { AdminComponent } from './admin.component'; -import { reducers } from './reducer'; -import { AdminService } from './service/admin.service'; -import { AdminCollectionEffects } from './effect/admin-collection.effect'; -import { EffectsModule } from '@ngrx/effects'; -import { DeleteUserDialogComponent } from './component/delete-user-dialog.component'; -import { NgbModalModule } from '@ng-bootstrap/ng-bootstrap'; -import { ActionRequiredPageComponent } from './container/action-required.component'; -import { AccessRequestComponent } from './component/access-request.component'; -import { UserManagementComponent } from './component/user-management.component'; -import { EnableMetadataComponent } from './component/enable-metadata.component'; -import { ManagerModule } from '../metadata/manager/manager.module'; -import { MetadataCollectionEffects } from './effect/metadata-collection.effect'; - -@NgModule({ - declarations: [ - AdminManagementPageComponent, - AdminComponent, - DeleteUserDialogComponent, - UserManagementComponent, - ActionRequiredPageComponent, - AccessRequestComponent, - EnableMetadataComponent - ], - entryComponents: [ - DeleteUserDialogComponent - ], - imports: [ - CommonModule, - I18nModule, - StoreModule.forFeature('admin', reducers), - EffectsModule.forFeature([AdminCollectionEffects, MetadataCollectionEffects]), - FormsModule, - RouterModule, - HttpClientModule, - SharedModule, - I18nModule, - NgbModalModule, - ManagerModule - ], - providers: [ - AdminService - ] -}) -export class AdminModule { } diff --git a/ui/src/app/admin/component/AccessRequest.js b/ui/src/app/admin/component/AccessRequest.js new file mode 100644 index 000000000..0dd644d54 --- /dev/null +++ b/ui/src/app/admin/component/AccessRequest.js @@ -0,0 +1,67 @@ +import React from 'react'; +import Button from 'react-bootstrap/Button'; +import Translate from '../../i18n/components/translate'; + +export function AccessRequest({ users, roles, onDeleteUser, onChangeUserRole }) { + + return ( + <> + {(!users || !users.length) ? + <> +
+
+

There are no new user requests at this time.

+
+
+ + : + users.map((user, i) => ( +
+
+
+
+
+
+ UserId +
+
{ user.username }
+
+ Email +
+
{ user.emailAddress }
+
+
+
+
+ Name +
+
{ user.firstName } { user.lastName }
+ +
+ +
+
+
+
+ +
+
+
+
+ ))} + + ); +} \ No newline at end of file diff --git a/ui/src/app/admin/component/UserMaintenance.js b/ui/src/app/admin/component/UserMaintenance.js new file mode 100644 index 000000000..72847104d --- /dev/null +++ b/ui/src/app/admin/component/UserMaintenance.js @@ -0,0 +1,64 @@ +import React from 'react'; + +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { faTrash } from '@fortawesome/free-solid-svg-icons'; +import Button from 'react-bootstrap/Button'; + +import Translate from '../../i18n/components/translate'; +import { useCurrentUser } from '../../core/user/UserContext'; + +export default function UserMaintenance({ users, roles, onDeleteUser, onChangeUserRole }) { + + const currentUser = useCurrentUser(); + + return ( +
+ + + + + + + + + + + + {users.map((user, idx) => + + + + + + + + )} + +
UserIdNameEmailRoleDelete?
{user.username}{user.firstName} {user.lastName}{user.emailAddress} + + + + {currentUser.username !== user.username && + + } +
+
+ ); +} diff --git a/ui/src/app/admin/component/access-request.component.html b/ui/src/app/admin/component/access-request.component.html deleted file mode 100644 index 85bfefab7..000000000 --- a/ui/src/app/admin/component/access-request.component.html +++ /dev/null @@ -1,53 +0,0 @@ - - -
-
-

There are no new user requests at this time.

-
-
-
- -
-
-
-
-
-
- UserId -
-
{{ user.username }}
-
- Email -
-
{{ user.emailAddress }}
-
-
-
-
- Name -
-
{{ user.firstName }} {{ user.lastName }}
- -
- -
-
-
-
- -
-
-
-
-
\ No newline at end of file diff --git a/ui/src/app/admin/component/access-request.component.spec.ts b/ui/src/app/admin/component/access-request.component.spec.ts deleted file mode 100644 index 257239997..000000000 --- a/ui/src/app/admin/component/access-request.component.spec.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { NgbDropdownModule, NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { Store, StoreModule, combineReducers } from '@ngrx/store'; -import { FormsModule } from '@angular/forms'; - -import { NgbModalStub } from '../../../testing/modal.stub'; -import { AccessRequestComponent } from './access-request.component'; -import * as fromAdmin from '../reducer'; -import * as fromCore from '../../core/reducer'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(AccessRequestComponent, { static: true }) - public componentUnderTest: AccessRequestComponent; -} - -describe('Access Request Component', () => { - - let app: AccessRequestComponent; - let fixture: ComponentFixture; - let instance: TestHostComponent; - let store: Store; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - FormsModule, - NgbDropdownModule, - RouterTestingModule, - StoreModule.forRoot({ - admin: combineReducers(fromAdmin.reducers), - core: combineReducers(fromCore.reducers) - }) - ], - declarations: [ - AccessRequestComponent, - TestHostComponent - ], - providers: [ - { - provide: NgbModal, - useClass: NgbModalStub - } - ] - }).compileComponents(); - - store = TestBed.get(Store); - spyOn(store, 'dispatch'); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should compile without error', waitForAsync(() => { - expect(app).toBeTruthy(); - })); -}); diff --git a/ui/src/app/admin/component/access-request.component.ts b/ui/src/app/admin/component/access-request.component.ts deleted file mode 100644 index e082761de..000000000 --- a/ui/src/app/admin/component/access-request.component.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Component, ChangeDetectionStrategy, OnInit } from '@angular/core'; -import { UserManagementComponent } from './user-management.component'; -import * as fromAdmin from '../reducer'; -import { Observable } from 'rxjs'; -import { map } from 'rxjs/operators'; - -@Component({ - selector: 'access-request-component', - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './access-request.component.html', - styleUrls: [] -}) -export class AccessRequestComponent extends UserManagementComponent implements OnInit { - - ngOnInit(): void { - this.users$ = this.store.select(fromAdmin.getAllNewUsers); - this.hasUsers$ = this.users$.pipe(map(userList => userList.length > 0)); - } -} diff --git a/ui/src/app/admin/component/delete-user-dialog.component.html b/ui/src/app/admin/component/delete-user-dialog.component.html deleted file mode 100644 index 9255aa55e..000000000 --- a/ui/src/app/admin/component/delete-user-dialog.component.html +++ /dev/null @@ -1,16 +0,0 @@ - - - \ No newline at end of file diff --git a/ui/src/app/admin/component/delete-user-dialog.component.spec.ts b/ui/src/app/admin/component/delete-user-dialog.component.spec.ts deleted file mode 100644 index 92677d126..000000000 --- a/ui/src/app/admin/component/delete-user-dialog.component.spec.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; - -import { NgbDropdownModule, NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; - -import { DeleteUserDialogComponent } from './delete-user-dialog.component'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(DeleteUserDialogComponent, { static: true }) - public componentUnderTest: DeleteUserDialogComponent; -} - -describe('Delete Dialog (modal) Component', () => { - - let app: DeleteUserDialogComponent; - let fixture: ComponentFixture; - let instance: TestHostComponent; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - RouterTestingModule - ], - declarations: [ - DeleteUserDialogComponent, - TestHostComponent - ], - providers: [ - { - provide: NgbActiveModal, - useValue: jasmine.createSpyObj('activeModal', [ - 'close', - 'dismiss' - ]) - } - ] - }).compileComponents(); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should compile without error', waitForAsync(() => { - expect(app).toBeTruthy(); - })); -}); diff --git a/ui/src/app/admin/component/delete-user-dialog.component.ts b/ui/src/app/admin/component/delete-user-dialog.component.ts deleted file mode 100644 index 64a5e26ac..000000000 --- a/ui/src/app/admin/component/delete-user-dialog.component.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Component, ChangeDetectionStrategy } from '@angular/core'; - -import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; - -@Component({ - selector: 'delete-user-dialog', - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './delete-user-dialog.component.html' -}) -export class DeleteUserDialogComponent { - constructor( - public activeModal: NgbActiveModal - ) { } -} /* istanbul ignore next */ diff --git a/ui/src/app/admin/component/enable-metadata.component.html b/ui/src/app/admin/component/enable-metadata.component.html deleted file mode 100644 index dfe16220c..000000000 --- a/ui/src/app/admin/component/enable-metadata.component.html +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/ui/src/app/admin/component/enable-metadata.component.spec.ts b/ui/src/app/admin/component/enable-metadata.component.spec.ts deleted file mode 100644 index afe962011..000000000 --- a/ui/src/app/admin/component/enable-metadata.component.spec.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; - -import { NgbDropdownModule, NgbActiveModal, NgbModal } from '@ng-bootstrap/ng-bootstrap'; - -import { EnableMetadataComponent } from './enable-metadata.component'; - -import * as fromAdmin from '../reducer'; -import { Store, StoreModule, combineReducers } from '@ngrx/store'; -import { NgbModalStub } from '../../../testing/modal.stub'; -import { MockResolversListComponent } from '../../../testing/resolvers-list.component.stub'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(EnableMetadataComponent, { static: true }) - public componentUnderTest: EnableMetadataComponent; -} - -describe('Enable Metadata (modal) Component', () => { - - let app: EnableMetadataComponent; - let fixture: ComponentFixture; - let instance: TestHostComponent; - let store: Store; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - RouterTestingModule, - StoreModule.forRoot({ - admin: combineReducers(fromAdmin.reducers) - }) - ], - declarations: [ - EnableMetadataComponent, - TestHostComponent, - MockResolversListComponent - ], - providers: [ - { - provide: NgbModal, - useClass: NgbModalStub - } - ] - }).compileComponents(); - - store = TestBed.get(Store); - spyOn(store, 'dispatch'); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should compile without error', waitForAsync(() => { - expect(app).toBeTruthy(); - })); -}); diff --git a/ui/src/app/admin/component/enable-metadata.component.ts b/ui/src/app/admin/component/enable-metadata.component.ts deleted file mode 100644 index e6d49b958..000000000 --- a/ui/src/app/admin/component/enable-metadata.component.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { Router } from '@angular/router'; -import { Store } from '@ngrx/store'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { Observable } from 'rxjs'; -import { map } from 'rxjs/operators'; - -import { MetadataEntity, MetadataResolver } from '../../metadata/domain/model'; -import * as fromDashboard from '../../metadata/manager/reducer'; -import * as fromMetadata from '../reducer'; -import { DeleteDialogComponent } from '../../metadata/manager/component/delete-dialog.component'; -import { PreviewEntity } from '../../metadata/domain/action/entity.action'; -import { FileBackedHttpMetadataResolver } from '../../metadata/domain/entity'; -import { RemoveMetadataRequest, UpdateMetadataRequest } from '../action/metadata-collection.action'; - -@Component({ - selector: 'enable-metadata', - templateUrl: './enable-metadata.component.html' -}) - -export class EnableMetadataComponent { - resolvers$: Observable = this.store - .select(fromMetadata.getMetadataCollection) - .pipe( - map(resolvers => resolvers.map(r => new FileBackedHttpMetadataResolver(r))) - ); - - constructor( - private store: Store, - private router: Router, - private modalService: NgbModal - ) {} - - edit(entity: MetadataEntity): void { - this.router.navigate(['metadata', 'resolver', entity.getId(), 'edit']); - } - - openPreviewDialog(entity: MetadataEntity): void { - this.store.dispatch(new PreviewEntity({ id: entity.getId(), entity })); - } - - toggleResolverEnabled(entity: MetadataResolver): void { - let update = { ...entity, serviceEnabled: !entity.serviceEnabled }; - this.store.dispatch(new UpdateMetadataRequest(update)); - } - - deleteResolver(entity: MetadataResolver): void { - this.modalService - .open(DeleteDialogComponent) - .result - .then( - success => { - this.store.dispatch(new RemoveMetadataRequest(entity.id)); - }, - err => { - console.log('Cancelled'); - } - ); - } -} diff --git a/ui/src/app/admin/component/user-management.component.html b/ui/src/app/admin/component/user-management.component.html deleted file mode 100644 index d06fb8637..000000000 --- a/ui/src/app/admin/component/user-management.component.html +++ /dev/null @@ -1,42 +0,0 @@ -
-

There are no users configured in the system for you to manage.

-
- - - - - - - - - - - - - - - - - - - -
UserIdNameEmailRoleDelete?
{{ user.username }}{{ user.firstName }} {{ user.lastName }}{{ user.emailAddress }} - - - - -
\ No newline at end of file diff --git a/ui/src/app/admin/component/user-management.component.spec.ts b/ui/src/app/admin/component/user-management.component.spec.ts deleted file mode 100644 index 6a6c9aa27..000000000 --- a/ui/src/app/admin/component/user-management.component.spec.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { Store, StoreModule, combineReducers } from '@ngrx/store'; -import { NgbDropdownModule, NgbActiveModal, NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { FormsModule } from '@angular/forms'; -import { UserManagementComponent } from './user-management.component'; -import { NgbModalStub } from '../../../testing/modal.stub'; -import * as fromAdmin from '../reducer'; -import * as fromCore from '../../core/reducer'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(UserManagementComponent, { static: true }) - public componentUnderTest: UserManagementComponent; -} - -describe('User Management Component', () => { - - let app: UserManagementComponent; - let fixture: ComponentFixture; - let instance: TestHostComponent; - let store: Store; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - FormsModule, - NgbDropdownModule, - RouterTestingModule, - StoreModule.forRoot({ - admin: combineReducers(fromAdmin.reducers), - core: combineReducers(fromCore.reducers) - }) - ], - declarations: [ - UserManagementComponent, - TestHostComponent - ], - providers: [ - { - provide: NgbModal, - useClass: NgbModalStub - } - ] - }).compileComponents(); - - store = TestBed.get(Store); - spyOn(store, 'dispatch'); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should compile without error', waitForAsync(() => { - expect(app).toBeTruthy(); - })); -}); diff --git a/ui/src/app/admin/component/user-management.component.ts b/ui/src/app/admin/component/user-management.component.ts deleted file mode 100644 index 3231050ae..000000000 --- a/ui/src/app/admin/component/user-management.component.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { Component, ChangeDetectionStrategy, OnInit, OnDestroy } from '@angular/core'; -import { Store } from '@ngrx/store'; -import { Observable, Subscription } from 'rxjs'; - -import * as fromRoot from '../../app.reducer'; -import * as fromCore from '../../core/reducer'; -import * as fromAdmin from '../reducer'; - -import { UpdateAdminRequest, RemoveAdminRequest } from '../action/admin-collection.action'; -import { Admin } from '../model/admin'; -import { DeleteUserDialogComponent } from '../component/delete-user-dialog.component'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { map } from 'rxjs/operators'; - -@Component({ - selector: 'user-management', - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './user-management.component.html', - styleUrls: [] -}) -export class UserManagementComponent implements OnInit, OnDestroy { - - users$: Observable; - currentUser: Admin; - userSub: Subscription; - roles$: Observable; - - hasUsers$: Observable; - - constructor( - protected store: Store, - protected modal: NgbModal - ) { - this.roles$ = this.store.select(fromCore.getUserRoles); - let user$ = this.store.select(fromCore.getUser); - this.userSub = user$.subscribe(u => this.currentUser = u); - } - - ngOnInit(): void { - this.users$ = this.store.select(fromAdmin.getAllConfiguredAdmins); - this.hasUsers$ = this.users$.pipe(map(userList => userList.length > 0)); - this.users$ = this.store.select(fromAdmin.getAllAdmins); - } - - ngOnDestroy(): void { - this.userSub.unsubscribe(); - } - - setUserRole(user: Admin, change: string): void { - this.store.dispatch(new UpdateAdminRequest({ - ...user, - role: change - })); - } - - deleteUser(user: string): void { - this.modal - .open(DeleteUserDialogComponent) - .result - .then( - result => this.store.dispatch(new RemoveAdminRequest(user)) - ) - .catch( - err => err - ); - } -} diff --git a/ui/src/app/admin/container/SourcesActions.js b/ui/src/app/admin/container/SourcesActions.js new file mode 100644 index 000000000..c3a8cca27 --- /dev/null +++ b/ui/src/app/admin/container/SourcesActions.js @@ -0,0 +1,41 @@ +import React from 'react'; +import SourceList from '../../metadata/domain/source/component/SourceList'; +import { useMetadataEntity } from '../../metadata/hooks/api'; + +import { NotificationContext, createNotificationAction } from '../../notifications/hoc/Notifications'; + +export function SourcesActions ({sources, reloadSources}) { + + const { dispatch } = React.useContext(NotificationContext); + + const { put, del, response } = useMetadataEntity('source', { + cachePolicy: 'no-cache' + }); + + async function deleteSource(id) { + await del(`/${id}`); + if (response.ok) { + dispatch(createNotificationAction( + `Metadata Source has been removed.` + )); + reloadSources(); + } + } + + async function enableSource(source) { + await put(`/${source.id}`, { + ...source, + serviceEnabled: true + }); + if (response.ok) { + dispatch(createNotificationAction( + `Metadata Source has been enabled.` + )); + reloadSources(); + } + } + + return ( + + ); +} \ No newline at end of file diff --git a/ui/src/app/admin/container/UserActions.js b/ui/src/app/admin/container/UserActions.js new file mode 100644 index 000000000..dd05c9594 --- /dev/null +++ b/ui/src/app/admin/container/UserActions.js @@ -0,0 +1,14 @@ +import React from 'react'; +import { AccessRequest } from '../../admin/component/AccessRequest'; +import UserManagement from '../../admin/container/UserManagement'; + +export function UserActions({ users, reloadUsers }) { + return ( + + {(u, roles, onChangeUserRole, onDeleteUser) => + } + + ); +} + +export default UserActions; \ No newline at end of file diff --git a/ui/src/app/admin/container/UserManagement.js b/ui/src/app/admin/container/UserManagement.js new file mode 100644 index 000000000..e4e1140ef --- /dev/null +++ b/ui/src/app/admin/container/UserManagement.js @@ -0,0 +1,89 @@ +import React from 'react'; +import Modal from 'react-bootstrap/Modal'; +import useFetch from 'use-http'; + +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons'; +import Button from 'react-bootstrap/Button'; + +import Translate from '../../i18n/components/translate'; +import API_BASE_PATH from '../../App.constant'; +import { NotificationContext, createNotificationAction} from '../../notifications/hoc/Notifications'; + +export default function UserManagement({ users, children, reload }) { + + const [roles, setRoles] = React.useState([]); + + const { dispatch } = React.useContext(NotificationContext); + + const { get, patch, del, response } = useFetch(`${API_BASE_PATH}`, {}); + + async function loadRoles() { + const roles = await get('/supportedRoles') + if (response.ok) { + setRoles(roles); + } + } + + async function setUserRoleRequest(user, role) { + await patch(`/admin/users/${user.username}`, { + ...user, + role + }); + if (response.ok && reload) { + dispatch(createNotificationAction( + `User update successful for ${user.username}.` + )); + reload(); + } + } + + async function deleteUserRequest(id) { + await del(`/admin/users/${id}`); + if (response.ok && reload) { + dispatch(createNotificationAction( + `User deleted.` + )); + reload(); + } + } + + /*eslint-disable react-hooks/exhaustive-deps*/ + React.useEffect(() => { + loadRoles(); + }, []); + + const [modal, setModal] = React.useState(false); + + const toggle = () => setModal(!modal); + + const [deleting, setDeleting] = React.useState(null); + + const deleteUser = (id) => { + deleteUserRequest(deleting); + setDeleting(null); + }; + + return ( +
+ {children(users, roles, setUserRoleRequest, (id) => setDeleting(id))} + setDeleting(null)}> + Delete User? + + +

+ You are requesting to delete a user. If you complete this process the user will be removed. This cannot be undone. Do you wish to continue? +

+
+ + {' '} + + +
+
+ ); +} diff --git a/ui/src/app/admin/container/action-required.component.html b/ui/src/app/admin/container/action-required.component.html deleted file mode 100644 index 12da8aede..000000000 --- a/ui/src/app/admin/container/action-required.component.html +++ /dev/null @@ -1,27 +0,0 @@ -
-
-
-
-
- Enable Metadata Sources -
-
-
-
- -
-
-
-
-
-
-
-
- User Access Request -
-
-
- -
-
- diff --git a/ui/src/app/admin/container/action-required.component.ts b/ui/src/app/admin/container/action-required.component.ts deleted file mode 100644 index 7631c963b..000000000 --- a/ui/src/app/admin/container/action-required.component.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Component, ChangeDetectionStrategy } from '@angular/core'; - -@Component({ - selector: 'action-required-page', - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './action-required.component.html', - styleUrls: [] -}) -export class ActionRequiredPageComponent { - - constructor() {} -} diff --git a/ui/src/app/admin/container/admin-management.component.html b/ui/src/app/admin/container/admin-management.component.html deleted file mode 100644 index ebcca2e3b..000000000 --- a/ui/src/app/admin/container/admin-management.component.html +++ /dev/null @@ -1,15 +0,0 @@ -
-
-
-
-
- User Maintenance -
-
-
-
- -
-
-
- diff --git a/ui/src/app/admin/container/admin-management.component.spec.ts b/ui/src/app/admin/container/admin-management.component.spec.ts deleted file mode 100644 index 440fe4038..000000000 --- a/ui/src/app/admin/container/admin-management.component.spec.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { FormsModule } from '@angular/forms'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; -import * as fromAdmin from '../reducer'; -import { AdminManagementPageComponent } from './admin-management.component'; -import { MockI18nModule } from '../../../testing/i18n.stub'; -import { Component } from '@angular/core'; - -@Component({ - selector: 'user-management', - template: '
' -}) -export class UserManagementComponent { - - constructor() {} -} - -describe('Admin Management Page Component', () => { - let fixture: ComponentFixture; - let store: Store; - let instance: AdminManagementPageComponent; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - StoreModule.forRoot({ - 'admin': combineReducers(fromAdmin.reducers), - }), - FormsModule, - MockI18nModule - ], - declarations: [ - AdminManagementPageComponent, - UserManagementComponent - ], - }); - - fixture = TestBed.createComponent(AdminManagementPageComponent); - instance = fixture.componentInstance; - store = TestBed.get(Store); - - spyOn(store, 'dispatch').and.callThrough(); - }); - - it('should compile', () => { - fixture.detectChanges(); - - expect(fixture).toBeDefined(); - }); - - /* - describe('cancel method', () => { - it('should dispatch a cancel changes action', () => { - fixture.detectChanges(); - instance.cancel(); - expect(store.dispatch).toHaveBeenCalled(); - }); - }); - - describe('preview method', () => { - it('should dispatch a cancel changes action', () => { - fixture.detectChanges(); - instance.cancel(); - expect(store.dispatch).toHaveBeenCalled(); - }); - }); - */ -}); diff --git a/ui/src/app/admin/container/admin-management.component.ts b/ui/src/app/admin/container/admin-management.component.ts deleted file mode 100644 index b52211be4..000000000 --- a/ui/src/app/admin/container/admin-management.component.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Component, ChangeDetectionStrategy } from '@angular/core'; - -@Component({ - selector: 'admin-management-page', - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './admin-management.component.html', - styleUrls: [] -}) -export class AdminManagementPageComponent { - - constructor() {} -} diff --git a/ui/src/app/admin/effect/admin-collection.effect.spec.ts b/ui/src/app/admin/effect/admin-collection.effect.spec.ts deleted file mode 100644 index 20159f7b8..000000000 --- a/ui/src/app/admin/effect/admin-collection.effect.spec.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { TestBed } from '@angular/core/testing'; -import { provideMockActions } from '@ngrx/effects/testing'; -import { Subject, Observable, of, ReplaySubject } from 'rxjs'; - -import { AdminCollectionEffects } from './admin-collection.effect'; -import { AdminService } from '../service/admin.service'; -import { Admin } from '../model/admin'; -import { LoadAdminRequest, LoadAdminSuccess, UpdateAdminSuccess } from '../action/admin-collection.action'; -import { AddNotification, ADD_NOTIFICATION } from '../../notification/action/notification.action'; -import { NotificationType, Notification } from '../../notification/model/notification'; - -describe('Admin Collection Effects', () => { - let effects: AdminCollectionEffects; - let actions: Subject; - - let admin: Admin = { - username: 'foo', - firstName: 'bar', - lastName: 'baz', - role: 'ROLE_ADMIN', - emailAddress: 'foo@bar.baz' - }; - - let mockAdminService = { - query: (): Observable => of([admin]), - queryByRole: (role: string): Observable => of([admin]), - update: (user: Admin): Observable => of(admin), - remove: (userId: string): Observable => of(true) - }; - - let adminService; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [], - providers: [ - { provide: AdminService, useValue: mockAdminService }, - AdminCollectionEffects, - provideMockActions(() => actions), - ], - }); - - effects = TestBed.get(AdminCollectionEffects); - adminService = TestBed.get(AdminService); - }); - - describe(`loadAdminRequest$ effect`, () => { - it('should load admins and fire a success action', () => { - spyOn(adminService, 'query').and.returnValue(of([admin])); - actions = new ReplaySubject(1); - - actions.next(new LoadAdminRequest()); - - effects.loadAdminRequest$.subscribe(result => { - expect(result).toEqual(new LoadAdminSuccess([admin])); - }); - }); - }); - - describe('updateAdminRoleReload$ effect', () => { - it('should reload the admins when the admin is updated', () => { - actions = new ReplaySubject(1); - - actions.next(new UpdateAdminSuccess({id: 'foo', changes: { ...admin }})); - - effects.updateAdminRoleReload$.subscribe(result => { - expect(result).toEqual(new LoadAdminRequest()); - }); - }); - }); - - describe('updateAdminRoleSuccess$', () => { - it('should fire a notification to the notification service', () => { - let payload = { id: 'foo', changes: { ...admin } }; - actions = new ReplaySubject(1); - - actions.next(new UpdateAdminSuccess(payload)); - - effects.updateAdminRoleSuccess$.subscribe(result => { - expect(result.type).toEqual(ADD_NOTIFICATION); - }); - }); - }); -}); diff --git a/ui/src/app/admin/effect/admin-collection.effect.ts b/ui/src/app/admin/effect/admin-collection.effect.ts deleted file mode 100644 index f867193a8..000000000 --- a/ui/src/app/admin/effect/admin-collection.effect.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { switchMap, map } from 'rxjs/operators'; -import { - LoadAdminRequest, - AdminCollectionActionTypes, - LoadAdminSuccess, - UpdateAdminRequest, - UpdateAdminSuccess, - RemoveAdminRequest, - RemoveAdminSuccess -} from '../action/admin-collection.action'; -import { AdminService } from '../service/admin.service'; -import { AddNotification } from '../../notification/action/notification.action'; -import { Notification, NotificationType } from '../../notification/model/notification'; - - -/* istanbul ignore next */ -@Injectable() -export class AdminCollectionEffects { - - @Effect() - loadAdminRequest$ = this.actions$.pipe( - ofType(AdminCollectionActionTypes.LOAD_ADMIN_REQUEST), - switchMap(() => this.adminService.query().pipe( - map(users => new LoadAdminSuccess(users)) - )) - ); - - @Effect() - updateAdminRequest$ = this.actions$.pipe( - ofType(AdminCollectionActionTypes.UPDATE_ADMIN_REQUEST), - map(action => action.payload), - switchMap(changes => this.adminService.update(changes).pipe( - map(user => new UpdateAdminSuccess({ - id: changes.username, - changes - })) - )) - ); - - @Effect() - updateAdminRoleReload$ = this.actions$.pipe( - ofType(AdminCollectionActionTypes.UPDATE_ADMIN_SUCCESS), - map(action => new LoadAdminRequest()) - ); - - @Effect() - updateAdminRoleSuccess$ = this.actions$.pipe( - ofType(AdminCollectionActionTypes.UPDATE_ADMIN_SUCCESS), - map(action => action.payload), - map(user => new AddNotification( - new Notification( - NotificationType.Success, - `User update successful for ${ user.changes.username }`, - 5000 - ) - )) - ); - - @Effect() - removeAdminRequest$ = this.actions$.pipe( - ofType(AdminCollectionActionTypes.REMOVE_ADMIN_REQUEST), - map(action => action.payload), - switchMap(id => this.adminService.remove(id).pipe( - map(user => new RemoveAdminSuccess(id)) - )) - ); - - @Effect() - removeAdminSuccessReload$ = this.actions$.pipe( - ofType(AdminCollectionActionTypes.REMOVE_ADMIN_SUCCESS), - map(action => new LoadAdminRequest()) - ); - - @Effect() - deleteAdminRoleSuccess$ = this.actions$.pipe( - ofType(AdminCollectionActionTypes.REMOVE_ADMIN_SUCCESS), - map(action => action.payload), - map(user => new AddNotification( - new Notification( - NotificationType.Success, - `User deleted.`, - 5000 - ) - )) - ); - - constructor( - private actions$: Actions, - private adminService: AdminService - ) { } -} diff --git a/ui/src/app/admin/effect/metadata-collection.effect.spec.ts b/ui/src/app/admin/effect/metadata-collection.effect.spec.ts deleted file mode 100644 index 5c76b04b7..000000000 --- a/ui/src/app/admin/effect/metadata-collection.effect.spec.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { TestBed } from '@angular/core/testing'; -import { provideMockActions } from '@ngrx/effects/testing'; -import { Subject, Observable, of, ReplaySubject } from 'rxjs'; -import { StoreModule, combineReducers } from '@ngrx/store'; - -import { MetadataCollectionEffects } from './metadata-collection.effect'; -import { LoadMetadataRequest, LoadMetadataSuccess } from '../action/metadata-collection.action'; -import { ResolverService } from '../../metadata/domain/service/resolver.service'; -import { Metadata } from '../../metadata/domain/domain.type'; -import { MetadataResolver } from '../../metadata/domain/model'; -import * as fromI18n from '../../i18n/reducer'; -import { I18nService } from '../../i18n/service/i18n.service'; -import { Router } from '@angular/router'; -import { RouterStub } from '../../../testing/router.stub'; - -describe('Metadata Collection Effects', () => { - let effects: MetadataCollectionEffects; - let actions: Subject; - - let md: Metadata = { - serviceProviderName: 'foo', - name: 'foo', - type: 'bar', - resourceId: 'foo', - createdBy: 'admin' - }; - - let resolverService; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - StoreModule.forRoot({ - 'i18n': combineReducers(fromI18n.reducers), - }) - ], - providers: [ - { - provide: ResolverService, - useValue: jasmine.createSpyObj( - 'ResolverService', - [ - 'queryForAdmin', - 'update', - 'remove' - ] - ) - }, - { - provide: I18nService, - useValue: jasmine.createSpyObj( - 'I18nService', - [ - 'translate' - ] - ) - }, - MetadataCollectionEffects, - provideMockActions(() => actions), - { provide: Router, useClass: RouterStub } - ], - }); - - effects = TestBed.get(MetadataCollectionEffects); - resolverService = TestBed.get(ResolverService); - }); - - describe(`loadMetadatas$ effect`, () => { - it('should load admins and fire a success action', () => { - resolverService.queryForAdmin.and.returnValue(of([md])); - actions = new ReplaySubject(1); - - actions.next(new LoadMetadataRequest()); - - effects.loadMetadatas$.subscribe(result => { - expect(result).toEqual(new LoadMetadataSuccess([md] as MetadataResolver[])); - }); - }); - }); -}); diff --git a/ui/src/app/admin/effect/metadata-collection.effect.ts b/ui/src/app/admin/effect/metadata-collection.effect.ts deleted file mode 100644 index db5f3e4e7..000000000 --- a/ui/src/app/admin/effect/metadata-collection.effect.ts +++ /dev/null @@ -1,143 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { Store } from '@ngrx/store'; -import { of } from 'rxjs'; -import { map, catchError, switchMap, tap, withLatestFrom } from 'rxjs/operators'; - -import { - MetadataCollectionActionTypes, - LoadMetadataRequest, - LoadMetadataSuccess, - LoadMetadataError, - RemoveMetadataRequest, - RemoveMetadataSuccess, - RemoveMetadataFail, - UpdateMetadataRequest, - UpdateMetadataSuccess, - UpdateMetadataFail, - UpdateMetadataConflict -} from '../action/metadata-collection.action'; -import { ResolverService } from '../../metadata/domain/service/resolver.service'; -import { removeNulls } from '../../shared/util'; -import { AddNotification } from '../../notification/action/notification.action'; -import { Notification, NotificationType } from '../../notification/model/notification'; -import { I18nService } from '../../i18n/service/i18n.service'; -import * as fromRoot from '../../app.reducer'; -import * as fromI18n from '../../i18n/reducer'; -import { Router } from '@angular/router'; - - -/* istanbul ignore next */ -@Injectable() -export class MetadataCollectionEffects { - - @Effect() - loadMetadatas$ = this.actions$.pipe( - ofType(MetadataCollectionActionTypes.LOAD_METADATA_REQUEST), - switchMap(() => - this.descriptorService - .queryForAdmin() - .pipe( - map(descriptors => new LoadMetadataSuccess(descriptors)), - catchError(error => of(new LoadMetadataError(error))) - ) - ) - ); - - @Effect() - updateMetadata$ = this.actions$.pipe( - ofType(MetadataCollectionActionTypes.UPDATE_METADATA_REQUEST), - map(action => action.payload), - switchMap(provider => { - return this.descriptorService - .update(removeNulls(provider)) - .pipe( - map(p => new UpdateMetadataSuccess({ - id: p.id, - changes: p - })), - catchError(err => { - if (err.status === 409) { - return of(new UpdateMetadataConflict(provider)); - } - return of(new UpdateMetadataFail({ - errorCode: err.status, - errorMessage: `${err.statusText} - ${err.message}` - })); - }) - ); - }) - ); - - @Effect() - removeMetadataSuccessReload$ = this.actions$.pipe( - ofType(MetadataCollectionActionTypes.REMOVE_METADATA_SUCCESS), - map(action => action.payload), - map(provider => new LoadMetadataRequest()) - ); - - @Effect() - updateMetadataSuccessNotification$ = this.actions$.pipe( - ofType(MetadataCollectionActionTypes.UPDATE_METADATA_SUCCESS), - map(action => action.payload), - withLatestFrom(this.store.select(fromI18n.getMessages)), - map(([error, messages]) => new AddNotification( - new Notification( - NotificationType.Success, - `Metadata Source has been enabled`, - 8000 - ) - )) - ); - - @Effect() - updateMetadataFailNotification$ = this.actions$.pipe( - ofType(MetadataCollectionActionTypes.UPDATE_METADATA_FAIL), - map(action => action.payload), - withLatestFrom(this.store.select(fromI18n.getMessages)), - map(([error, messages]) => new AddNotification( - new Notification( - NotificationType.Danger, - `${error.errorCode}: ${this.i18nService.translate(error.errorMessage, null, messages)}`, - 8000 - ) - )) - ); - - @Effect() - updateMetadataSuccessReload$ = this.actions$.pipe( - ofType(MetadataCollectionActionTypes.UPDATE_METADATA_SUCCESS), - map(() => new LoadMetadataRequest()) - ); - - @Effect() - removeMetadata$ = this.actions$.pipe( - ofType(MetadataCollectionActionTypes.REMOVE_METADATA), - map(action => action.payload), - switchMap(entity => - this.descriptorService - .remove(entity) - .pipe( - map(p => new RemoveMetadataSuccess(entity)), - catchError(err => of(new RemoveMetadataFail(err))) - ) - ) - ); - - @Effect({dispatch: false}) - redirectOnRemove$ = this.actions$.pipe( - ofType(MetadataCollectionActionTypes.REMOVE_METADATA_SUCCESS), - map(action => action.payload), - switchMap(entity => - this.router.navigate(['/']) - ) - ); - - constructor( - private descriptorService: ResolverService, - private actions$: Actions, - private store: Store, - private i18nService: I18nService, - private router: Router - ) { } -} /* istanbul ignore next */ diff --git a/ui/src/app/admin/model/admin.ts b/ui/src/app/admin/model/admin.ts deleted file mode 100644 index b7cd90296..000000000 --- a/ui/src/app/admin/model/admin.ts +++ /dev/null @@ -1,11 +0,0 @@ -export interface Admin { - createdDate?: string; - updatedDate?: string; - username: string; - firstName: string; - lastName: string; - - role: string; - - emailAddress: string; -} diff --git a/ui/src/app/admin/reducer/admin-collection.reducer.spec.ts b/ui/src/app/admin/reducer/admin-collection.reducer.spec.ts deleted file mode 100644 index 4c26df392..000000000 --- a/ui/src/app/admin/reducer/admin-collection.reducer.spec.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { reducer, initialState as snapshot } from './admin-collection.reducer'; -import * as fromAdmin from './admin-collection.reducer'; -import { - AdminCollectionActionTypes, - LoadAdminSuccess, - UpdateAdminSuccess, - RemoveAdminSuccess -} from '../action/admin-collection.action'; -import { Admin } from '../model/admin'; - -let users = [ - { - username: 'abc', - role: 'ROLE_ADMIN', - emailAddress: 'foo@bar.com', - firstName: 'Jane', - lastName: 'Doe' - }, - { - username: 'def', - role: 'ROLE_USER', - emailAddress: 'bar@baz.com', - firstName: 'John', - lastName: 'Doe' - } -]; - -describe('Admin Collection Reducer', () => { - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(snapshot, {} as any); - - expect(result).toEqual(snapshot); - }); - }); - - describe(`${AdminCollectionActionTypes.LOAD_ADMIN_SUCCESS}`, () => { - it('should add the loaded filters to the collection', () => { - spyOn(fromAdmin.adapter, 'addAll').and.callThrough(); - const action = new LoadAdminSuccess(users); - const result = reducer(snapshot, action); - expect(fromAdmin.adapter.addAll).toHaveBeenCalled(); - }); - }); - - describe(`${AdminCollectionActionTypes.UPDATE_ADMIN_SUCCESS}`, () => { - it('should update the filter in the collection', () => { - spyOn(fromAdmin.adapter, 'updateOne').and.callThrough(); - const update = { - id: 'abc', - changes: { role: 'DELEGATED_ADMIN' } - }; - const action = new UpdateAdminSuccess(update); - const result = reducer(snapshot, action); - expect(fromAdmin.adapter.updateOne).toHaveBeenCalled(); - }); - }); - - describe(`${AdminCollectionActionTypes.REMOVE_ADMIN_SUCCESS}`, () => { - it('should set saving to false', () => { - const action = new RemoveAdminSuccess('abc'); - expect(reducer(snapshot, action).saving).toBe(false); - }); - }); - - describe('selector methods', () => { - describe('getSelectedAdminId', () => { - it('should return the state selectedAdminId', () => { - expect(fromAdmin.getSelectedAdminId(snapshot)).toBe(snapshot.selectedAdminId); - }); - }); - - describe('getError', () => { - it('should return the state saving', () => { - expect(fromAdmin.getIsSaving(snapshot)).toBe(snapshot.saving); - }); - }); - }); -}); diff --git a/ui/src/app/admin/reducer/admin-collection.reducer.ts b/ui/src/app/admin/reducer/admin-collection.reducer.ts deleted file mode 100644 index ce404d57d..000000000 --- a/ui/src/app/admin/reducer/admin-collection.reducer.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { EntityState, EntityAdapter, createEntityAdapter } from '@ngrx/entity'; -import { Admin } from '../model/admin'; -import { AdminCollectionActionsUnion, AdminCollectionActionTypes } from '../action/admin-collection.action'; - -export interface CollectionState extends EntityState { - selectedAdminId: string | null; - saving: boolean; -} - -export const adapter: EntityAdapter = createEntityAdapter({ - selectId: (model: Admin) => model.username -}); - -export const initialState: CollectionState = adapter.getInitialState({ - selectedAdminId: null, - saving: false -}); - -export function reducer(state = initialState, action: AdminCollectionActionsUnion): CollectionState { - switch (action.type) { - case AdminCollectionActionTypes.LOAD_ADMIN_SUCCESS: { - let s = adapter.addAll(action.payload, { - ...state, - selectedAdminId: state.selectedAdminId - }); - return s; - } - case AdminCollectionActionTypes.UPDATE_ADMIN_SUCCESS: { - return adapter.updateOne(action.payload, { - ...state, - saving: false - }); - } - case AdminCollectionActionTypes.REMOVE_ADMIN_SUCCESS: { - return adapter.removeOne(action.payload, { - ...state, - saving: false - }); - } - - default: { - return state; - } - } -} - -export const getSelectedAdminId = (state: CollectionState) => state.selectedAdminId; -export const getIsSaving = (state: CollectionState) => state.saving; -export const { - selectIds: selectAdminIds, - selectEntities: selectAdminEntities, - selectAll: selectAllAdmins, - selectTotal: selectAdminTotal -} = adapter.getSelectors(); diff --git a/ui/src/app/admin/reducer/index.spec.ts b/ui/src/app/admin/reducer/index.spec.ts deleted file mode 100644 index 4b88e86e8..000000000 --- a/ui/src/app/admin/reducer/index.spec.ts +++ /dev/null @@ -1,54 +0,0 @@ -import * as fromIndex from './'; -import { MetadataResolver } from '../../metadata/domain/model'; -import { User } from '../../core/model/user'; - -let resolvers: MetadataResolver[] = [ - { id: '1', entityId: 'foo', serviceEnabled: true, serviceProviderName: 'bar', createdDate: 'Date' } as MetadataResolver, - { id: '2', entityId: 'baz', serviceEnabled: false, serviceProviderName: 'fin', createdDate: 'Date' } as MetadataResolver -]; - -let users: User[] = [ - { - username: 'foo', - role: 'ROLE_ADMIN', - firstName: 'foo', - lastName: 'bar', - emailAddress: 'foo@bar.com' - }, - { - username: 'bar', - role: 'ROLE_NONE', - firstName: 'baz', - lastName: 'foo', - emailAddress: 'fooz@ball.com' - } -]; - -describe('admin dashboard state selectors', () => { - describe('getConfiguredAdminsFn', () => { - it('should return all users without the `ROLE_NONE` role', () => { - expect(fromIndex.getConfiguredAdminsFn(users).length).toBe(1); - }); - }); - - describe('getNewUsersFn', () => { - it('should return all users with the `ROLE_NONE` role', () => { - expect(fromIndex.getNewUsersFn(users).length).toBe(1); - }); - }); - describe('totalUserFn', () => { - it('should get the length of the provided array', () => { - expect(fromIndex.totalUserFn(users)).toBe(2); - }); - }); - describe('totalMetadataFn', () => { - it('should get the length of the provided list after filtering enabled resolvers', () => { - expect(fromIndex.totalMetadataFn(resolvers)).toBe(1); - }); - }); - describe('totalActionsFn', () => { - it('should return the sum of the total users and metadata', () => { - expect(fromIndex.totalActionsFn(1, 2)).toBe(3); - }); - }); -}); diff --git a/ui/src/app/admin/reducer/index.ts b/ui/src/app/admin/reducer/index.ts deleted file mode 100644 index 76b7d5720..000000000 --- a/ui/src/app/admin/reducer/index.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { createSelector, createFeatureSelector } from '@ngrx/store'; -import * as fromRoot from '../../core/reducer'; -import * as fromAdminCollection from './admin-collection.reducer'; -import * as fromMetadataCollection from './metadata-collection.reducer'; -import { getInCollectionFn } from '../../metadata/domain/domain.util'; - -export interface AdminState { - admins: fromAdminCollection.CollectionState; - metadata: fromMetadataCollection.CollectionState; -} - -export const reducers = { - admins: fromAdminCollection.reducer, - metadata: fromMetadataCollection.reducer -}; - -export interface State extends fromRoot.State { - 'admin': AdminState; -} - -export const getAdminsCollectionFromStateFn = (state: AdminState) => state.admins; -export const getMetadataCollectionFromStateFn = (state: AdminState) => state.metadata; - -export const getFeatureState = createFeatureSelector('admin'); - -/* - * Select pieces of Admin Collection -*/ -export const getAdminCollectionState = createSelector(getFeatureState, getAdminsCollectionFromStateFn); -export const getAllAdmins = createSelector(getAdminCollectionState, fromAdminCollection.selectAllAdmins); -export const getCollectionSaving = createSelector(getAdminCollectionState, fromAdminCollection.getIsSaving); - -export const getAdminEntities = createSelector(getAdminCollectionState, fromAdminCollection.selectAdminEntities); -export const getSelectedAdminId = createSelector(getAdminCollectionState, fromAdminCollection.getSelectedAdminId); -export const getSelectedAdmin = createSelector(getAdminEntities, getSelectedAdminId, getInCollectionFn); -export const getAdminIds = createSelector(getAdminCollectionState, fromAdminCollection.selectAdminIds); - - -export const getConfiguredAdminsFn = (admins) => admins.filter(a => a.role !== 'ROLE_NONE'); -export const getAllConfiguredAdmins = createSelector(getAllAdmins, getConfiguredAdminsFn); - -export const getNewUsersFn = (admins) => admins.filter(a => a.role === 'ROLE_NONE'); -export const getAllNewUsers = createSelector(getAllAdmins, getNewUsersFn); - -/* - * Select pieces of Metadata Collection -*/ -export const getMetadataCollectionState = createSelector(getFeatureState, getMetadataCollectionFromStateFn); - -export const getMetadataEntities = createSelector(getMetadataCollectionState, fromMetadataCollection.selectMetadataEntities); -export const getSelectedMetadataId = createSelector(getMetadataCollectionState, fromMetadataCollection.getSelectedMetadataId); -export const getMetadataIds = createSelector(getMetadataCollectionState, fromMetadataCollection.selectMetadataIds); - -export const getMetadataCollection = createSelector(getMetadataCollectionState, getMetadataIds, fromMetadataCollection.selectAllMetadata); -export const getSelectedMetadata = createSelector(getMetadataEntities, getSelectedMetadataId, getInCollectionFn); - -export const totalUserFn = (users) => users.length; -export const totalMetadataFn = (md) => md.filter(obj => !obj.serviceEnabled).length; -export const totalActionsFn = (users, md) => md + users; - -export const getTotalNewUsers = createSelector(getAllNewUsers, totalUserFn); -export const getTotalNewMetadata = createSelector(getMetadataCollection, totalMetadataFn); - -export const getTotalActionsRequired = createSelector(getTotalNewUsers, getTotalNewMetadata, totalActionsFn); diff --git a/ui/src/app/admin/reducer/metadata-collection.reducer.spec.ts b/ui/src/app/admin/reducer/metadata-collection.reducer.spec.ts deleted file mode 100644 index a1b5b0c70..000000000 --- a/ui/src/app/admin/reducer/metadata-collection.reducer.spec.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { reducer } from './metadata-collection.reducer'; -import * as fromCollection from './metadata-collection.reducer'; -import * as resolverActions from '../action/metadata-collection.action'; -import { MetadataResolver } from '../../metadata/domain/model'; - -let resolvers: MetadataResolver[] = [ - { id: '1', entityId: 'foo', serviceProviderName: 'bar', createdDate: 'Tue Apr 17 2018 13:33:54 GMT-0700 (MST)' } as MetadataResolver, - { id: '2', entityId: 'baz', serviceProviderName: 'fin', createdDate: 'Tue Apr 17 2018 13:34:07 GMT-0700 (MST)' } as MetadataResolver -], -snapshot: fromCollection.CollectionState = { - ids: [resolvers[0].id, resolvers[1].id], - entities: { - [resolvers[0].id]: resolvers[0], - [resolvers[1].id]: resolvers[1] - }, - selectedMetadataId: null -}; - -describe('Resolver Reducer', () => { - const initialState: fromCollection.CollectionState = { - ids: [], - entities: {}, - selectedMetadataId: null, - }; - - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(undefined, {} as any); - - expect(result).toEqual(initialState); - }); - }); - - describe('Load Providers: Success', () => { - it('should add the loaded resolvers to the collection', () => { - const action = new resolverActions.LoadMetadataSuccess(resolvers); - const result = reducer(initialState, action); - - expect(result).toEqual( - Object.assign({}, initialState, snapshot) - ); - }); - }); - - describe('Update Providers: Success', () => { - it('should update the draft of the specified id', () => { - let changes = { ...resolvers[1], serviceEnabled: true }, - expected = { - ids: [resolvers[0].id, resolvers[1].id], - entities: { - [resolvers[0].id]: resolvers[0], - [resolvers[1].id]: changes - }, - selectedMetadataId: null - }; - const action = new resolverActions.UpdateMetadataSuccess({ id: changes.id, changes }); - const result = reducer({ ...snapshot }, action); - - expect(result).toEqual( - Object.assign({}, initialState, expected) - ); - }); - - it('should return state if the entityId is not found', () => { - let changes = { ...resolvers[1], serviceEnabled: true, id: '4' }; - const action = new resolverActions.UpdateMetadataSuccess({ id: changes.id, changes }); - const result = reducer({ ...snapshot }, action); - - expect(result).toEqual(snapshot); - }); - }); -}); diff --git a/ui/src/app/admin/reducer/metadata-collection.reducer.ts b/ui/src/app/admin/reducer/metadata-collection.reducer.ts deleted file mode 100644 index b11dded01..000000000 --- a/ui/src/app/admin/reducer/metadata-collection.reducer.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { EntityState, EntityAdapter, createEntityAdapter } from '@ngrx/entity'; -import { MetadataResolver } from '../../metadata/domain/model'; -import { MetadataCollectionActionsUnion, MetadataCollectionActionTypes } from '../action/metadata-collection.action'; - -export interface CollectionState extends EntityState { - selectedMetadataId: string | null; -} - -export function sortByDate(a: MetadataResolver, b: MetadataResolver): number { - return a.createdDate.localeCompare(b.createdDate); -} - -export const adapter: EntityAdapter = createEntityAdapter({ - sortComparer: sortByDate, - selectId: (model: MetadataResolver) => model.id -}); - -export const initialState: CollectionState = adapter.getInitialState({ - selectedMetadataId: null -}); - -export function reducer(state = initialState, action: MetadataCollectionActionsUnion): CollectionState { - switch (action.type) { - case MetadataCollectionActionTypes.LOAD_METADATA_SUCCESS: { - return adapter.addAll(action.payload, { - ...state, - selectedMetadataId: state.selectedMetadataId - }); - } - - case MetadataCollectionActionTypes.UPDATE_METADATA_SUCCESS: { - return adapter.updateOne(action.payload, state); - } - - case MetadataCollectionActionTypes.LOAD_METADATA_ERROR: { - return adapter.removeAll({ - ...state - }); - } - - case MetadataCollectionActionTypes.REMOVE_METADATA_SUCCESS: { - return adapter.removeOne(action.payload, { - ...state - }); - } - - default: { - return state; - } - } -} - -export const getSelectedMetadataId = (state: CollectionState) => state.selectedMetadataId; -export const { - selectIds: selectMetadataIds, - selectEntities: selectMetadataEntities, - selectAll: selectAllMetadata, - selectTotal: selectMetadataTotal -} = adapter.getSelectors(); diff --git a/ui/src/app/admin/service/admin.service.spec.ts b/ui/src/app/admin/service/admin.service.spec.ts deleted file mode 100644 index 39955145f..000000000 --- a/ui/src/app/admin/service/admin.service.spec.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { TestBed, inject, waitForAsync } from '@angular/core/testing'; -import { AdminService } from './admin.service'; -import { HttpTestingController, HttpClientTestingModule } from '@angular/common/http/testing'; -import { HttpRequest, HttpClientModule } from '@angular/common/http'; -import { Admin } from '../model/admin'; -import API_BASE_PATH from '../../app.constant'; - -let users = [ - { - username: 'abc', - role: 'ROLE_ADMIN', - emailAddress: 'foo@bar.com', - firstName: 'Jane', - lastName: 'Doe' - }, - { - username: 'def', - role: 'ROLE_USER', - emailAddress: 'bar@baz.com', - firstName: 'John', - lastName: 'Doe' - } -]; - -describe('Admin Service', () => { - // let service: AdminService; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - HttpClientModule, - HttpClientTestingModule - ], - providers: [ - AdminService - ] - }); - // service = TestBed.get(AdminService); - }); - - describe('query', () => { - it(`should send an expected query request`, waitForAsync(inject([AdminService, HttpTestingController], - (service: AdminService, backend: HttpTestingController) => { - service.query().subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `${API_BASE_PATH}/admin/users` - && req.method === 'GET'; - }, `GET admin collection`); - } - ))); - }); - describe('update method', () => { - it(`should send an expected patch request`, waitForAsync(inject([AdminService, HttpTestingController], - (service: AdminService, backend: HttpTestingController) => { - service.update({...users[0]}).subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `${API_BASE_PATH}/admin/users/abc` - && req.method === 'PATCH'; - }, `PATCH admin user`); - } - ))); - }); - describe('remove method', () => { - it(`should send an expected delete request`, waitForAsync(inject([AdminService, HttpTestingController], - (service: AdminService, backend: HttpTestingController) => { - service.remove(users[0].username).subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `${API_BASE_PATH}/admin/users/abc` - && req.method === 'DELETE'; - }, `DELETE admin user`); - } - ))); - }); -}); diff --git a/ui/src/app/admin/service/admin.service.ts b/ui/src/app/admin/service/admin.service.ts deleted file mode 100644 index 580616bc3..000000000 --- a/ui/src/app/admin/service/admin.service.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable, of } from 'rxjs'; -import { Admin } from '../model/admin'; -import { HttpClient } from '@angular/common/http'; -import { map, catchError } from 'rxjs/operators'; - -import API_BASE_PATH from '../../app.constant'; - -@Injectable() -export class AdminService { - - private endpoint = '/admin/users'; - private base = API_BASE_PATH; - - constructor( - private http: HttpClient - ) { } - query(): Observable { - return this.http.get( - `${this.base}${this.endpoint}`, {} - ); - } - - queryByRole(role: string): Observable { - return this.http.get( - `${this.base}${this.endpoint}/role/${role}`, {} - ); - } - - update(user: Admin): Observable { - return this.http.patch( - `${this.base}${this.endpoint}/${user.username}`, {...user} - ); - } - - remove(userId: string): Observable { - return this.http.delete( - `${this.base}${this.endpoint}/${userId}` - ).pipe( - map(response => !!response), - catchError(() => of(false)) - ); - } -} diff --git a/ui/src/app/app.brand.ts b/ui/src/app/app.brand.js similarity index 95% rename from ui/src/app/app.brand.ts rename to ui/src/app/app.brand.js index eb828fc41..92ef84ec4 100644 --- a/ui/src/app/app.brand.ts +++ b/ui/src/app/app.brand.js @@ -1,7 +1,6 @@ import { brand as customBrand } from '../brand'; -import { Brand } from './core/model/brand'; -export const brand: Brand = { +export const brand = { header: { title: 'brand.header.title' }, diff --git a/ui/src/app/app.component.html b/ui/src/app/app.component.html deleted file mode 100644 index d1f544101..000000000 --- a/ui/src/app/app.component.html +++ /dev/null @@ -1,96 +0,0 @@ - -
- - - -
-
-
- - -
-
diff --git a/ui/src/app/app.component.scss b/ui/src/app/app.component.scss deleted file mode 100644 index 6d1c6d0a1..000000000 --- a/ui/src/app/app.component.scss +++ /dev/null @@ -1,27 +0,0 @@ -@import '../theme/palette'; -nav.navbar { - background-color: $white; - - .dropdown-menu { - min-width: 12rem; - } -} - -.logo a { - img { - display: inline-block; - max-height: 60px; - } -} - -@media only screen and (min-width: 1024px) { - .pad-content { - padding: 0 3rem; - } -} - -@media only screen and (min-width: 1200px) { - .pad-content { - padding: 0 5rem; - } -} diff --git a/ui/src/app/app.component.spec.ts b/ui/src/app/app.component.spec.ts deleted file mode 100644 index 34bf1f15d..000000000 --- a/ui/src/app/app.component.spec.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; -import { AppComponent } from './app.component'; - -import * as fromRoot from './core/reducer'; -import { NotificationModule } from './notification/notification.module'; -import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; -import { MockI18nService, MockI18nModule } from '../testing/i18n.stub'; -import { I18nService } from './i18n/service/i18n.service'; -import { NavigationService } from './core/service/navigation.service'; -import { NavigationServiceStub } from '../testing/navigation-service.stub'; -import { MockPageTitleComponent } from '../testing/page-title-component.stub'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(AppComponent, {static: true}) - public componentUnderTest: AppComponent; -} - -describe('AppComponent', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: AppComponent; - let store: Store; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - providers: [ - {provide: I18nService, useClass: MockI18nService }, - { provide: NavigationService, useValue: NavigationServiceStub } - ], - imports: [ - NgbDropdownModule, - RouterTestingModule, - StoreModule.forRoot({ - core: combineReducers(fromRoot.reducers) - }), - NotificationModule, - MockI18nModule - ], - declarations: [ - AppComponent, - MockPageTitleComponent, - TestHostComponent - ], - }).compileComponents(); - - store = TestBed.get(Store); - spyOn(store, 'dispatch'); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should create the app', waitForAsync(() => { - expect(app).toBeTruthy(); - expect(store.dispatch).toHaveBeenCalledTimes(3); - })); - - it(`should have as title 'Shib-UI'`, waitForAsync(() => { - expect(app.title).toEqual('Shib UI'); - })); - - describe('version format', () => { - it('should return a formatted string', () => { - expect(app.formatter({ - build: { - version: 'foo' - }, - git: { - commit: { - id: 'bar' - } - } - })).toEqual('foo-bar'); - }); - }); -}); diff --git a/ui/src/app/app.component.ts b/ui/src/app/app.component.ts deleted file mode 100644 index c1d0349f1..000000000 --- a/ui/src/app/app.component.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { Component, OnInit, ChangeDetectionStrategy } from '@angular/core'; -import { Observable, of, combineLatest } from 'rxjs'; -import { map, catchError, filter } from 'rxjs/operators'; - -import { Store } from '@ngrx/store'; - -import * as fromRoot from './core/reducer'; -import { VersionInfo } from './core/model/version'; -import { VersionInfoLoadRequestAction } from './core/action/version.action'; -import { I18nService } from './i18n/service/i18n.service'; -import { SetLocale } from './i18n/action/message.action'; -import { brand } from './app.brand'; -import { Brand } from './core/model/brand'; -import { UserLoadRequestAction } from './core/action/user.action'; -import { Router } from '@angular/router'; -import { NavigationService } from './core/service/navigation.service'; -import { NavigationAction } from './core/model/action'; - -@Component({ - selector: 'app-root', - templateUrl: './app.component.html', - styleUrls: ['./app.component.scss'] -}) -export class AppComponent implements OnInit { - title = 'Shib UI'; - version$: Observable; - version: string; - formatted$: Observable; - today = new Date(); - year = new Date().getFullYear(); - isAdmin$: Observable; - brand: Brand = brand; - nav$: Observable; - - formatter = v => v && v.build ? `${v.build.version}-${v.git.commit.id}` : ''; - - constructor( - private store: Store, - private i18nService: I18nService, - private navService: NavigationService - ) { - this.version$ = this.store.select(fromRoot.getVersionInfo); - this.formatted$ = this.version$.pipe(map(this.formatter)); - this.isAdmin$ = this.store.select(fromRoot.isCurrentUserAdmin); - - this.nav$ = combineLatest( - this.store.select(fromRoot.getCurrentUserRole).pipe(filter(r => !!r)), - this.navService.emitter - ).pipe( - map(([role, actions]) => actions.filter( - action => action.restrict ? action.restrict.includes(role) : action - ) - )); - } - - ngOnInit(): void { - this.store.dispatch(new UserLoadRequestAction()); - this.store.dispatch(new VersionInfoLoadRequestAction()); - this.store.dispatch(new SetLocale(this.i18nService.getCurrentLocale())); - } -} diff --git a/ui/src/app/app.constant.ts b/ui/src/app/app.constant.ts deleted file mode 100644 index 206ee74c7..000000000 --- a/ui/src/app/app.constant.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const API_BASE_PATH = 'api'; -export default API_BASE_PATH; diff --git a/ui/src/app/app.module.ts b/ui/src/app/app.module.ts deleted file mode 100644 index 9d6fb8ab4..000000000 --- a/ui/src/app/app.module.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { BrowserModule } from '@angular/platform-browser'; -import { NgModule } from '@angular/core'; -import { StoreModule } from '@ngrx/store'; -import { EffectsModule } from '@ngrx/effects'; -import { StoreDevtoolsModule } from '@ngrx/store-devtools'; -import { StoreRouterConnectingModule, RouterStateSerializer, DefaultRouterStateSerializer } from '@ngrx/router-store'; -import { HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http'; - -import { NgbDropdownModule, NgbModalModule, NgbPopoverModule, NgbPaginationModule } from '@ng-bootstrap/ng-bootstrap'; - -import { AppRoutingModule } from './app.routing'; -import { AppComponent } from './app.component'; - -import { CoreModule } from './core/core.module'; - -import { reducers, metaReducers } from './app.reducer'; -import { CustomRouterStateSerializer } from './shared/util'; -import { AuthorizedInterceptor } from './core/service/authorized.interceptor'; -import { NotificationModule } from './notification/notification.module'; -import { ErrorInterceptor } from './core/service/error.interceptor'; -import { ContentionModule } from './contention/contention.module'; -import { SharedModule } from './shared/shared.module'; -import { WizardModule } from './wizard/wizard.module'; -import { FormModule } from './schema-form/schema-form.module'; -import { environment } from '../environments/environment.prod'; -import { I18nModule } from './i18n/i18n.module'; -import { ApiPathInterceptor } from './core/service/api-path.interceptor'; -import { APP_BASE_HREF } from '@angular/common'; - -@NgModule({ - declarations: [ - AppComponent - ], - imports: [ - StoreModule.forRoot(reducers, { - metaReducers, - runtimeChecks: { - strictActionImmutability: false, - strictActionSerializability: false, - strictStateImmutability: false, - strictStateSerializability: false - } - }), - StoreDevtoolsModule.instrument({ - maxAge: 25, // Retains last 25 states - logOnly: environment.production, // Restrict extension to log-only mode - }), - EffectsModule.forRoot([]), - BrowserModule, - CoreModule, - CoreModule.forRoot(), - StoreRouterConnectingModule.forRoot({ serializer: DefaultRouterStateSerializer }), - NgbDropdownModule, - NgbModalModule, - NgbPopoverModule, - NgbPaginationModule, - WizardModule.forRoot(), - FormModule.forRoot(), - NotificationModule, - HttpClientModule, - ContentionModule, - SharedModule, - I18nModule.forRoot(), - I18nModule, - AppRoutingModule - ], - providers: [ - { - provide: APP_BASE_HREF, - useFactory: () => { - const url = new URL(document.getElementsByTagName('base')[0].href); - return url.pathname; - } - }, - { - provide: RouterStateSerializer, - useClass: CustomRouterStateSerializer - }, - { - provide: HTTP_INTERCEPTORS, - useClass: AuthorizedInterceptor, - multi: true - }, - { - provide: HTTP_INTERCEPTORS, - useClass: ErrorInterceptor, - multi: true - }, - { - provide: HTTP_INTERCEPTORS, - useClass: ApiPathInterceptor, - multi: true - } - ], - bootstrap: [AppComponent] -}) -export class AppModule {} diff --git a/ui/src/app/app.reducer.ts b/ui/src/app/app.reducer.ts deleted file mode 100644 index 5808ccf22..000000000 --- a/ui/src/app/app.reducer.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { ActionReducerMap, MetaReducer } from '@ngrx/store'; -import * as fromRouter from '@ngrx/router-store'; - -import { RouterStateUrl } from './shared/util'; - -export interface State { - router: fromRouter.RouterReducerState; -} - -export const reducers: ActionReducerMap = { - router: fromRouter.routerReducer, -}; - -export const metaReducers: MetaReducer[] = []; diff --git a/ui/src/app/app.routing.ts b/ui/src/app/app.routing.ts deleted file mode 100644 index bceb76c2c..000000000 --- a/ui/src/app/app.routing.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { NgModule } from '@angular/core'; -import { Routes, RouterModule, PreloadAllModules } from '@angular/router'; - -const routes: Routes = [ - { path: '', redirectTo: 'dashboard', pathMatch: 'full' }, - { - path: 'dashboard', - loadChildren: () => import('./dashboard/dashboard.module').then(m => m.DashboardModule) - }, - { - path: 'metadata', - loadChildren: () => import('./metadata/metadata.module').then(m => m.MetadataModule) - } -]; - -@NgModule({ - imports: [RouterModule.forRoot(routes, { - preloadingStrategy: PreloadAllModules, - scrollOffset: [0, 64], - anchorScrolling: 'enabled', - scrollPositionRestoration: 'enabled', - relativeLinkResolution: 'legacy', - paramsInheritanceStrategy: 'always' -})], - exports: [RouterModule] -}) -export class AppRoutingModule { } diff --git a/ui/src/app/contention/action/contention.action.ts b/ui/src/app/contention/action/contention.action.ts deleted file mode 100644 index 0976c9c2d..000000000 --- a/ui/src/app/contention/action/contention.action.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Action } from '@ngrx/store'; -import { Contention, ContentionResolution } from '../model/contention'; - -export enum ContentionActionTypes { - SHOW_CONTENTION = '[Contention] Show Contention', - RESOLVE_CONTENTION = '[Contention] Resolve Contention', - CANCEL_CONTENTION = '[Contention] Cancel Contention' -} - -export class ShowContentionAction implements Action { - readonly type = ContentionActionTypes.SHOW_CONTENTION; - - constructor(public payload: Contention) {} -} - -export class ResolveContentionAction implements Action { - readonly type = ContentionActionTypes.RESOLVE_CONTENTION; - - constructor(public payload: ContentionResolution) {} -} - -export class CancelContentionAction implements Action { - readonly type = ContentionActionTypes.CANCEL_CONTENTION; - - constructor(public payload: ContentionResolution) { } -} - -export type ContentionActionUnion = - | ShowContentionAction - | ResolveContentionAction - | CancelContentionAction; diff --git a/ui/src/app/contention/component/change-item.component.html b/ui/src/app/contention/component/change-item.component.html deleted file mode 100644 index b1b82de6c..000000000 --- a/ui/src/app/contention/component/change-item.component.html +++ /dev/null @@ -1,41 +0,0 @@ -
-
- - - Conflict - -
- - - - - - - - - - - - - - - - - - -
- -
{{ obj[key] }}
{{ val }}
-
- -
- -
-
{{ item.value }}
-
-
-
- -

-
-
diff --git a/ui/src/app/contention/component/change-item.component.scss b/ui/src/app/contention/component/change-item.component.scss deleted file mode 100644 index 2bd2fccab..000000000 --- a/ui/src/app/contention/component/change-item.component.scss +++ /dev/null @@ -1,12 +0,0 @@ -@import '../../../theme/_palette'; - -:host { - .table { - tr th { - background: $gray-200; - } - tr td { - background: $gray-100; - } - } -} \ No newline at end of file diff --git a/ui/src/app/contention/component/change-item.component.ts b/ui/src/app/contention/component/change-item.component.ts deleted file mode 100644 index 8a2f40251..000000000 --- a/ui/src/app/contention/component/change-item.component.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { Component, Input, OnChanges } from '@angular/core'; -import { ChangeItem } from '../model/contention'; - -export enum ValueTypes { - array = 'array', - object = 'object', - string = 'string', - number = 'number', - symbol = 'symbol', - boolean = 'boolean', - function = 'function', - undefined = 'undefined' -} - -@Component({ - selector: 'change-item', - templateUrl: './change-item.component.html', - styleUrls: ['./change-item.component.scss'] -}) -export class ChangeItemComponent implements OnChanges { - - @Input() item: ChangeItem; - - type: string; - types = ValueTypes; - - display: any; - - constructor() {} - - ngOnChanges(): void { - let value = this.item.value; - this.type = this.getType(value); - this.display = this.getValue(value); - } - - get isList(): boolean { - return Array.isArray(this.item.value); - } - - getType(value: any): string { - return Array.isArray(value) ? 'array' : typeof value; - } - - getValue(val: any): any { - switch (this.type) { - case 'object': { - return Object.keys(val).map(k => ({ label: k, value: val[k] })); - } - case 'array': { - return this.parseArray(val); - } - default: { - return val; - } - } - } - - parseArray(list: any[]): { type: string, values: any[], headings?: string[] } { - switch (this.getType(list[0])) { - case 'string': { - return { - type: 'string', - values: list - }; - } - default: { - return { - type: 'object', - headings: list.reduce((arr, o) => { - return Object.keys(o).reduce((a, k) => { - if (a.indexOf(k) === -1) { a.push(k); } - return a; - }, arr); - }, []), - values: list - }; - } - } - } -} diff --git a/ui/src/app/contention/component/contention-dialog.component.html b/ui/src/app/contention/component/contention-dialog.component.html deleted file mode 100644 index 18b436d03..000000000 --- a/ui/src/app/contention/component/contention-dialog.component.html +++ /dev/null @@ -1,51 +0,0 @@ -
- - - - -
diff --git a/ui/src/app/contention/component/contention-dialog.component.scss b/ui/src/app/contention/component/contention-dialog.component.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/ui/src/app/contention/component/contention-dialog.component.spec.ts b/ui/src/app/contention/component/contention-dialog.component.spec.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/ui/src/app/contention/component/contention-dialog.component.ts b/ui/src/app/contention/component/contention-dialog.component.ts deleted file mode 100644 index 1f3070081..000000000 --- a/ui/src/app/contention/component/contention-dialog.component.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { Component } from '@angular/core'; -import { Observable } from 'rxjs'; -import { Store } from '@ngrx/store'; -import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; - -import * as fromContention from '../reducer'; -import { Contention, ChangeItem } from '../model/contention'; - -@Component({ - selector: 'contention-dialog', - templateUrl: './contention-dialog.component.html', - styleUrls: ['./contention-dialog.component.scss'] -}) -export class ContentionDialogComponent { - - contention$: Observable>; - - theirs: ChangeItem[]; - ours: ChangeItem[]; - - resolutionObj: Object; - rejectionObj: Object; - - constructor( - public activeModal: NgbActiveModal, - private store: Store - ) { - this.contention$ = this.store.select(fromContention.getContention); - - this.contention$.subscribe(contention => { - if (contention) { - this.rejectionObj = contention.rejectionObject; - this.resolutionObj = contention.resolutionObject; - - this.ours = contention.ourChanges; - this.theirs = contention.theirChanges; - } - }); - } -} diff --git a/ui/src/app/contention/contention.module.ts b/ui/src/app/contention/contention.module.ts deleted file mode 100644 index 5ecc3c680..000000000 --- a/ui/src/app/contention/contention.module.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { StoreModule } from '@ngrx/store'; -import { EffectsModule } from '@ngrx/effects'; - -import { reducers } from './reducer'; -import { ContentionEffects } from './effect/contention.effect'; -import { ContentionDialogComponent } from './component/contention-dialog.component'; -import { ChangeItemComponent } from './component/change-item.component'; -import { ContentionService } from './service/contention.service'; -import { SharedModule } from '../shared/shared.module'; -import { I18nModule } from '../i18n/i18n.module'; - -export const COMPONENTS = [ - ContentionDialogComponent, - ChangeItemComponent -]; - -@NgModule({ - imports: [ - CommonModule, - SharedModule, - StoreModule.forFeature('contention', reducers), - EffectsModule.forFeature([ContentionEffects]), - I18nModule - ], - providers: [ - ContentionService - ], - declarations: COMPONENTS, - entryComponents: COMPONENTS, - exports: COMPONENTS, -}) -export class ContentionModule {} diff --git a/ui/src/app/contention/effect/contention.effect.ts b/ui/src/app/contention/effect/contention.effect.ts deleted file mode 100644 index 55c815c71..000000000 --- a/ui/src/app/contention/effect/contention.effect.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { of } from 'rxjs'; -import { map, tap, catchError, switchMap } from 'rxjs/operators'; - -import { - ShowContentionAction, - ResolveContentionAction, - ContentionActionTypes, - CancelContentionAction -} from '../action/contention.action'; -import { ModalService, DEFAULT_MODAL_OPTIONS } from '../../core/service/modal.service'; -import { ContentionDialogComponent } from '../component/contention-dialog.component'; - - -@Injectable() -export class ContentionEffects { - - @Effect() - showContention$ = this.actions$.pipe( - ofType(ContentionActionTypes.SHOW_CONTENTION), - map(action => action.payload), - switchMap(contention => { - const resolutionAction = of(new ResolveContentionAction({ value: contention.resolutionObject, handlers: contention.handlers })); - const rejectionAction = of(new CancelContentionAction({ value: contention.rejectionObject, handlers: contention.handlers })); - return this.modal - .open(ContentionDialogComponent, DEFAULT_MODAL_OPTIONS, { contention }) - .pipe( - switchMap(result => resolutionAction), - catchError(result => rejectionAction) - ); - }) - ); - - @Effect({ dispatch: false }) - resolveContention$ = this.actions$.pipe( - ofType(ContentionActionTypes.RESOLVE_CONTENTION), - map(action => action.payload), - tap(r => r.handlers.resolve(r.value)) - ); - - @Effect({ dispatch: false }) - cancelContention$ = this.actions$.pipe( - ofType(ContentionActionTypes.CANCEL_CONTENTION), - map(action => action.payload), - tap(r => r.handlers.reject(r.value)) - ); - - constructor( - private actions$: Actions, - private modal: ModalService - ) { } -} diff --git a/ui/src/app/contention/model/contention.ts b/ui/src/app/contention/model/contention.ts deleted file mode 100644 index 6109c25b0..000000000 --- a/ui/src/app/contention/model/contention.ts +++ /dev/null @@ -1,71 +0,0 @@ -export interface Versioned extends Object { - version: number; -} - -export interface Contention { - base: T; - ours: T; - theirs: T; - - rejectionObject: Object; - resolutionObject: Object; - - ourChanges: T; - theirChanges: T; - - handlers: { - resolve(value: T), - reject(value: T) - }; -} - -export interface ContentionResolution { - value: T; - handlers: { - resolve(value: T), - reject(value: T) - }; -} - -export interface ChangeItem { - label: string; - value: any; - conflict?: boolean; -} - -export class ContentionEntity implements Contention { - - private _theirChanges: T; - private _ourChanges: T; - - constructor( - readonly base: T, - readonly ours: T, - readonly theirs: T, - readonly handlers: { resolve(value: T), reject(value: T) } - ) {} - - get theirChanges(): T { - return this._theirChanges; - } - - get ourChanges(): T { - return this._ourChanges; - } - - set theirChanges(changes: T) { - this._theirChanges = changes; - } - - set ourChanges(changes: T) { - this._ourChanges = changes; - } - - get rejectionObject (): Object { - return this.theirs; - } - - get resolutionObject (): Object { - return { ...this.base as Object, ...this.ours as Object, version: this.theirs.version }; - } -} diff --git a/ui/src/app/contention/reducer/contention.reducer.spec.ts b/ui/src/app/contention/reducer/contention.reducer.spec.ts deleted file mode 100644 index a96438428..000000000 --- a/ui/src/app/contention/reducer/contention.reducer.spec.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { reducer, initialState as snapshot, getContention } from './contention.reducer'; -import { ContentionActionTypes, ShowContentionAction, ResolveContentionAction, CancelContentionAction } from '../action/contention.action'; - -describe('Contention Reducer', () => { - - const contention = { - base: {}, - ours: {}, - theirs: {}, - - rejectionObject: {}, - resolutionObject: {}, - - ourChanges: {}, - theirChanges: {}, - - handlers: { - resolve: (value: {}) => ({}), - reject: (value: {}) => ({}) - } - }; - - const populated = { ...snapshot, contention: { ...contention } }; - - const resolution = { value: contention.ours, handlers: contention.handlers }; - - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(snapshot, {} as any); - - expect(result).toEqual(snapshot); - }); - }); - - describe(`${ContentionActionTypes.SHOW_CONTENTION}`, () => { - it('should reset to initial state', () => { - expect(reducer(snapshot, new ShowContentionAction(contention))).toEqual(populated); - }); - }); - - describe(`${ContentionActionTypes.RESOLVE_CONTENTION}`, () => { - it('should reset to initial state', () => { - expect(reducer(snapshot, new ResolveContentionAction(resolution))).toEqual(snapshot); - }); - }); - - describe(`${ContentionActionTypes.CANCEL_CONTENTION}`, () => { - it('should reset to initial state', () => { - expect(reducer(snapshot, new CancelContentionAction(resolution))).toEqual(snapshot); - }); - }); - - describe(`getContention method`, () => { - it('should return the contention object from the state', () => { - expect(getContention(snapshot)).toBe(snapshot.contention); - expect(getContention(populated)).toEqual(contention); - }); - }); -}); diff --git a/ui/src/app/contention/reducer/contention.reducer.ts b/ui/src/app/contention/reducer/contention.reducer.ts deleted file mode 100644 index d5432a93d..000000000 --- a/ui/src/app/contention/reducer/contention.reducer.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { ContentionActionTypes, ContentionActionUnion } from '../action/contention.action'; -import { Contention } from '../model/contention'; - -export interface State { - contention: Contention; -} - -export const initialState: State = { - contention: null -}; - -export function reducer(state = initialState, action: ContentionActionUnion): State { - switch (action.type) { - case ContentionActionTypes.SHOW_CONTENTION: { - return { - ...state, - contention: action.payload - }; - } - case ContentionActionTypes.RESOLVE_CONTENTION: - case ContentionActionTypes.CANCEL_CONTENTION: { - return { - ...initialState - }; - } - default: { - return state; - } - } -} - -export const getContention = (state: State) => state.contention; diff --git a/ui/src/app/contention/reducer/index.spec.ts b/ui/src/app/contention/reducer/index.spec.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/ui/src/app/contention/reducer/index.ts b/ui/src/app/contention/reducer/index.ts deleted file mode 100644 index b4bcac876..000000000 --- a/ui/src/app/contention/reducer/index.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { createSelector, createFeatureSelector } from '@ngrx/store'; -import * as fromContention from './contention.reducer'; -import * as fromRoot from '../../app.reducer'; - -export interface ContentionState { - contention: fromContention.State; -} - -export const reducers = { - contention: fromContention.reducer -}; - -export interface State extends fromRoot.State { - 'contention': ContentionState; -} - -export const getCoreState = createFeatureSelector('contention'); - -export const getContentionStateFromStateFn = (state: ContentionState) => state.contention; -export const getContentionStateFromState = createSelector(getCoreState, getContentionStateFromStateFn); - -export const getContention = createSelector(getContentionStateFromState, fromContention.getContention); diff --git a/ui/src/app/contention/service/contention.service.ts b/ui/src/app/contention/service/contention.service.ts deleted file mode 100644 index f9b85f3c6..000000000 --- a/ui/src/app/contention/service/contention.service.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { Injectable } from '@angular/core'; -import { DifferentialService } from '../../core/service/differential.service'; -import { ContentionEntity, ChangeItem } from '../model/contention'; -import { removeNulls } from '../../shared/util'; - -@Injectable() -export class ContentionService { - - filterKeys = (key => (['version', 'modifiedDate', 'createdDate', 'createdBy', 'modifiedBy', 'audId'].indexOf(key) === -1)); - - constructor( - private diffService: DifferentialService - ) { } - - getContention(base, ours, theirs, handlers): ContentionEntity { - let entity = new ContentionEntity(base, ours, theirs, handlers); - - let theirDiff = this.diffService.updatedDiff(base, theirs); - let ourDiff = this.diffService.updatedDiff(base, removeNulls(ours)); - let ourKeys = Object.keys(ourDiff).filter(this.filterKeys); - let theirKeys = Object.keys(theirDiff).filter(this.filterKeys); - - entity.ourChanges = ourKeys.map(key => this.getChangeItem(key, ours)); - entity.theirChanges = theirKeys.map(key => this.getChangeItem(key, theirs, ourKeys)); - - return entity; - } - - getChangeItem(key, collection, compare: string[] = []): ChangeItem { - return { - label: key, - value: collection[key], - conflict: compare.some(o => o === key) - }; - } -} diff --git a/ui/src/app/core/action/configuration.action.ts b/ui/src/app/core/action/configuration.action.ts deleted file mode 100644 index 33c9e4c82..000000000 --- a/ui/src/app/core/action/configuration.action.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Action } from '@ngrx/store'; - -export enum ConfigurationActionTypes { - LOAD_ROLE_REQUEST = '[Config] Load User Role Request', - LOAD_ROLE_SUCCESS = '[Config] Load User Role Success', - LOAD_ROLE_FAIL = '[Config] Load User Role Fail' -} - -export class LoadRoleRequest implements Action { - readonly type = ConfigurationActionTypes.LOAD_ROLE_REQUEST; - - constructor() {} -} -export class LoadRoleSuccess implements Action { - readonly type = ConfigurationActionTypes.LOAD_ROLE_SUCCESS; - - constructor(public payload: string[]) { } -} -export class LoadRoleFail implements Action { - readonly type = ConfigurationActionTypes.LOAD_ROLE_FAIL; - - constructor() { } -} - -export type ConfigurationActionUnion = - | LoadRoleRequest - | LoadRoleSuccess - | LoadRoleFail -; diff --git a/ui/src/app/core/action/location.action.ts b/ui/src/app/core/action/location.action.ts deleted file mode 100644 index b9da73b3d..000000000 --- a/ui/src/app/core/action/location.action.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Action } from '@ngrx/store'; - -export enum LocationActionTypes { - SET_TITLE = '[Location] Set Title' -} - -export class SetTitle implements Action { - readonly type = LocationActionTypes.SET_TITLE; - - constructor(public payload: string) { } -} - -export type LocationActionUnion = - | SetTitle; diff --git a/ui/src/app/core/action/user.action.ts b/ui/src/app/core/action/user.action.ts deleted file mode 100644 index 8ab396e12..000000000 --- a/ui/src/app/core/action/user.action.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { Action } from '@ngrx/store'; -import { User } from '../model/user'; - - -export enum CurrentUserActionTypes { - USER_LOAD_REQUEST = '[Current User] Load User Request', - USER_LOAD_SUCCESS = '[Current User] Load User Success', - USER_LOAD_ERROR = '[Current User] Load User Fail', - REDIRECT = '[Current User] Redirect' -} - -/** - * Add User to Collection Actions - */ -export class UserLoadRequestAction implements Action { - readonly type = CurrentUserActionTypes.USER_LOAD_REQUEST; - - constructor() { } -} - -export class UserLoadSuccessAction implements Action { - readonly type = CurrentUserActionTypes.USER_LOAD_SUCCESS; - - constructor(public payload: User) { } -} - -export class UserLoadErrorAction implements Action { - readonly type = CurrentUserActionTypes.USER_LOAD_ERROR; - - constructor(public payload: { message: string }) { } -} - -export class UserRedirect implements Action { - readonly type = CurrentUserActionTypes.REDIRECT; - - constructor(public payload: string) { } -} - -export type CurrentUserActionsUnion = - | UserLoadRequestAction - | UserLoadSuccessAction - | UserLoadErrorAction - | UserRedirect; diff --git a/ui/src/app/core/action/version.action.ts b/ui/src/app/core/action/version.action.ts deleted file mode 100644 index 82d945547..000000000 --- a/ui/src/app/core/action/version.action.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Action } from '@ngrx/store'; - -import { VersionInfo } from '../model/version'; - -export const VERSION_LOAD_REQUEST = '[Version] Load REQUEST'; -export const VERSION_LOAD_SUCCESS = '[Version] Load SUCCESS'; -export const VERSION_LOAD_ERROR = '[Version] Load ERROR'; - -/** - * Add User to Collection Actions - */ -export class VersionInfoLoadRequestAction implements Action { - readonly type = VERSION_LOAD_REQUEST; -} - -export class VersionInfoLoadSuccessAction implements Action { - readonly type = VERSION_LOAD_SUCCESS; - - constructor (public payload: VersionInfo) { } -} - -export class VersionInfoLoadErrorAction implements Action { - readonly type = VERSION_LOAD_ERROR; - - constructor(public payload: Error) { } -} - -export type Actions = - | VersionInfoLoadRequestAction - | VersionInfoLoadSuccessAction - | VersionInfoLoadErrorAction; diff --git a/ui/src/app/core/component/page-title.component.spec.ts b/ui/src/app/core/component/page-title.component.spec.ts deleted file mode 100644 index b810d7d7e..000000000 --- a/ui/src/app/core/component/page-title.component.spec.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; - -import * as fromWizard from '../../wizard/reducer'; -import * as fromI18n from '../../i18n/reducer'; -import * as fromCore from '../reducer'; -import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; -import { PageTitleComponent } from './page-title.component'; -import { MockI18nModule, MockI18nService } from '../../../testing/i18n.stub'; -import { I18nService } from '../../i18n/service/i18n.service'; - -@Component({ - template: `` -}) -class TestHostComponent { - @ViewChild(PageTitleComponent, { static: true }) - public componentUnderTest: PageTitleComponent; -} - -describe('Page Title Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: PageTitleComponent; - let store: Store; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - RouterTestingModule, - StoreModule.forRoot({ - wizard: combineReducers(fromWizard.reducers), - core: combineReducers(fromCore.reducers), - i18n: combineReducers(fromI18n.reducers) - }), - MockI18nModule - ], - declarations: [ - PageTitleComponent, - TestHostComponent - ], - providers: [ - { - provide: I18nService, - useClass: MockI18nService - } - ] - }).compileComponents(); - - store = TestBed.get(Store); - spyOn(store, 'dispatch'); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should compile without error', () => { - expect(app).toBeTruthy(); - }); -}); diff --git a/ui/src/app/core/component/page-title.component.ts b/ui/src/app/core/component/page-title.component.ts deleted file mode 100644 index 676bcfc23..000000000 --- a/ui/src/app/core/component/page-title.component.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { Component, OnInit, OnDestroy } from '@angular/core'; - -import { Store } from '@ngrx/store'; - -import * as fromRoot from '../reducer'; -import { Observable, Subscription } from 'rxjs'; -import { Router, ActivatedRoute, NavigationEnd } from '@angular/router'; -import { I18nService } from '../../i18n/service/i18n.service'; -import { filter, map, mergeMap, startWith, combineLatest } from 'rxjs/operators'; -import { getCurrent } from '../../wizard/reducer'; -import { getMessages } from '../../i18n/reducer'; -import { SetTitle } from '../action/location.action'; - -@Component({ - selector: 'page-title', - template: `

{{ pageTitle$ | async }}

`, - styleUrls: [] -}) -export class PageTitleComponent implements OnInit, OnDestroy { - - pageTitle$: Observable = this.store.select(fromRoot.getLocationTitle); - - initial = true; - sub: Subscription; - - constructor( - private store: Store, - private router: Router, - private activatedRoute: ActivatedRoute, - private translateService: I18nService - ) { - this.pageTitle$.subscribe(title => { - const heading = document.getElementById('main-page-title'); - if (heading && title) { - if (!this.initial) { - heading.focus(); - } - this.initial = false; - } - if (title) { - document.title = `Shibboleth IDP UI | ${title}`; - } - }); - } - - ngOnInit(): void { - this.sub = this.router.events.pipe( - filter(e => e instanceof NavigationEnd), - map(() => this.activatedRoute), - map((route) => { - while (route.firstChild) { - route = route.firstChild; - } - return route; - }), - filter((route) => route.outlet === 'primary'), - mergeMap((route) => route.data), - combineLatest( - this.store.select(getCurrent).pipe( - filter(c => !!c), - startWith({ label: '' }) - ), - this.store.select(getMessages).pipe( - startWith({}) - ) - ), - map(([data, currentWizardPage, messages]) => { - const title = data.subtitle && currentWizardPage ? - `${data.title} - ${this.translateService.translate(currentWizardPage.label, null, messages)}` - : - data.title; - return new SetTitle(title); - }) - ).subscribe(this.store); - } - - ngOnDestroy(): void { - this.sub.unsubscribe(); - } -} diff --git a/ui/src/app/core/components/AdminRoute.js b/ui/src/app/core/components/AdminRoute.js new file mode 100644 index 000000000..1b8783ec8 --- /dev/null +++ b/ui/src/app/core/components/AdminRoute.js @@ -0,0 +1,25 @@ +import React from 'react'; +import { Redirect, Route } from 'react-router'; + +import { useIsAdmin } from '../user/UserContext'; + +export function AdminRoute({ children, ...rest }) { + const isAdmin = useIsAdmin(); + return ( + + isAdmin ? ( + children + ) : ( + + ) + } + /> + ); +} \ No newline at end of file diff --git a/ui/src/app/core/components/Footer.js b/ui/src/app/core/components/Footer.js new file mode 100644 index 000000000..2d4c6fbca --- /dev/null +++ b/ui/src/app/core/components/Footer.js @@ -0,0 +1,51 @@ +import React from 'react'; + +import Translate from '../../i18n/components/translate'; +import {useTranslation} from '../../i18n/hooks'; + +import { brand } from '../../app.brand'; +import VersionInfo from './VersionInfo'; + +function FooterLink ({ link }) { + const description = useTranslation(link?.description || ''); + const label = useTranslation(link?.label || ''); + return ( + + {label} + + ); +} + +export default function Footer () { + return ( +
+
+
+
+
    +
  • + { brand.footer.links.map((link, idx) => +
  • + +
  • + ) } +
+ +
+
+
+
+ In partnership with  + + Unicon Logo + +  and  + + Internet 2 Logo + +
+
+
+
+ ); +} diff --git a/ui/src/app/core/components/FormattedDate.js b/ui/src/app/core/components/FormattedDate.js new file mode 100644 index 000000000..e9298af73 --- /dev/null +++ b/ui/src/app/core/components/FormattedDate.js @@ -0,0 +1,10 @@ +import React from 'react'; +import { format, parseISO } from 'date-fns'; + +export function FormattedDate ({ date, time = false }) { + const formatted = React.useMemo(() => format(parseISO(date), `MMM d, Y${time ? ' HH:mm:ss' : ''}`), [date, time]); + + return (<>{ formatted }); +} + +export default FormattedDate; \ No newline at end of file diff --git a/ui/src/app/core/components/FormattedDate.test.js b/ui/src/app/core/components/FormattedDate.test.js new file mode 100644 index 000000000..a013c93ea --- /dev/null +++ b/ui/src/app/core/components/FormattedDate.test.js @@ -0,0 +1,9 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; + +import { FormattedDate } from './FormattedDate'; + +it('should display a formatted date', () => { + render(); + expect(screen.getByText('Jun 10, 2021')).toBeInTheDocument(); +}); \ No newline at end of file diff --git a/ui/src/app/core/components/Header.js b/ui/src/app/core/components/Header.js new file mode 100644 index 000000000..54d0c402c --- /dev/null +++ b/ui/src/app/core/components/Header.js @@ -0,0 +1,78 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; + +import Nav from 'react-bootstrap/Nav'; +import Navbar from 'react-bootstrap/Navbar'; +import Dropdown from 'react-bootstrap/Dropdown'; + +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { faTh, faSignOutAlt, faPlusCircle, faCube, faCubes } from '@fortawesome/free-solid-svg-icons'; + +import Translate from '../../i18n/components/translate'; +import { useTranslator } from '../../i18n/hooks'; + +import { brand } from '../../app.brand'; +import { useIsAdmin } from '../user/UserContext'; + +export function Header () { + + const translator = useTranslator(); + + const isAdmin = useIsAdmin(); + + return ( + + + {brand.logo.alt} + + + + + + + + + ); +} + +export default Header; \ No newline at end of file diff --git a/ui/src/app/core/components/UserConfirmation.js b/ui/src/app/core/components/UserConfirmation.js new file mode 100644 index 000000000..cf0688b6b --- /dev/null +++ b/ui/src/app/core/components/UserConfirmation.js @@ -0,0 +1,55 @@ +import React from 'react'; +import Modal from 'react-bootstrap/Modal'; +import Button from 'react-bootstrap/Button'; +import Translate from '../../i18n/components/translate'; +import { useHistory } from 'react-router-dom'; + + +export function UserConfirmation({children}) { + const [confirm, setConfirm] = React.useState(false); + const [confirmCallback, setConfirmCallback] = React.useState(null); + const [message, setMessage] = React.useState(''); + + function getConfirmation(message, callback) { + setConfirmCallback(() => callback); + setConfirm(true); + setMessage(message); + } + + return (<>{children(message, confirm, confirmCallback, setConfirm, getConfirmation)}); +} + +export function ConfirmWindow ({message, confirm, setConfirm, confirmCallback}) { + + const history = useHistory(); + + const allowTransition = () => { + setConfirm(false); + confirmCallback(true); + if (history.location.pathname.includes('provider/new')) { + window.location.reload(); + } + } + + const blockTransition = () => { + setConfirm(false); + confirmCallback(false); + } + + return ( + + + Are you sure? + + + +

{message}

+
+ + + + + +
+ ); +} \ No newline at end of file diff --git a/ui/src/app/core/components/VersionInfo.js b/ui/src/app/core/components/VersionInfo.js new file mode 100644 index 000000000..ab1fff8d5 --- /dev/null +++ b/ui/src/app/core/components/VersionInfo.js @@ -0,0 +1,31 @@ +import React from 'react'; + +import useFetch from 'use-http'; + +import Translate from '../../i18n/components/translate'; + +const formatter = v => v && v.build ? `${v.build.version}-${v.git.commit.id}` : ''; + +const year = new Date().getFullYear(); +const params = { year }; + +export function VersionInfo () { + + const { data = {} } = useFetch('/actuator/info', {}, []); + + const [ versionData, setVersionData ] = React.useState(''); + + React.useEffect(() => { + setVersionData(formatter(data)); + }, [data]); + + return ( +

+ {versionData} +  |  + Copyright & copy; Internet2 +

+ ); +} + +export default VersionInfo; \ No newline at end of file diff --git a/ui/src/app/core/components/VersionInfo.test.js b/ui/src/app/core/components/VersionInfo.test.js new file mode 100644 index 000000000..28a8a6b47 --- /dev/null +++ b/ui/src/app/core/components/VersionInfo.test.js @@ -0,0 +1,21 @@ +import React from 'react'; + +import { render, screen } from '@testing-library/react'; + +import { VersionInfo } from './VersionInfo'; + +const data = { "git": { "branch": "react", "commit": { "id": "634f1a4", "time": "2021-06-10T19:00:29Z" } }, "build": { "artifact": "shibui", "name": "backend", "time": "2021-06-10T19:26:14.478Z", "version": "2.0.0-SNAPSHOT", "group": "edu.internet2.tier.shibboleth.admin.ui" } }; + +jest.mock('../../i18n/components/translate', () => { + return 'span'; +}) + +jest.mock('use-http', () => { + return () => ({ data }); +}); + +it('should display formatted version information', () => { + + render(); + expect(screen.getByText('2.0.0-SNAPSHOT-634f1a4', { exact: false })).toBeInTheDocument(); +}); \ No newline at end of file diff --git a/ui/src/app/core/core.module.spec.ts b/ui/src/app/core/core.module.spec.ts deleted file mode 100644 index e19572a40..000000000 --- a/ui/src/app/core/core.module.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { TestBed } from '@angular/core/testing'; -import { StoreModule } from '@ngrx/store'; -import { EffectsModule } from '@ngrx/effects'; -import { CoreModule } from './core.module'; -import { UserService } from './service/user.service'; -import { HttpClientModule } from '@angular/common/http'; - -describe('Core Module', () => { - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - StoreModule.forRoot({}), - EffectsModule.forRoot([]), - CoreModule.forRoot(), - HttpClientModule - ] - }); - }); - - it('should compile', () => { - expect(TestBed.get(UserService)).toBeDefined(); - }); -}); diff --git a/ui/src/app/core/core.module.ts b/ui/src/app/core/core.module.ts deleted file mode 100644 index 8173289be..000000000 --- a/ui/src/app/core/core.module.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { NgModule, ModuleWithProviders } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { RouterModule } from '@angular/router'; -import { StoreModule } from '@ngrx/store'; -import { EffectsModule } from '@ngrx/effects'; - -import { UserService } from './service/user.service'; -import { CanDeactivateGuard } from './service/can-deactivate.guard'; -import { FileService } from './service/file.service'; - -import { reducers } from './reducer'; -import { VersionEffects } from './effect/version.effect'; -import { UserEffects } from './effect/user.effect'; -import { HttpClientModule } from '@angular/common/http'; -import { ModalService } from './service/modal.service'; -import { DifferentialService } from './service/differential.service'; -import { NavigatorService } from './service/navigator.service'; -import { NavigationService } from './service/navigation.service'; -import { PageTitleComponent } from './component/page-title.component'; - -export const COMPONENTS = [ - PageTitleComponent -]; - -@NgModule({ - imports: [ - CommonModule, - RouterModule, - HttpClientModule - ], - declarations: COMPONENTS, - entryComponents: COMPONENTS, - exports: COMPONENTS, -}) -export class CoreModule { - static forRoot(): ModuleWithProviders { - return { - ngModule: RootCoreModule, - providers: [ - UserService, - FileService, - ModalService, - DifferentialService, - CanDeactivateGuard, - NavigatorService, - NavigationService - ] - }; -} -} - -@NgModule({ - imports: [ - StoreModule.forFeature('core', reducers), - EffectsModule.forFeature([UserEffects, VersionEffects]), - ], -}) -export class RootCoreModule { } diff --git a/ui/src/app/core/effect/user.effect.spec.ts b/ui/src/app/core/effect/user.effect.spec.ts deleted file mode 100644 index 1c11e0635..000000000 --- a/ui/src/app/core/effect/user.effect.spec.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { TestBed } from '@angular/core/testing'; -import { provideMockActions } from '@ngrx/effects/testing'; -import { ReplaySubject } from 'rxjs'; - -import { UserEffects } from './user.effect'; -import { Subject, of, throwError } from 'rxjs'; -import { UserService } from '../service/user.service'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; -import { LoadRoleSuccess, LoadRoleFail, LoadRoleRequest } from '../action/configuration.action'; - -describe('User Effects', () => { - let effects: UserEffects; - let actions: Subject; - let userService: UserService; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - HttpClientTestingModule - ], - providers: [ - UserEffects, - UserService, - provideMockActions(() => actions), - ], - }); - - effects = TestBed.get(UserEffects); - userService = TestBed.get(UserService); - }); - - it('should fire a success action', () => { - spyOn(userService, 'getRoles').and.returnValue(of(['ROLE_ADMIN'])); - actions = new ReplaySubject(1); - - actions.next(new LoadRoleRequest()); - - effects.loadRoles$.subscribe(result => { - expect(result).toEqual(new LoadRoleSuccess(['ROLE_ADMIN'])); - }); - }); - - it('should fire an error action', () => { - let err = new Error('404'); - spyOn(userService, 'getRoles').and.returnValue(throwError(err)); - actions = new ReplaySubject(1); - - actions.next(new LoadRoleRequest()); - - effects.loadRoles$.subscribe(result => { - expect(result).toEqual(new LoadRoleFail()); - }); - }); -}); diff --git a/ui/src/app/core/effect/user.effect.ts b/ui/src/app/core/effect/user.effect.ts deleted file mode 100644 index 5417fa999..000000000 --- a/ui/src/app/core/effect/user.effect.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; - -import { of } from 'rxjs'; -import { map, tap, catchError, switchMap } from 'rxjs/operators'; - -import { - LoadRoleRequest, - LoadRoleFail, - LoadRoleSuccess, - ConfigurationActionTypes -} from '../action/configuration.action'; -import { - UserLoadRequestAction, - CurrentUserActionTypes, - UserLoadSuccessAction, - UserLoadErrorAction, - UserRedirect -} from '../action/user.action'; -import { UserService } from '../service/user.service'; - -@Injectable() -export class UserEffects { - - @Effect() - loadRoles$ = this.actions$.pipe( - ofType(ConfigurationActionTypes.LOAD_ROLE_REQUEST), - switchMap(() => - this.userService.getRoles() - .pipe( - map(roles => new LoadRoleSuccess(roles)), - catchError(error => of(new LoadRoleFail())) - ) - ) - ); - - @Effect() - loadCurrentUser$ = this.actions$.pipe( - ofType(CurrentUserActionTypes.USER_LOAD_REQUEST), - switchMap(() => - this.userService.getCurrentUser() - .pipe( - map(user => new UserLoadSuccessAction(user)), - catchError(error => of(new UserLoadErrorAction(error))) - ) - ) - ); - - @Effect({dispatch: false}) - redirect$ = this.actions$.pipe( - ofType(CurrentUserActionTypes.REDIRECT), - map((action: UserRedirect) => action.payload), - tap(path => { - window.location.href = path; - }) - ); - - constructor( - private userService: UserService, - private actions$: Actions - ) { } -} diff --git a/ui/src/app/core/effect/version.effect.spec.ts b/ui/src/app/core/effect/version.effect.spec.ts deleted file mode 100644 index 2713d1362..000000000 --- a/ui/src/app/core/effect/version.effect.spec.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { TestBed } from '@angular/core/testing'; -import { provideMockActions } from '@ngrx/effects/testing'; -import { ReplaySubject } from 'rxjs'; - -import { VersionEffects } from './version.effect'; -import { - VersionInfoLoadRequestAction, - VersionInfoLoadSuccessAction, - VersionInfoLoadErrorAction -} from '../action/version.action'; -import { Subject, of, throwError } from 'rxjs'; -import { HttpClient } from '@angular/common/http'; -import { VersionInfo } from '../model/version'; - -describe('Version Effects', () => { - let effects: VersionEffects; - let actions: Subject; - let httpClient = { - get: () => of({}) - }; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [], - providers: [ - { provide: HttpClient, useValue: httpClient }, - VersionEffects, - provideMockActions(() => actions), - ], - }); - - effects = TestBed.get(VersionEffects); - httpClient = TestBed.get(HttpClient); - }); - - it('should fire a success action', () => { - let v = {}; - spyOn(httpClient, 'get').and.returnValue(of({})); - actions = new ReplaySubject(1); - - actions.next(new VersionInfoLoadRequestAction()); - - effects.loadVersionInfo$.subscribe(result => { - expect(result).toEqual(new VersionInfoLoadSuccessAction(v as VersionInfo)); - }); - }); - - it('should fire an error action', () => { - let err = new Error('404'); - spyOn(httpClient, 'get').and.returnValue(throwError(err)); - actions = new ReplaySubject(1); - - actions.next(new VersionInfoLoadRequestAction()); - - effects.loadVersionInfo$.subscribe(result => { - expect(result).toEqual(new VersionInfoLoadErrorAction(err)); - }); - }); -}); diff --git a/ui/src/app/core/effect/version.effect.ts b/ui/src/app/core/effect/version.effect.ts deleted file mode 100644 index b588a6011..000000000 --- a/ui/src/app/core/effect/version.effect.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { Location } from '@angular/common'; -import { HttpClient } from '@angular/common/http'; - -import { of } from 'rxjs'; -import { map, switchMap, catchError } from 'rxjs/operators'; - -import * as version from '../action/version.action'; -import { VersionInfo } from '../model/version'; - -@Injectable() -export class VersionEffects { - - private endpoint = '/info'; - private base = 'actuator'; - - @Effect() - loadVersionInfo$ = this.actions$ - .pipe( - ofType(version.VERSION_LOAD_REQUEST), - switchMap(() => - this.http.get(`${this.base}${this.endpoint}`) - .pipe( - map(info => new version.VersionInfoLoadSuccessAction(info)), - catchError(error => of(new version.VersionInfoLoadErrorAction(error))) - ) - ) - ); - - constructor( - private http: HttpClient, - private actions$: Actions - ) { } -} /* istanbul ignore next */ diff --git a/ui/src/app/core/hooks/utils.js b/ui/src/app/core/hooks/utils.js new file mode 100644 index 000000000..8ba7e8020 --- /dev/null +++ b/ui/src/app/core/hooks/utils.js @@ -0,0 +1,5 @@ +import {uuid} from '../utility/uuid'; + +export function useGuid() { + return uuid(); +} \ No newline at end of file diff --git a/ui/src/app/core/model/action.ts b/ui/src/app/core/model/action.ts deleted file mode 100644 index 49ad487aa..000000000 --- a/ui/src/app/core/model/action.ts +++ /dev/null @@ -1,8 +0,0 @@ -export interface NavigationAction { - action: ($event: Event) => void; - category?: string; - label: string; - content: string; - icon?: string; - restrict?: string[]; -} diff --git a/ui/src/app/core/model/brand.ts b/ui/src/app/core/model/brand.ts deleted file mode 100644 index 2713957e3..000000000 --- a/ui/src/app/core/model/brand.ts +++ /dev/null @@ -1,29 +0,0 @@ -export interface Brand { - logo: Logo; - footer: Footer; - header: Header; -} - -export interface Header { - title: string; -} - -export interface Logo { - default: string; - small: string; - large: string; - alt: string; - link: Link; - [propName: string]: any; -} - -export interface Footer { - links: Link[]; - text: string; -} - -export interface Link { - label: string; - url: string; - description?: string; -} diff --git a/ui/src/app/core/model/query.ts b/ui/src/app/core/model/query.ts deleted file mode 100644 index d7d85a841..000000000 --- a/ui/src/app/core/model/query.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface QueryParams { - term: string; - resourceId?: string; - limit?: number; - offset?: number; -} diff --git a/ui/src/app/core/model/user.ts b/ui/src/app/core/model/user.ts deleted file mode 100644 index 27375c23e..000000000 --- a/ui/src/app/core/model/user.ts +++ /dev/null @@ -1,7 +0,0 @@ -export interface User { - username: string; - role: string; - firstName: string; - lastName: string; - emailAddress: string; -} diff --git a/ui/src/app/core/model/version.ts b/ui/src/app/core/model/version.ts deleted file mode 100644 index 4e931bc17..000000000 --- a/ui/src/app/core/model/version.ts +++ /dev/null @@ -1,16 +0,0 @@ -export interface VersionInfo { - git: { - commit: { - time: string, - id: string - }, - branch: string - }; - build: { - version: string, - artifact: string, - name: string, - group: string, - time: string - }; -} diff --git a/ui/src/app/core/reducer/configuration.reducer.spec.ts b/ui/src/app/core/reducer/configuration.reducer.spec.ts deleted file mode 100644 index e8e8a802e..000000000 --- a/ui/src/app/core/reducer/configuration.reducer.spec.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { reducer } from './configuration.reducer'; -import * as fromConfiguration from './configuration.reducer'; -import * as actions from '../action/configuration.action'; - -describe('Configuration Reducer', () => { - const initialState: fromConfiguration.ConfigState = { - roles: [] - }; - - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(undefined, {} as any); - expect(result).toEqual(initialState); - }); - }); - - describe('Role Load Request', () => { - it('should set fetching to true', () => { - const action = new actions.LoadRoleSuccess(['ADMIN']); - const result = reducer(initialState, action); - expect(result).toEqual( - { - ...initialState, - roles: ['ADMIN'] - } - ); - }); - }); - - describe('selector functions', () => { - it('should return the roles from state', () => { - expect(fromConfiguration.getRoles(initialState)).toEqual([]); - }); - }); -}); diff --git a/ui/src/app/core/reducer/configuration.reducer.ts b/ui/src/app/core/reducer/configuration.reducer.ts deleted file mode 100644 index 8f29e4126..000000000 --- a/ui/src/app/core/reducer/configuration.reducer.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ConfigurationActionUnion, ConfigurationActionTypes } from '../action/configuration.action'; - -export interface ConfigState { - roles: string[]; -} - -export const initialState: ConfigState = { - roles: [] -}; - -export function reducer(state = initialState, action: ConfigurationActionUnion): ConfigState { - switch (action.type) { - case ConfigurationActionTypes.LOAD_ROLE_SUCCESS: { - return { - roles: [...action.payload] - }; - } - default: { - return state; - } - } -} - - -export const getRoles = (state: ConfigState) => state.roles; diff --git a/ui/src/app/core/reducer/index.spec.ts b/ui/src/app/core/reducer/index.spec.ts deleted file mode 100644 index 8f9fb9f8f..000000000 --- a/ui/src/app/core/reducer/index.spec.ts +++ /dev/null @@ -1,42 +0,0 @@ -import * as fromIndex from './index'; -import * as fromUser from './user.reducer'; -import * as fromVersion from './version.reducer'; -import * as fromLocation from './location.reducer'; -import * as fromConfig from './configuration.reducer'; -import { VersionInfo } from '../model/version'; - -describe('Core index reducers', () => { - const state: fromIndex.CoreState = { - user: fromUser.initialState as fromUser.UserState, - version: fromVersion.initialState as fromVersion.VersionState, - config: fromConfig.initialState as fromConfig.ConfigState, - location: fromLocation.initialState as fromLocation.LocationState - }; - describe('getUserStateFn function', () => { - it('should return the user state', () => { - expect(fromIndex.getUserStateFn(state)).toEqual(state.user); - }); - }); - describe('getVersionStateFn function', () => { - it('should return the version state', () => { - expect(fromIndex.getVersionStateFn(state)).toEqual(state.version); - }); - }); - describe('getConfigStateFn function', () => { - it('should return the config state', () => { - expect(fromIndex.getConfigStateFn(state)).toEqual(state.config); - }); - }); - describe('filterRolesFn', () => { - it('should return the roles that are not `non roles`', () => { - expect(fromIndex.filterRolesFn(['ROLE_ADMIN', 'ROLE_NONE'])).toEqual(['ROLE_ADMIN']); - }); - }); - describe('isUserAdminFn', () => { - it('should check if the provided user has the ROLE_ADMIN role', () => { - expect(fromIndex.isUserAdminFn({role: 'ROLE_ADMIN'})).toBe(true); - expect(fromIndex.isUserAdminFn({role: 'ROLE_USER'})).toBe(false); - expect(fromIndex.isUserAdminFn(null)).toBe(false); - }); - }); -}); diff --git a/ui/src/app/core/reducer/index.ts b/ui/src/app/core/reducer/index.ts deleted file mode 100644 index ee794a567..000000000 --- a/ui/src/app/core/reducer/index.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { - createSelector, - createFeatureSelector -} from '@ngrx/store'; - -import * as fromUser from './user.reducer'; -import * as fromVersion from './version.reducer'; -import * as fromConfig from './configuration.reducer'; -import * as fromLocation from './location.reducer'; -import * as fromRoot from '../../app.reducer'; - -export interface CoreState { - user: fromUser.UserState; - version: fromVersion.VersionState; - config: fromConfig.ConfigState; - location: fromLocation.LocationState; -} - -export interface State extends fromRoot.State { - core: CoreState; -} - -export const reducers = { - user: fromUser.reducer, - version: fromVersion.reducer, - config: fromConfig.reducer, - location: fromLocation.reducer -}; - -export const getCoreFeature = createFeatureSelector('core'); -export const getUserStateFn = (state: CoreState) => state.user; -export const getVersionStateFn = (state: CoreState) => state.version; -export const getConfigStateFn = (state: CoreState) => state.config; -export const getLocationStateFn = (state: CoreState) => state.location; - -export const getUserState = createSelector(getCoreFeature, getUserStateFn); -export const getUser = createSelector(getUserState, fromUser.getUser); -export const isFetching = createSelector(getUserState, fromUser.isFetching); -export const getUserError = createSelector(getUserState, fromUser.getError); - -export const getVersionState = createSelector(getCoreFeature, getVersionStateFn); -export const getVersionInfo = createSelector(getVersionState, fromVersion.getVersionInfo); -export const getVersionLoading = createSelector(getVersionState, fromVersion.getVersionIsLoading); -export const getVersionError = createSelector(getVersionState, fromVersion.getVersionError); - -export const filterRolesFn = (roles: string[]) => roles.filter(r => r !== 'ROLE_NONE'); -export const isUserAdminFn = (user) => user ? user.role === 'ROLE_ADMIN' : false; - -export const getConfigState = createSelector(getCoreFeature, getConfigStateFn); -export const getRoles = createSelector(getConfigState, fromConfig.getRoles); - -export const getUserRoles = createSelector(getRoles, filterRolesFn); -export const getCurrentUserRole = createSelector(getUser, u => u ? u.role : null); - -export const isCurrentUserAdmin = createSelector(getUser, isUserAdminFn); - -export const getLocationState = createSelector(getCoreFeature, getLocationStateFn); -export const getLocationTitle = createSelector(getLocationState, fromLocation.getTitle); diff --git a/ui/src/app/core/reducer/location.reducer.ts b/ui/src/app/core/reducer/location.reducer.ts deleted file mode 100644 index dfc6cfbd5..000000000 --- a/ui/src/app/core/reducer/location.reducer.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { LocationActionUnion, LocationActionTypes } from '../action/location.action'; - -export interface LocationState { - title: string; -} - -export const initialState: LocationState = { - title: '' -}; - -export function reducer(state = initialState, action: LocationActionUnion): LocationState { - switch (action.type) { - case LocationActionTypes.SET_TITLE: - return { - ...state, - title: action.payload - }; - default: - return state; - } -} - -export const getTitle = (state: LocationState) => state.title; diff --git a/ui/src/app/core/reducer/user.reducer.spec.ts b/ui/src/app/core/reducer/user.reducer.spec.ts deleted file mode 100644 index d7cbaacdf..000000000 --- a/ui/src/app/core/reducer/user.reducer.spec.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { reducer } from './user.reducer'; -import * as fromUser from './user.reducer'; -import * as actions from '../action/user.action'; -import { User } from '../model/user'; - -describe('User Reducer', () => { - const initialState: fromUser.UserState = { - fetching: false, - user: null, - error: null - }; - - const user: User = { - username: 'foo', - role: 'admin', - firstName: 'somebody', - lastName: 'nobody', - emailAddress: 'email@edu.edu' - }; - - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(undefined, {} as any); - expect(result).toEqual(initialState); - }); - }); - - describe('User Load Request', () => { - it('should set fetching to true', () => { - const action = new actions.UserLoadRequestAction(); - const result = reducer(initialState, action); - expect(result).toEqual( - Object.assign({}, initialState, { fetching: true }) - ); - }); - }); - - describe('User Load Success', () => { - it('should update the user', () => { - const action = new actions.UserLoadSuccessAction(user); - const result = reducer(initialState, action); - expect(result).toEqual( - Object.assign({}, initialState, { user: user }) - ); - }); - }); - - describe('User Load Error', () => { - it('should store the error message', () => { - const error = { message: 'Failed', type: '404' }; - const action = new actions.UserLoadErrorAction(error); - const result = reducer(initialState, action); - expect(result).toEqual( - Object.assign({}, initialState, { error: error }) - ); - }); - }); - - describe('User Selectors', () => { - const state = { - user: { ...user }, - fetching: true, - error: { message: 'foo', type: 'bar' } - } as fromUser.UserState; - - it('should select the user', () => { - expect(fromUser.getUser(state)).toEqual(state.user); - }); - it('should select the fetching state', () => { - expect(fromUser.isFetching(state)).toEqual(state.fetching); - }); - it('should select the user', () => { - expect(fromUser.getError(state)).toEqual(state.error); - }); - }); -}); diff --git a/ui/src/app/core/reducer/user.reducer.ts b/ui/src/app/core/reducer/user.reducer.ts deleted file mode 100644 index 2510d5c5e..000000000 --- a/ui/src/app/core/reducer/user.reducer.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { User } from '../model/user'; -import { - CurrentUserActionTypes, - CurrentUserActionsUnion -} from '../action/user.action'; - -export interface UserState { - fetching: boolean; - user: User | null; - error: { - type: string, - message: string - }; -} - -export const initialState: UserState = { - fetching: false, - user: null, - error: null -}; - -export function reducer(state = initialState, action: CurrentUserActionsUnion): UserState { - switch (action.type) { - case CurrentUserActionTypes.USER_LOAD_REQUEST: { - return Object.assign({}, state, { - fetching: true - }); - } - case CurrentUserActionTypes.USER_LOAD_SUCCESS: { - return Object.assign({}, state, { - fetching: false, - user: action.payload - }); - } - case CurrentUserActionTypes.USER_LOAD_ERROR: { - return Object.assign({}, state, { - fetching: false, - user: null, - error: action.payload - }); - } - default: { - return state; - } - } -} - - -export const getUser = (state: UserState) => state.user; -export const getError = (state: UserState) => state.error; -export const isFetching = (state: UserState) => state.fetching; diff --git a/ui/src/app/core/reducer/version.reducer.spec.ts b/ui/src/app/core/reducer/version.reducer.spec.ts deleted file mode 100644 index 1536eeaa6..000000000 --- a/ui/src/app/core/reducer/version.reducer.spec.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { reducer } from './version.reducer'; -import * as fromVersion from './version.reducer'; -import * as actions from '../action/version.action'; -import { VersionInfo } from '../model/version'; - -describe('Version Reducer', () => { - const initialState: fromVersion.VersionState = { - info: {}, - loading: false, - error: null - }; - - const version: VersionInfo = { - git: { - commit: { - time: '2018-03-28T20:14:36Z', - id: '40aff48' - }, - branch: 'feature/SHIBUI-285' - }, - build: { - version: '1.0.0', - artifact: 'shibui', - name: 'master', - group: 'foo', - time: '2018-03-29T14:51:38.975Z' - } - }; - - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(undefined, {} as any); - expect(result).toEqual(initialState); - }); - }); - - describe('Version Load Request', () => { - it('should set loading to true', () => { - const action = new actions.VersionInfoLoadRequestAction(); - const result = reducer(initialState, action); - expect(result.loading).toBe(true); - }); - }); - - describe('Version Load Success', () => { - it('should set loading to false', () => { - const action = new actions.VersionInfoLoadSuccessAction(version); - const result = reducer(initialState, action); - expect(result.loading).toBe(false); - }); - - it('should set the version data to the payload', () => { - const action = new actions.VersionInfoLoadSuccessAction(version); - const result = reducer(initialState, action); - expect(result.info).toEqual(version); - }); - }); - - describe('Version Load Success', () => { - it('should set loading to false', () => { - const action = new actions.VersionInfoLoadErrorAction(new Error()); - const result = reducer(initialState, action); - expect(result.loading).toBe(false); - }); - - it('should add an error to state', () => { - const err = new Error('fail!'); - const action = new actions.VersionInfoLoadErrorAction(err); - const result = reducer(initialState, action); - expect(result.error).toEqual(err); - }); - }); - - describe('getVersionInfo selector', () => { - it('should return the version info from state', () => { - const action = new actions.VersionInfoLoadSuccessAction(version); - const result = reducer(initialState, action); - expect(fromVersion.getVersionInfo(result)).toEqual(version); - }); - }); - - describe('getError selector', () => { - it('should return the version error from state', () => { - const err = new Error('fail'); - const action = new actions.VersionInfoLoadErrorAction(err); - const result = reducer(initialState, action); - expect(fromVersion.getVersionError(result)).toEqual(err); - }); - }); - - describe('getLoading selector', () => { - it('should return the version loading status from state', () => { - const action = new actions.VersionInfoLoadRequestAction(); - const result = reducer(initialState, action); - expect(fromVersion.getVersionIsLoading(result)).toBe(true); - }); - }); -}); diff --git a/ui/src/app/core/reducer/version.reducer.ts b/ui/src/app/core/reducer/version.reducer.ts deleted file mode 100644 index 4b40ddf77..000000000 --- a/ui/src/app/core/reducer/version.reducer.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { createSelector, createFeatureSelector } from '@ngrx/store'; -import * as version from '../action/version.action'; -import * as fromRoot from '../../core/reducer'; - -export interface VersionState { - info: any; - loading: boolean; - error: Error | null; -} - -export const initialState: VersionState = { - info: {}, - loading: false, - error: null -}; - -export function reducer(state = initialState, action: version.Actions): VersionState { - switch (action.type) { - case version.VERSION_LOAD_REQUEST: { - return { - ...state, - loading: true - }; - } - case version.VERSION_LOAD_SUCCESS: { - return { - ...state, - loading: false, - info: action.payload - }; - } - case version.VERSION_LOAD_ERROR: { - return { - ...state, - loading: false, - error: action.payload - }; - } - default: { - return state; - } - } -} - -export const getVersionInfo = (state: VersionState) => state.info; -export const getVersionIsLoading = (state: VersionState) => state.loading; -export const getVersionError = (state: VersionState) => state.error; diff --git a/ui/src/app/core/service/admin.guard.ts b/ui/src/app/core/service/admin.guard.ts deleted file mode 100644 index c602082c8..000000000 --- a/ui/src/app/core/service/admin.guard.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { Injectable } from '@angular/core'; -import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router } from '@angular/router'; -import { Store } from '@ngrx/store'; - -import * as fromCore from '../reducer'; -import { Observable } from 'rxjs'; -import { filter, catchError, take } from 'rxjs/operators'; - - -@Injectable({ - providedIn: 'root', -}) -export class AdminGuard implements CanActivate { - - constructor( - private store: Store, - private router: Router - ) {} - - canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { - const isAdminObs = this.checkIsAdmin().pipe(take(1)); - isAdminObs.subscribe(authed => { - if (!authed) { - this.router.navigate(['/']); - } - }); - return isAdminObs; - } - - checkIsAdmin(): Observable { - return this.store - .select(fromCore.isCurrentUserAdmin) - .pipe( - filter(isAdmin => isAdmin !== null), - ); - } -} diff --git a/ui/src/app/core/service/api-path.interceptor.spec.ts b/ui/src/app/core/service/api-path.interceptor.spec.ts deleted file mode 100644 index 976805dca..000000000 --- a/ui/src/app/core/service/api-path.interceptor.spec.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { TestBed, inject, waitForAsync } from '@angular/core/testing'; -import { HTTP_INTERCEPTORS, HttpClientModule, HttpClient, HttpRequest } from '@angular/common/http'; -import { HttpTestingController, HttpClientTestingModule } from '@angular/common/http/testing'; - -import { ApiPathInterceptor } from './api-path.interceptor'; -import { APP_BASE_HREF } from '@angular/common'; - -describe('API Path Interceptor Service', () => { - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - HttpClientModule, - HttpClientTestingModule - ], - providers: [ - { - provide: APP_BASE_HREF, - useValue: '/shibui/' - }, - { - provide: HTTP_INTERCEPTORS, - useClass: ApiPathInterceptor, - multi: true - } - ] - }); - }); - - describe('query', () => { - it(`should send an expected query request`, waitForAsync(inject([HttpClient, HttpTestingController], - (service: HttpClient, backend: HttpTestingController) => { - service.get('foo').subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === '/shibui/foo' - && req.method === 'GET'; - }, `GET collection`); - } - ))); - }); -}); diff --git a/ui/src/app/core/service/api-path.interceptor.ts b/ui/src/app/core/service/api-path.interceptor.ts deleted file mode 100644 index 5417e5a7f..000000000 --- a/ui/src/app/core/service/api-path.interceptor.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Injectable, Inject } from '@angular/core'; -import { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest } from '@angular/common/http'; -import { Observable } from 'rxjs'; -import { APP_BASE_HREF } from '@angular/common'; - -@Injectable() -export class ApiPathInterceptor implements HttpInterceptor { - constructor( - @Inject(APP_BASE_HREF) private baseHref: string - ) {} - intercept(req: HttpRequest, next: HttpHandler): Observable> { - const apiReq = req.clone({ url: `${this.baseHref}${req.url}` }); - return next.handle(apiReq); - } -} diff --git a/ui/src/app/core/service/authorized.interceptor.ts b/ui/src/app/core/service/authorized.interceptor.ts deleted file mode 100644 index b09810778..000000000 --- a/ui/src/app/core/service/authorized.interceptor.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpRequest, HttpResponse, HttpErrorResponse, HttpInterceptor, HttpHandler, HttpEvent } from '@angular/common/http'; -import { Store } from '@ngrx/store'; - -import { Observable, throwError } from 'rxjs'; -import { catchError } from 'rxjs/operators'; - -import * as fromUser from '../reducer/user.reducer'; -import { UserRedirect } from '../action/user.action'; - -@Injectable() -export class AuthorizedInterceptor implements HttpInterceptor { - constructor(private store: Store) { } - - intercept(req: HttpRequest, next: HttpHandler): Observable> { - return next - .handle(req) - .pipe( - catchError((error) => { - if (!error.url.match(req.url)) { - this.store.dispatch(new UserRedirect(error.url)); - } - return throwError(error); - }) - ); - } -} /* istanbul ignore next */ diff --git a/ui/src/app/core/service/cache.interceptor.ts b/ui/src/app/core/service/cache.interceptor.ts deleted file mode 100644 index a1d38aec0..000000000 --- a/ui/src/app/core/service/cache.interceptor.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpRequest, HttpResponse, HttpInterceptor, HttpHandler, HttpEvent } from '@angular/common/http'; -import { Observable, of } from 'rxjs'; -import { tap } from 'rxjs/operators'; - -class HttpCache { - private store: {[key: string]: HttpResponse}; - constructor() { - this.store = {}; - } - private generateKey(request: HttpRequest): string { - return `${request.method}.${request.urlWithParams}.${request.responseType}`; - } - get(req: HttpRequest): HttpResponse | null { - return this.store[this.generateKey(req)]; - } - put(req: HttpRequest, resp: HttpResponse): void { - this.store[`${req.method}.${req.urlWithParams}`] = resp; - } - clear(): void { - this.store = {}; - } -} - -@Injectable() -export class CachingInterceptor implements HttpInterceptor { - private cache: HttpCache; - - constructor() { - this.cache = new HttpCache(); - } - - intercept(req: HttpRequest, next: HttpHandler): Observable> { - if (req.method !== 'GET') { - this.cache.clear(); - return next.handle(req); - } - const cachedResponse = this.cache.get(req); - if (cachedResponse) { - return of(cachedResponse); - } - return next.handle(req).pipe( - tap(event => { - if (event instanceof HttpResponse) { - this.cache.put(req, event); - } - }) - ); - } -} /* istanbul ignore next */ diff --git a/ui/src/app/core/service/can-deactivate.guard.spec.ts b/ui/src/app/core/service/can-deactivate.guard.spec.ts deleted file mode 100644 index a9ede461f..000000000 --- a/ui/src/app/core/service/can-deactivate.guard.spec.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { TestBed } from '@angular/core/testing'; -import { CanDeactivateGuard, CanComponentDeactivate } from './can-deactivate.guard'; -import { ActivatedRouteStub } from '../../../testing/activated-route.stub'; - -describe('Can Deactivate Guard Service', () => { - let service: CanDeactivateGuard; - let guarded: CanComponentDeactivate; - let notGuarded: any; - - let activatedRoute: ActivatedRouteStub = new ActivatedRouteStub(); - let child: ActivatedRouteStub = new ActivatedRouteStub(); - child.testParamMap = { form: 'common' }; - activatedRoute.firstChild = child; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [], - providers: [ - CanDeactivateGuard - ] - }); - service = TestBed.get(CanDeactivateGuard); - - guarded = { - canDeactivate: (currentRoute, currentState, nextState) => { - return true; - } - }; - notGuarded = {}; - }); - - it('should instantiate', () => { - expect(service).toBeDefined(); - }); - - describe('canDeactivate', () => { - it('should check if the component has a canDeactivate method', () => { - spyOn(guarded, 'canDeactivate'); - expect(service.canDeactivate(notGuarded, null, null, null)).toBe(true); - service.canDeactivate(guarded, null, null, null); - expect(guarded.canDeactivate).toHaveBeenCalled(); - }); - - it('should return components result', () => { - spyOn(guarded, 'canDeactivate').and.returnValue(false); - expect(service.canDeactivate(guarded, null, null, null)).toBe(false); - }); - }); -}); diff --git a/ui/src/app/core/service/can-deactivate.guard.ts b/ui/src/app/core/service/can-deactivate.guard.ts deleted file mode 100644 index c0c7363ec..000000000 --- a/ui/src/app/core/service/can-deactivate.guard.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Injectable } from '@angular/core'; -import { - CanDeactivate, - ActivatedRouteSnapshot, - RouterStateSnapshot -} from '@angular/router'; -import { Observable } from 'rxjs'; - -export interface CanComponentDeactivate { - canDeactivate: ( - currentRoute: ActivatedRouteSnapshot, - currentState: RouterStateSnapshot, - nextState: RouterStateSnapshot - ) => Observable | Promise | boolean; -} - -@Injectable() -export class CanDeactivateGuard implements CanDeactivate { - canDeactivate( - component: CanComponentDeactivate, - currentRoute: ActivatedRouteSnapshot, - currentState: RouterStateSnapshot, - nextState: RouterStateSnapshot - ) { - return component && component.canDeactivate ? component.canDeactivate(currentRoute, currentState, nextState) : true; - } -} /* istanbul ignore next */ diff --git a/ui/src/app/core/service/differential.service.ts b/ui/src/app/core/service/differential.service.ts deleted file mode 100644 index f4ecdf0c1..000000000 --- a/ui/src/app/core/service/differential.service.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Injectable } from '@angular/core'; - -import * as lib from 'deep-object-diff'; - -@Injectable() -export class DifferentialService { - - constructor() {} - - diff(originalObj, updatedObj) { // returns the difference of the original and updated objects - return lib.diff(originalObj, updatedObj); - } - addedDiff(originalObj, updatedObj) { // returns only the values added to the updated object - return lib.addedDiff(originalObj, updatedObj); - } - deletedDiff(originalObj, updatedObj) { // returns only the values deleted in the updated object - return lib.deletedDiff(originalObj, updatedObj); - } - updatedDiff(originalObj, updatedObj) { // returns only the values that have been changed in the updated object - return lib.updatedDiff(originalObj, updatedObj); - } - detailedDiff(originalObj, updatedObj) { // returns an object with the added, deleted and updated differences - return lib.detailedDiff(originalObj, updatedObj); - } -} diff --git a/ui/src/app/core/service/error.interceptor.ts b/ui/src/app/core/service/error.interceptor.ts deleted file mode 100644 index 139d795d9..000000000 --- a/ui/src/app/core/service/error.interceptor.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpRequest, HttpResponse, HttpErrorResponse, HttpInterceptor, HttpHandler, HttpEvent } from '@angular/common/http'; -import { Store } from '@ngrx/store'; - -import { Observable, throwError } from 'rxjs'; -import { catchError } from 'rxjs/operators'; - -import * as fromNotifications from '../../notification/reducer'; -import { AddNotification } from '../../notification/action/notification.action'; -import { Notification, NotificationType } from '../../notification/model/notification'; - -@Injectable() -export class ErrorInterceptor implements HttpInterceptor { - private caches = []; - constructor(private store: Store) { } - - intercept(req: HttpRequest, next: HttpHandler): Observable> { - return next.handle(req).pipe( - catchError((error: HttpErrorResponse) => { - let msg = error.error; - if (typeof msg !== 'string' && msg.hasOwnProperty('message')) { - msg = `${msg.exception}: ${msg.message}`; - } else if (typeof msg === 'string') { - msg = this.getErrorMessage(error); - } - if (msg) { - this.store.dispatch(new AddNotification(new Notification( - NotificationType.Danger, - msg, - 8000 - ))); - } - return throwError(error); - }) - ); - } - - getErrorMessage(error: HttpErrorResponse): string { - switch (error.status) { - case 409: { - return null; - } - default: { - return 'Unknown server error!'; - } - } - } -} diff --git a/ui/src/app/core/service/file.service.spec.ts b/ui/src/app/core/service/file.service.spec.ts deleted file mode 100644 index 81eefdbc3..000000000 --- a/ui/src/app/core/service/file.service.spec.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { TestBed, inject, waitForAsync } from '@angular/core/testing'; -import { FileService } from './file.service'; - -const getFakeFile = (str: string) => { - let blob = new Blob([str], { type: 'text/html' }); - blob['lastModifiedDate'] = ''; - blob['name'] = str; - return blob; -}; - -describe('File Service', () => { - let service: FileService; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [], - providers: [ - FileService - ] - }); - service = TestBed.get(FileService); - }); - - it('should instantiate', () => { - expect(service).toBeDefined(); - }); - - describe('readAsText method', () => { - it('should return an observable', () => { - expect(service.readAsText(getFakeFile('foo'))).toBeDefined(); - }); - }); -}); diff --git a/ui/src/app/core/service/file.service.ts b/ui/src/app/core/service/file.service.ts deleted file mode 100644 index 5be9a739f..000000000 --- a/ui/src/app/core/service/file.service.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable, Subject } from 'rxjs'; - -@Injectable() -export class FileService { - - getLoader(sub: Subject): any { - return (evt) => { - const reader = evt.target as FileReader; - const txt = reader.result; - sub.next(txt); - sub.complete(); - }; - } - readAsText(file: File): Observable { - let sub = new Subject(), - fileReader = new FileReader(); - fileReader.onload = this.getLoader(sub); - fileReader.readAsText(file); - return sub.asObservable(); - } -} /* istanbul ignore next */ diff --git a/ui/src/app/core/service/modal.service.spec.ts b/ui/src/app/core/service/modal.service.spec.ts deleted file mode 100644 index 408f54df7..000000000 --- a/ui/src/app/core/service/modal.service.spec.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { TestBed } from '@angular/core/testing'; -import { NgbModalModule, NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; - -import { ModalService } from './modal.service'; - -describe('Modal Service', () => { - let service: ModalService; - let ngbModal: NgbModal; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - NgbModalModule - ], - providers: [ - ModalService - ] - }); - service = TestBed.get(ModalService); - ngbModal = TestBed.get(NgbModal); - }); - - it('should instantiate', () => { - expect(service).toBeDefined(); - }); - - describe('modal.open method', () => { - it('should open a new modal', () => { - spyOn(ngbModal, 'open').and.callThrough(); - service.open(`
`, {}); - expect(ngbModal.open).toHaveBeenCalled(); - }); - - it('should not add inputs to a modals scope if not provided a component', () => { - spyOn(ngbModal, 'open').and.callThrough(); - service.open(`
`, {}, { foo: 'bar' }); - expect(ngbModal.open).toHaveBeenCalled(); - }); - - it('should accept inputs to add to a new modals scope', () => { - spyOn(ngbModal, 'open').and.callFake(() => { - return { - result: Promise.resolve({}), - componentInstance: {} - } as NgbModalRef; - }); - service.open(`
`, {}, { foo: 'bar' }); - expect(ngbModal.open).toHaveBeenCalled(); - }); - }); -}); diff --git a/ui/src/app/core/service/modal.service.ts b/ui/src/app/core/service/modal.service.ts deleted file mode 100644 index 7bac61417..000000000 --- a/ui/src/app/core/service/modal.service.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; -import { NgbModal, NgbModalOptions } from '@ng-bootstrap/ng-bootstrap'; -import { from } from 'rxjs'; - -export const DEFAULT_MODAL_OPTIONS: NgbModalOptions = { - size: 'lg' -}; - -@Injectable() -export class ModalService { - - constructor( - private modal: NgbModal - ) {} - - open(content: any, options: NgbModalOptions, inputs: Object = {}): Observable { - let modal = this.modal.open(content, { - ...options - }); - if (modal.hasOwnProperty('componentInstance')) { - Object.keys(inputs).forEach(key => modal.componentInstance[key] = inputs[key]); - } - return from(modal.result); - } -} /* istanbul ignore next */ diff --git a/ui/src/app/core/service/navigation.service.spec.ts b/ui/src/app/core/service/navigation.service.spec.ts deleted file mode 100644 index bb92403c6..000000000 --- a/ui/src/app/core/service/navigation.service.spec.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { TestBed, waitForAsync } from '@angular/core/testing'; - -import { NavigationService } from './navigation.service'; - -describe('Navigation Service', () => { - let service: NavigationService; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [], - providers: [ - NavigationService - ] - }); - service = TestBed.get(NavigationService); - }); - - it('should instantiate', () => { - expect(service).toBeDefined(); - }); - - describe('addAction method', () => { - it('should add a navigation option to the list of actions', () => { - service.addAction('foo', { - action: () => {}, - category: 'bar', - label: 'baz', - content: 'something' - }); - - expect(service.actionList.length).toBe(1); - }); - - it('should emit the value from an observable when an action is added', (done: DoneFn) => { - const action = { - action: () => { }, - category: 'bar', - label: 'baz', - content: 'something' - }; - const actionName = 'foo'; - service.addAction(actionName, action); - - service.emitter.subscribe((actions) => { - expect(actions.length).toBe(1); - done(); - }); - }); - }); -}); diff --git a/ui/src/app/core/service/navigation.service.ts b/ui/src/app/core/service/navigation.service.ts deleted file mode 100644 index dc7b01342..000000000 --- a/ui/src/app/core/service/navigation.service.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Injectable } from '@angular/core'; -import { BehaviorSubject, Observable } from 'rxjs'; -import { NavigationAction } from '../model/action'; - -@Injectable() -export class NavigationService { - - private actions: { [name: string]: NavigationAction} = {}; - private subj: BehaviorSubject; - private obs: Observable; - - constructor() { - this.subj = new BehaviorSubject(this.actionList); - this.obs = this.subj.asObservable(); - } - - get actionList(): NavigationAction[] { - return Object.values(this.actions); - } - - get emitter(): Observable { - return this.obs; - } - - addAction(name: string, action: NavigationAction): NavigationAction[] { - this.actions[name] = action; - this.subj.next(this.actionList); - return this.actionList; - } -} diff --git a/ui/src/app/core/service/navigator.service.ts b/ui/src/app/core/service/navigator.service.ts deleted file mode 100644 index c865c9a54..000000000 --- a/ui/src/app/core/service/navigator.service.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Injectable } from '@angular/core'; - -@Injectable() -export class NavigatorService { - constructor() {} - - get native(): Navigator { - return window.navigator; - } -} diff --git a/ui/src/app/core/service/user.service.spec.ts b/ui/src/app/core/service/user.service.spec.ts deleted file mode 100644 index 61780bcfd..000000000 --- a/ui/src/app/core/service/user.service.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { TestBed } from '@angular/core/testing'; -import { UserService } from './user.service'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; - -describe('User Service', () => { - let service: UserService; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - HttpClientTestingModule - ], - providers: [ - UserService - ] - }); - service = TestBed.get(UserService); - }); - - it('should instantiate', () => { - expect(service).toBeDefined(); - }); -}); diff --git a/ui/src/app/core/service/user.service.ts b/ui/src/app/core/service/user.service.ts deleted file mode 100644 index d5ee80b53..000000000 --- a/ui/src/app/core/service/user.service.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable, of } from 'rxjs'; -import { User } from '../model/user'; -import { HttpClient } from '@angular/common/http'; -import { API_BASE_PATH } from '../../app.constant'; - -@Injectable() -export class UserService { - - readonly base = API_BASE_PATH; - - constructor( - private http: HttpClient - ) { } - - getRoles(): Observable { - return this.http.get( - `${this.base}/supportedRoles` - ); - } - - getCurrentUser(): Observable { - return this.http.get( - `${this.base}/admin/users/current` - ); - } -} /* istanbul ignore next */ diff --git a/ui/src/app/core/user/SessionModal.js b/ui/src/app/core/user/SessionModal.js new file mode 100644 index 000000000..88312e99b --- /dev/null +++ b/ui/src/app/core/user/SessionModal.js @@ -0,0 +1,27 @@ +import React from 'react'; + +import Modal from 'react-bootstrap/Modal'; + +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons'; +import Translate from '../../i18n/components/translate'; + +export function SessionModal({ show, children }) { + + return ( + <> + + Session timed out + + +

+ Your session has timed out. Please login again. +

+
+ + {children} + +
+ + ); +} \ No newline at end of file diff --git a/ui/src/app/core/user/UserContext.js b/ui/src/app/core/user/UserContext.js new file mode 100644 index 000000000..b1235877c --- /dev/null +++ b/ui/src/app/core/user/UserContext.js @@ -0,0 +1,43 @@ +import React from "react"; +import useFetch from 'use-http'; +import API_BASE_PATH from '../../App.constant'; + +const UserContext = React.createContext(); + +const { Provider, Consumer } = UserContext; + +const path = '/admin/users/current'; + +/*eslint-disable react-hooks/exhaustive-deps*/ +function UserProvider({ children }) { + + const { get, response } = useFetch(`${API_BASE_PATH}`, { + cacheLife: 10000, + cachePolicy: 'cache-first' + }); + + React.useEffect(() => { loadUser() }, []); + + async function loadUser() { + const user = await get(`${path}`); + if (response.ok) setUser(user); + } + + const [user, setUser] = React.useState({}); + return ( + {children} + ); +} + +function useCurrentUser() { + const context = React.useContext(UserContext); + return context; +} + +function useIsAdmin() { + const user = useCurrentUser(); + return user.role === 'ROLE_ADMIN'; +} + + +export { UserContext, UserProvider, Consumer as UserConsumer, useCurrentUser, useIsAdmin }; \ No newline at end of file diff --git a/ui/src/app/core/utility/array_move.js b/ui/src/app/core/utility/array_move.js new file mode 100644 index 000000000..011f56578 --- /dev/null +++ b/ui/src/app/core/utility/array_move.js @@ -0,0 +1,12 @@ +export function array_move(arr, old_index, new_index) { + if (new_index >= arr.length) { + let k = new_index - arr.length + 1; + while (k--) { + arr.push(undefined); + } + } + arr.splice(new_index, 0, arr.splice(old_index, 1)[0]); + return arr; +} + +export default array_move; \ No newline at end of file diff --git a/ui/src/app/core/utility/array_move.test.js b/ui/src/app/core/utility/array_move.test.js new file mode 100644 index 000000000..f8770970e --- /dev/null +++ b/ui/src/app/core/utility/array_move.test.js @@ -0,0 +1,9 @@ +import {array_move} from './array_move'; + +it('shifts an item in an array by +1 index', () => { + expect(array_move([1, 2], 0, 1)).toEqual([2, 1]); +}); + +it('shifts an item in an array by -1 index', () => { + expect(array_move([1, 2], 1, 0)).toEqual([2, 1]); +}); \ No newline at end of file diff --git a/ui/src/app/core/utility/download_as_xml.js b/ui/src/app/core/utility/download_as_xml.js new file mode 100644 index 000000000..a9256fc63 --- /dev/null +++ b/ui/src/app/core/utility/download_as_xml.js @@ -0,0 +1,6 @@ +import * as FileSaver from 'file-saver'; + +export const downloadAsXml = (fileName, xml) => { + const blob = new Blob([xml], { type: 'text/xml;charset=utf-8' }); + FileSaver.saveAs(blob, `${fileName}.xml`); +} \ No newline at end of file diff --git a/ui/src/app/core/utility/download_as_xml.test.js b/ui/src/app/core/utility/download_as_xml.test.js new file mode 100644 index 000000000..38a87e6fe --- /dev/null +++ b/ui/src/app/core/utility/download_as_xml.test.js @@ -0,0 +1,11 @@ +import * as FileSaver from 'file-saver'; +import { downloadAsXml } from './download_as_xml'; +jest.mock('file-saver'); + +it('attempts to save the provided content', () => { + const name = 'foo.xml'; + const xml = ''; + + downloadAsXml(name, xml); + expect(FileSaver.saveAs).toHaveBeenCalled(); +}); diff --git a/ui/src/app/core/utility/get_cookie.js b/ui/src/app/core/utility/get_cookie.js new file mode 100644 index 000000000..de9f5bae7 --- /dev/null +++ b/ui/src/app/core/utility/get_cookie.js @@ -0,0 +1,17 @@ +export function get_cookie (cname) { + var name = cname + "="; + var decodedCookie = decodeURIComponent(document.cookie); + var ca = decodedCookie.split(';'); + for (var i = 0; i < ca.length; i++) { + var c = ca[i]; + while (c.charAt(0) === ' ') { + c = c.substring(1); + } + if (c.indexOf(name) === 0) { + return c.substring(name.length, c.length); + } + } + return ""; +} + +export default get_cookie; \ No newline at end of file diff --git a/ui/src/app/core/utility/get_cookie.test.js b/ui/src/app/core/utility/get_cookie.test.js new file mode 100644 index 000000000..83d09bfe5 --- /dev/null +++ b/ui/src/app/core/utility/get_cookie.test.js @@ -0,0 +1,10 @@ +import { get_cookie } from './get_cookie'; + +Object.defineProperty(window.document, 'cookie', { + writable: true, + value: 'XSRF=FOOBAR', +}); + +it('should retrieve the XSRF Cookie', () => { + expect(get_cookie('XSRF')).toEqual('FOOBAR'); +}); \ No newline at end of file diff --git a/ui/src/app/core/utility/is_valid_regex.js b/ui/src/app/core/utility/is_valid_regex.js new file mode 100644 index 000000000..3f18d0191 --- /dev/null +++ b/ui/src/app/core/utility/is_valid_regex.js @@ -0,0 +1,11 @@ +export function isValidRegex(pattern) { + if (!pattern) { + return false; + } + try { + new RegExp(pattern); + } catch (err) { + return false; + } + return true; +}; diff --git a/ui/src/app/core/utility/is_valid_regex.test.js b/ui/src/app/core/utility/is_valid_regex.test.js new file mode 100644 index 000000000..7365b5818 --- /dev/null +++ b/ui/src/app/core/utility/is_valid_regex.test.js @@ -0,0 +1,9 @@ +import { isValidRegex } from './is_valid_regex'; + +it('should return false for a malformed regular expression', () => { + expect(isValidRegex(`\\f;klsdflk;sdf()**(&*&^^()`)).toBe(false) +}); + +it('should return true for a well-formed regular expression', () => { + expect(isValidRegex(`[a-z0-9][a-z0-9-]{0,31}:`)).toBe(true) +}); \ No newline at end of file diff --git a/ui/src/app/core/utility/read_file_contents.js b/ui/src/app/core/utility/read_file_contents.js new file mode 100644 index 000000000..99d8a175a --- /dev/null +++ b/ui/src/app/core/utility/read_file_contents.js @@ -0,0 +1,15 @@ + + +export function readFileContents(file) { + return new Promise(function (resolve, reject) { + const fileReader = new FileReader(); + + fileReader.onload = (evt) => { + const reader = evt.target; + const txt = reader.result; + resolve(txt); + }; + fileReader.onerror = reject; + fileReader.readAsText(file); + }); +} \ No newline at end of file diff --git a/ui/src/app/core/utility/remove_null.js b/ui/src/app/core/utility/remove_null.js new file mode 100644 index 000000000..30f342172 --- /dev/null +++ b/ui/src/app/core/utility/remove_null.js @@ -0,0 +1,23 @@ +export function checkByType(value) { + switch (typeof value) { + case 'object': { + return Object.keys(value).filter(k => !!value[k]).length > 0; + } + default: { + return true; + } + } +} + +export function removeNull(attribute, discardObjects = false) { + if (!attribute) { return {}; } + let removed = Object.keys(attribute).reduce((coll, val, index) => { + if (attribute[val] !== null) { + if (!discardObjects || checkByType(attribute[val])) { + coll[val] = attribute[val]; + } + } + return coll; + }, {}); + return removed; +} \ No newline at end of file diff --git a/ui/src/app/core/utility/remove_null.test.js b/ui/src/app/core/utility/remove_null.test.js new file mode 100644 index 000000000..490f64abb --- /dev/null +++ b/ui/src/app/core/utility/remove_null.test.js @@ -0,0 +1,14 @@ +import { removeNull } from './remove_null'; + +it('should remove null values from an object', () => { + + const obj = { + foo: null, + bar: { + baz: null + } + }; + + expect(removeNull(obj, true)).toEqual({}); + expect(removeNull(obj, false)).toEqual({bar: { baz: null }}); +}); \ No newline at end of file diff --git a/ui/src/app/core/utility/uuid.js b/ui/src/app/core/utility/uuid.js new file mode 100644 index 000000000..b7cf7f739 --- /dev/null +++ b/ui/src/app/core/utility/uuid.js @@ -0,0 +1,6 @@ +export function uuid() { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + var r = Math.random() * 16 | 0, v = c === 'x' ? r : ((r & 0x3) | 0x8); + return v.toString(16); + }); +} \ No newline at end of file diff --git a/ui/src/app/core/utility/uuid.test.js b/ui/src/app/core/utility/uuid.test.js new file mode 100644 index 000000000..a9d0312c2 --- /dev/null +++ b/ui/src/app/core/utility/uuid.test.js @@ -0,0 +1,5 @@ +import { uuid } from './uuid'; + +it('should return a valid uuid', () => { + expect(uuid()).toMatch(/[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}/); +}); \ No newline at end of file diff --git a/ui/src/app/dashboard/component/Ordered.js b/ui/src/app/dashboard/component/Ordered.js new file mode 100644 index 000000000..256546c8c --- /dev/null +++ b/ui/src/app/dashboard/component/Ordered.js @@ -0,0 +1,89 @@ +import React from 'react'; +import useFetch from 'use-http'; +import first from 'lodash/first'; +import last from 'lodash/last'; +import API_BASE_PATH from '../../App.constant'; +import { array_move } from '../../core/utility/array_move'; + +export const getId = (entity) => { + return entity.resourceId ? entity.resourceId : entity.id; +}; + +export const mergeOrderFn = (entities, order) => { + if (!entities) { + return []; + } + const ordered = [...entities.sort( + (a, b) => { + const aIndex = order.indexOf(getId(a)); + const bIndex = order.indexOf(getId(b)); + return aIndex > bIndex ? 1 : bIndex > aIndex ? -1 : 0; + } + )]; + return ordered; +}; + +export function Ordered({ path = '/MetadataResolversPositionOrder', entities, children, prop = null}) { + + const orderEntities = (orderById, list) => { + setOrdered(mergeOrderFn(list, orderById)); + }; + + const { get, post, response } = useFetch(`${API_BASE_PATH}`, { + cachePolicy: 'no-cache' + }); + + const [order, setOrder] = React.useState([]); + const [ordered, setOrdered] = React.useState([]); + + const [firstId, setFirstId] = React.useState(null); + const [lastId, setLastId] = React.useState(null); + + async function changeOrder(resourceIds) { + await post(path, prop ? { + [prop]: resourceIds + } : [ + ...resourceIds + ]); + if (response.ok) { + loadOrder(); + } + } + + const onOrderUp = (id) => { + const index = order.indexOf(id); + const newOrder = array_move(order, index, index - 1); + changeOrder(newOrder); + }; + + const onOrderDown = (id) => { + const index = order.indexOf(id); + const newOrder = array_move(order, index, index + 1); + changeOrder(newOrder); + }; + + async function loadOrder () { + const o = await get(path); + if (response.ok) { + const ids = prop ? o.hasOwnProperty(prop) ? o[prop] : o : o; + setOrder(ids); + } + } + + React.useEffect(() => { + const oIds = ordered.map(o => o.resourceId); + setFirstId(first(oIds)); + setLastId(last(oIds)); + }, [ordered]) + + /*eslint-disable react-hooks/exhaustive-deps*/ + React.useEffect(() => loadOrder(),[]); + + React.useEffect(() => orderEntities(order, entities), [order, entities]); + + return ( + <> + {children(ordered, firstId, lastId, onOrderUp, onOrderDown)} + + ); +} \ No newline at end of file diff --git a/ui/src/app/dashboard/component/Scroller.js b/ui/src/app/dashboard/component/Scroller.js new file mode 100644 index 000000000..10baf42cf --- /dev/null +++ b/ui/src/app/dashboard/component/Scroller.js @@ -0,0 +1,33 @@ +import React from 'react'; + +import InfiniteScroll from 'react-infinite-scroll-component'; + +const PAGE_LIMIT = 20; + +export function Scroller ({ entities, children }) { + + const [page, setPage] = React.useState(1); + + const [limited, setLimited] = React.useState([]); + + React.useEffect(() => { + let maxIndex = (page * PAGE_LIMIT) - 1, + minIndex = 0; + const l = entities.filter((resolver, index) => (maxIndex >= index && index >= minIndex)); + setLimited(l); + }, [entities, page]) + + const loadNext = () => { + setPage(page + 1); + } + + return ( + loadNext()} + hasMore={entities.length > limited.length} + > + { children(limited) } + + ); +} \ No newline at end of file diff --git a/ui/src/app/dashboard/component/Search.js b/ui/src/app/dashboard/component/Search.js new file mode 100644 index 000000000..126c57501 --- /dev/null +++ b/ui/src/app/dashboard/component/Search.js @@ -0,0 +1,57 @@ +import React from 'react'; +import pick from 'lodash/pick'; + +import InputGroup from 'react-bootstrap/InputGroup'; +import Form from 'react-bootstrap/Form'; +import Button from 'react-bootstrap/Button'; + + +import { includes, some, values } from 'lodash'; + +export function Search ({ entities, searchable, children }) { + + const [searched, setSearched] = React.useState([]); + const [query, setQuery] = React.useState(''); + + React.useEffect(() => setSearched(entities), [entities]); + + const search = (query) => { + setQuery(query); + }; + + React.useEffect(() => { + if (!query) { + setSearched(entities); + } else { + setSearched(entities.filter((e) => { + const picked = values(pick(e, searchable)); + return some(picked, (v) => includes(v.toLowerCase(), query.toLowerCase())); + })); + } + }, [query, entities, searchable]); + + const handleSubmit = (evt) => { + evt.preventDefault(); + search(query); + } + + return ( + <> +
handleSubmit(evt)}> + + Search + + search(event.target.value) } + value={query} /> + + + + + +
+ { children(searched) } + + ); +} \ No newline at end of file diff --git a/ui/src/app/dashboard/container/dashboard.component.html b/ui/src/app/dashboard/container/dashboard.component.html deleted file mode 100644 index 56830de2e..000000000 --- a/ui/src/app/dashboard/container/dashboard.component.html +++ /dev/null @@ -1,37 +0,0 @@ - \ No newline at end of file diff --git a/ui/src/app/dashboard/container/dashboard.component.scss b/ui/src/app/dashboard/container/dashboard.component.scss deleted file mode 100644 index 5bfb3774a..000000000 --- a/ui/src/app/dashboard/container/dashboard.component.scss +++ /dev/null @@ -1,15 +0,0 @@ -@import '../../../theme/palette'; - -:host { - .lead { - line-height: 36px; - } - - .nav-tabs, .nav-link.active { - border-color: $brand-primary; - } - - .nav-link:hover { - border-bottom-color: $brand-primary; - } -} \ No newline at end of file diff --git a/ui/src/app/dashboard/container/dashboard.component.ts b/ui/src/app/dashboard/container/dashboard.component.ts deleted file mode 100644 index 35883eaec..000000000 --- a/ui/src/app/dashboard/container/dashboard.component.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { Component, ChangeDetectionStrategy } from '@angular/core'; -import { Store } from '@ngrx/store'; - -import * as fromRoot from '../../app.reducer'; -import * as fromAdmin from '../../admin/reducer'; -import * as fromCore from '../../core/reducer'; -import { Observable } from 'rxjs'; -import { LoadRoleRequest } from '../../core/action/configuration.action'; -import { map } from 'rxjs/operators'; -import { LoadAdminRequest } from '../../admin/action/admin-collection.action'; -import { LoadMetadataRequest } from '../../admin/action/metadata-collection.action'; - -@Component({ - selector: 'dashboard-page', - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './dashboard.component.html', - styleUrls: ['./dashboard.component.scss'] -}) -export class DashboardPageComponent { - - actionsRequired$: Observable; - hasActions$: Observable; - isAdmin$: Observable; - - constructor( - private store: Store - ) { - this.actionsRequired$ = this.store.select(fromAdmin.getTotalActionsRequired); - this.hasActions$ = this.actionsRequired$.pipe(map(a => a > 0)); - this.isAdmin$ = this.store.select(fromCore.isCurrentUserAdmin); - - this.store.dispatch(new LoadRoleRequest()); - this.store.dispatch(new LoadAdminRequest()); - this.store.dispatch(new LoadMetadataRequest()); - } -} diff --git a/ui/src/app/dashboard/dashboard.module.ts b/ui/src/app/dashboard/dashboard.module.ts deleted file mode 100644 index bca0f80f1..000000000 --- a/ui/src/app/dashboard/dashboard.module.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; - -import { I18nModule } from '../i18n/i18n.module'; -import { CustomWidgetRegistry } from '../schema-form/registry'; -import { WidgetRegistry } from 'ngx-schema-form'; -import { DashboardPageComponent } from './container/dashboard.component'; -import { DashboardRoutingModule } from './dashboard.routing'; -import { MetadataModule } from '../metadata/metadata.module'; -import { AdminModule } from '../admin/admin.module'; - - -@NgModule({ - imports: [ - CommonModule, - DashboardRoutingModule, - MetadataModule, - AdminModule, - I18nModule, - CommonModule - ], - providers: [ - { provide: WidgetRegistry, useClass: CustomWidgetRegistry } - ], - declarations: [ - DashboardPageComponent - ] -}) -export class DashboardModule { } diff --git a/ui/src/app/dashboard/dashboard.routing.ts b/ui/src/app/dashboard/dashboard.routing.ts deleted file mode 100644 index 1563c73c5..000000000 --- a/ui/src/app/dashboard/dashboard.routing.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { NgModule } from '@angular/core'; -import { Routes, RouterModule } from '@angular/router'; -import { DashboardPageComponent } from './container/dashboard.component'; -import { ManagerComponent } from '../metadata/manager/container/manager.component'; -import { MetadataPageComponent } from '../metadata/metadata.component'; -import { DashboardResolversListComponent } from '../metadata/manager/container/dashboard-resolvers-list.component'; -import { DashboardProvidersListComponent } from '../metadata/manager/container/dashboard-providers-list.component'; -import { ActionRequiredPageComponent } from '../admin/container/action-required.component'; -import { AdminComponent } from '../admin/admin.component'; -import { AdminManagementPageComponent } from '../admin/container/admin-management.component'; -import { AdminGuard } from '../core/service/admin.guard'; - -const routes: Routes = [ - { - path: '', - component: DashboardPageComponent, - children: [ - { path: '', redirectTo: 'metadata', pathMatch: 'prefix' }, - { - path: 'metadata', - component: MetadataPageComponent, - children: [ - { path: '', redirectTo: 'manager', pathMatch: 'prefix' }, - { - path: 'manager', - component: ManagerComponent, - children: [ - { path: '', redirectTo: 'resolvers', pathMatch: 'prefix' }, - { - path: 'resolvers', - component: DashboardResolversListComponent, - data: { title: 'Metadata Source Dashboard' } - }, - { - path: 'providers', - component: DashboardProvidersListComponent, - canActivate: [AdminGuard], - data: { title: 'Metadata Provider Dashboard' } - }, - ] - } - ] - }, - { - path: 'admin', - canActivate: [AdminGuard], - children: [ - { - path: '', - component: AdminComponent, - children: [ - { - path: 'management', - component: AdminManagementPageComponent, - data: { title: 'User Administration Dashboard' } - }, - { - path: 'actions', - component: ActionRequiredPageComponent, - data: { title: 'Administrator Actions Required Dashboard' } - } - ] - } - ] - } - ], - }, -]; - -@NgModule({ - imports: [ - RouterModule.forChild(routes), - ], - exports: [RouterModule] -}) -export class DashboardRoutingModule { } diff --git a/ui/src/app/dashboard/view/ActionsTab.js b/ui/src/app/dashboard/view/ActionsTab.js new file mode 100644 index 000000000..76d1ff592 --- /dev/null +++ b/ui/src/app/dashboard/view/ActionsTab.js @@ -0,0 +1,42 @@ +import React from 'react'; +import { SourcesActions } from '../../admin/container/SourcesActions'; +import UserActions from '../../admin/container/UserActions'; + +import Translate from '../../i18n/components/translate'; + +export function ActionsTab({ sources, users, reloadSources, reloadUsers }) { + + return ( + <> +
+
+
+
+
+ Enable Metadata Sources +
+
+
+
+ +
+
+
+
+
+
+
+
+ User Access Request +
+
+
+ +
+
+ + + ); +} + +export default ActionsTab; \ No newline at end of file diff --git a/ui/src/app/dashboard/view/AdminTab.js b/ui/src/app/dashboard/view/AdminTab.js new file mode 100644 index 000000000..a458c810a --- /dev/null +++ b/ui/src/app/dashboard/view/AdminTab.js @@ -0,0 +1,51 @@ +import React from 'react'; +import useFetch from 'use-http'; +import UserManagement from '../../admin/container/UserManagement'; +import UserMaintenance from '../../admin/component/UserMaintenance'; +import API_BASE_PATH from '../../App.constant'; + +import Translate from '../../i18n/components/translate'; + +export function AdminTab () { + + const [users, setUsers] = React.useState([]); + + const { get, response } = useFetch(`${API_BASE_PATH}/admin/users`, { + cachePolicy: 'no-cache' + }, []); + + async function loadUsers() { + const users = await get('') + if (response.ok) { + setUsers(users); + } + } + + /*eslint-disable react-hooks/exhaustive-deps*/ + React.useEffect(() => { + loadUsers(); + }, []); + + + return ( +
+
+
+
+
+ User Maintenance +
+
+
+
+ + {(u, roles, onChangeUserRole, onDeleteUser) => + } + +
+
+
+ ); +} + +export default AdminTab; \ No newline at end of file diff --git a/ui/src/app/dashboard/view/Dashboard.js b/ui/src/app/dashboard/view/Dashboard.js new file mode 100644 index 000000000..5869e5695 --- /dev/null +++ b/ui/src/app/dashboard/view/Dashboard.js @@ -0,0 +1,103 @@ +import React from 'react'; + +import Nav from 'react-bootstrap/Nav'; +import { Switch, Route, Redirect, useRouteMatch } from 'react-router-dom'; +import { NavLink } from 'react-router-dom'; + +import Translate from '../../i18n/components/translate'; +import { AdminRoute } from '../../core/components/AdminRoute'; + +import { SourcesTab } from './SourcesTab'; +import { ProvidersTab } from './ProvidersTab'; +import { AdminTab } from './AdminTab'; +import { ActionsTab } from './ActionsTab'; +import { useIsAdmin } from '../../core/user/UserContext'; +import useFetch from 'use-http'; +import API_BASE_PATH from '../../App.constant'; +import { useNonAdminSources } from '../../metadata/hooks/api'; + +export function Dashboard () { + + const { path } = useRouteMatch(); + + const isAdmin = useIsAdmin(); + + const [actions, setActions] = React.useState(0); + const [users, setUsers] = React.useState([]); + const [sources, setSources] = React.useState([]); + + const { get, response } = useFetch(`${API_BASE_PATH}`, { + cachePolicy: 'no-cache' + }); + + const sourceLoader = useNonAdminSources(); + + async function loadUsers() { + const users = await get('/admin/users') + if (response.ok) { + setUsers(users.filter(u => u.role === 'ROLE_NONE')); + } + } + + async function loadSources() { + const s = sourceLoader.get(); + if (response.ok) { + setSources(s); + } + } + + /*eslint-disable react-hooks/exhaustive-deps*/ + React.useEffect(() => { + loadSources(); + loadUsers(); + }, []); + + React.useEffect(() => { + setActions(users.length + sources.length); + }, [users, sources]); + + return ( +
+ + + + + + + + + + + + + +
+ ); +} +export default Dashboard; \ No newline at end of file diff --git a/ui/src/app/dashboard/view/ProvidersTab.js b/ui/src/app/dashboard/view/ProvidersTab.js new file mode 100644 index 000000000..123e54f41 --- /dev/null +++ b/ui/src/app/dashboard/view/ProvidersTab.js @@ -0,0 +1,64 @@ +import React from 'react'; + +import { useMetadataEntities } from '../../metadata/hooks/api'; +import Translate from '../../i18n/components/translate'; +import ProviderList from '../../metadata/domain/provider/component/ProviderList'; +import {Search} from '../component/Search'; +import { Ordered } from '../component/Ordered'; +import { useIsAdmin } from '../../core/user/UserContext'; +import Alert from 'react-bootstrap/Alert'; + +const searchProps = ['name', '@type', 'createdBy']; + +export function ProvidersTab () { + + const [providers, setProviders] = React.useState([]); + + const { get, response } = useMetadataEntities('provider', { + cachePolicy: 'no-cache' + }); + + async function loadProviders() { + const providers = await get('') + if (response.ok) { + setProviders(providers); + } + } + + /*eslint-disable react-hooks/exhaustive-deps*/ + React.useEffect(() => { loadProviders() }, []); + + const isAdmin = useIsAdmin(); + + return ( +
+
+ {isAdmin ? + <> +
+ + Current Metadata Providers + +
+
+ + {(ordered, first, last, onOrderUp, onOrderDown) => + + {(searched) => } + + } + +
+ + : + Access Denied} +
+
+ ); +} \ No newline at end of file diff --git a/ui/src/app/dashboard/view/SourcesTab.js b/ui/src/app/dashboard/view/SourcesTab.js new file mode 100644 index 000000000..94305795b --- /dev/null +++ b/ui/src/app/dashboard/view/SourcesTab.js @@ -0,0 +1,46 @@ +import React from 'react'; +import Translate from '../../i18n/components/translate'; + +import SourceList from '../../metadata/domain/source/component/SourceList'; +import { useMetadataEntities } from '../../metadata/hooks/api'; +import { Search } from '../component/Search'; + +const searchProps = ['serviceProviderName', 'entityId', 'createdBy']; + +export function SourcesTab () { + + const [sources, setSources] = React.useState([]); + + const { get, response } = useMetadataEntities('source', { + cachePolicy: 'no-cache' + }); + + async function loadSources() { + const sources = await get('/'); + if (response.ok) { + setSources(sources); + } + } + + const updateSources = () => loadSources(); + + /*eslint-disable react-hooks/exhaustive-deps*/ + React.useEffect(() => { loadSources() }, []); + + return ( +
+
+
+ + Current Metadata Sources + +
+
+ + {(searched) => } + +
+
+
+ ); +} \ No newline at end of file diff --git a/ui/src/app/form/component/AddButton.js b/ui/src/app/form/component/AddButton.js new file mode 100644 index 000000000..c5bb7714e --- /dev/null +++ b/ui/src/app/form/component/AddButton.js @@ -0,0 +1,14 @@ +import React from "react"; +import { faPlus } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; + +import Button from "react-bootstrap/Button"; +import Translate from "../../i18n/components/translate"; + +const AddButton = ({className, ...props}) => ( + +); +export default AddButton; \ No newline at end of file diff --git a/ui/src/app/form/component/IconButton.js b/ui/src/app/form/component/IconButton.js new file mode 100644 index 000000000..5cac9c37d --- /dev/null +++ b/ui/src/app/form/component/IconButton.js @@ -0,0 +1,23 @@ +import React from "react"; +import Button from "react-bootstrap/Button"; + +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { faArrowDown, faArrowUp, faTrash, faPlus } from "@fortawesome/free-solid-svg-icons"; + +const mappings = { + remove: , + plus: , + "arrow-up": , + "arrow-down": , +}; + +const IconButton = (props) => { + const { icon, ...otherProps } = props; + return ( + + ); +}; + +export default IconButton; \ No newline at end of file diff --git a/ui/src/app/form/component/InfoIcon.js b/ui/src/app/form/component/InfoIcon.js new file mode 100644 index 000000000..989428435 --- /dev/null +++ b/ui/src/app/form/component/InfoIcon.js @@ -0,0 +1,24 @@ +import React from 'react'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { faInfoCircle } from '@fortawesome/free-solid-svg-icons'; +import Popover from 'react-bootstrap/Popover'; +import OverlayTrigger from 'react-bootstrap/OverlayTrigger'; +import Button from 'react-bootstrap/Button'; +import Translate from '../../i18n/components/translate'; +import { useTranslator } from '../../i18n/hooks'; + +export function InfoIcon ({ value, placement='left', ...props }) { + const translate = useTranslator(); + return( + + + + )} + aria-label={translate('tooltip.instruction')}> + + + ); +} \ No newline at end of file diff --git a/ui/src/app/form/component/fields/DescriptionField.js b/ui/src/app/form/component/fields/DescriptionField.js new file mode 100644 index 000000000..aeea23ace --- /dev/null +++ b/ui/src/app/form/component/fields/DescriptionField.js @@ -0,0 +1,12 @@ +import React from "react"; +import { InfoIcon } from "../InfoIcon"; + +const DescriptionField = ({ description }) => { + if (description) { + return ; + } + + return null; +}; + +export default DescriptionField; \ No newline at end of file diff --git a/ui/src/app/form/component/fields/FilterTargetField.js b/ui/src/app/form/component/fields/FilterTargetField.js new file mode 100644 index 000000000..bad90052e --- /dev/null +++ b/ui/src/app/form/component/fields/FilterTargetField.js @@ -0,0 +1,285 @@ +import React from 'react'; +import Dropdown from 'react-bootstrap/Dropdown'; +import Translate from '../../../i18n/components/translate'; +import Button from 'react-bootstrap/Button'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { faAsterisk, faCaretDown, faCaretUp, faEye, faEyeSlash, faPlus, faSpinner, faTrash } from '@fortawesome/free-solid-svg-icons'; +import { useTranslator } from '../../../i18n/hooks'; +import { InfoIcon } from '../InfoIcon'; +import ContentEditable from 'react-contenteditable'; +import { AsyncTypeahead } from 'react-bootstrap-typeahead'; +import useFetch from 'use-http'; +import queryString from 'query-string'; +import API_BASE_PATH from '../../../App.constant'; +import isNil from 'lodash/isNil'; + +import { FilterTargetPreview } from '../../../metadata/hoc/FilterTargetPreview'; + +const ToggleButton = ({ isOpen, onClick, disabled }) => ( + +); + +const FilterTargetField = ({ + schema, + label, + id, + name, + disabled, + value, + readonly, + rawErrors, + onChange, + errorSchema, + formData, + ...props +}) => { + const typeFieldName = `${name}Type`; + + const type = schema.properties[typeFieldName]; + const typeOptions = type['enum'].map((v, e) => ({ + label: type['enumNames'][e], + value: type['enum'][e] + })); + + const [selectedType, setSelectedType] = React.useState(formData && formData.hasOwnProperty(typeFieldName) ? typeOptions.find(t => formData[typeFieldName] === t.value) : typeOptions[0]); + const [selectedTarget, setSelectedTarget] = React.useState([...(formData.value && !isNil(formData.value) && !isNil(formData.value[0]) ? formData.value : [])]); + + const [term, setSearchTerm] = React.useState(''); + const [ids, setSearchIds] = React.useState([]); + + const { get, response } = useFetch(`${API_BASE_PATH}/EntityIds/search`, { + cachePolicy: 'no-cache' + }); + + async function searchIds (query) { + const { entityIds } = get(`?${queryString.stringify({ + term: query, + limit: 10 + })}`) + if (response.ok) { + setSearchIds(entityIds); + } + } + + /*eslint-disable react-hooks/exhaustive-deps*/ + React.useEffect(() => { + if (term && term.length >= 4) { + searchIds(term); + } + }, [term]); + + React.useEffect(() => { + onChange({ + [typeFieldName]: selectedType.value, + value: selectedTarget + }) + }, [selectedType, selectedTarget]); + + const displayType = selectedType?.label || ''; + const targetType = selectedType?.value || null; + + const ref = React.useRef(selectedTarget[0]); + + var handleTextChange = function (value) { + setSelectedTarget([value]); + }; + + const translate = useTranslator(); + + const onSelectValue = (value) => { + setSelectedTarget([ + value, + ...selectedTarget + ]); + setSearchTerm(''); + }; + const removeId = (id) => { + setSelectedTarget([ + ...selectedTarget.filter(t => t !== id) + ]); + }; + + const onEntityIdsChange = (value) => { + setSearchTerm(value); + }; + + const selectType = (option) => { + setSelectedTarget([]); + setSelectedType(option); + }; + + return ( +
+ +
+
+
+ + + + {selectedType.label || type.title}  + + + {typeOptions.map((option) => ( + selectType(option)} key={option.value} type="button"> + {option.label} + + ))} + + +
+
+
+ +
+
+ {targetType === 'ENTITY' && + <> + {} } + onSearch={ (query) => setSearchTerm(query) } + renderMenuItemChildren={(option, { options, text }, index) => { + return {option}; + }}> + {({ isMenuShown, toggleMenu }) => ( + toggleMenu()} disabled={disabled || readonly} /> + )} + + + + You must add at least one entity id target and they must each be unique. + + + + } + { targetType === 'CONDITION_SCRIPT' && + <> + handleTextChange(value)} + html={ selectedTarget[0] } + innerRef={ref} + dangerouslySetInnerHTML={true}> + + + Required for Scripts + + } + {targetType === 'REGEX' && + <> + handleTextChange(value) } /> + {errorSchema?.value?.__errors ? + + {errorSchema?.value?.__errors?.map((error, eIdx) => + + {error} + + )} + : + + Required for Regex +   + + } + + } + +
+ {targetType === 'ENTITY' && +
+ +
+ } +
+
+
+ {targetType === 'ENTITY' && +
+ +
+
    + {selectedTarget.map(id => +
  • + + {(preview, loading, xml) => ( + + {id} + + {preview && + + } + + + + )} + +
  • + )} +
+
+ } +
+
+ ); +}; + +/* +*/ + +export default FilterTargetField; \ No newline at end of file diff --git a/ui/src/app/form/component/fields/StringListWithDefaultField.js b/ui/src/app/form/component/fields/StringListWithDefaultField.js new file mode 100644 index 000000000..3f8ba8b74 --- /dev/null +++ b/ui/src/app/form/component/fields/StringListWithDefaultField.js @@ -0,0 +1,147 @@ +import React from 'react'; + +import Row from "react-bootstrap/Row"; +import Col from "react-bootstrap/Col"; +import Form from 'react-bootstrap/Form'; + +import Button from 'react-bootstrap/Button'; + +import AddButton from "../AddButton"; + +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { faTrash } from '@fortawesome/free-solid-svg-icons'; + +const ArrayFieldDescription = ({ + DescriptionField, + idSchema, + description, +}) => { + if (!description) { + return null; + } + + const id = `${idSchema.$id}__description`; + return ; +}; + + +const ArrayFieldTitle = ({ + TitleField, + idSchema, + title, + required, +}) => { + if (!title) { + return null; + } + + const id = `${idSchema.$id}__title`; + return ; +}; + +const defItem = { + value: '', + default: false +} + +const StringListWithDefaultField = ({ + schema, + label, + id, + name, + disabled, + value, + readonly, + rawErrors, + onChange, + errorSchema, + formData, + registry, + ...props +}) => { + + const { fields } = registry; + const [items, setItems] = React.useState([ + ...(formData ? formData : []) + ]); + + React.useEffect(() => { + onChange(items); + }, [items, onChange]); + + const onAdd = () => { + setItems([...items, { ...defItem }]); + }; + + const setValue = (item, value) => { + item.value = value; + setItems([...items]); + }; + + const setDefault = (item) => { + const current = items.find(i => i.default); + if (current) { + current.default = false; + } + item.default = true; + setItems([...items]); + }; + + const removeItem = (item) => { + setItems([...items.filter(i => i !== item)]); + }; + + return ( +
+ + +
+ {} + + {(props.uiSchema["ui:description"] || schema.description) && ( + + )} +
+
+ {items && items.map((p, idx) => +
+ setValue(p, value)}> + setDefault(p) } + > + +
+ )} +
+ +
+
+ ); +}; + + +export default StringListWithDefaultField; \ No newline at end of file diff --git a/ui/src/app/form/component/fields/TitleField.js b/ui/src/app/form/component/fields/TitleField.js new file mode 100644 index 000000000..eecebb032 --- /dev/null +++ b/ui/src/app/form/component/fields/TitleField.js @@ -0,0 +1,8 @@ +import React from "react"; +import Translate from "../../../i18n/components/translate"; + +const TitleField = ({ title }) => ( + +); + +export default TitleField; \ No newline at end of file diff --git a/ui/src/app/form/component/index.js b/ui/src/app/form/component/index.js new file mode 100644 index 000000000..013e118db --- /dev/null +++ b/ui/src/app/form/component/index.js @@ -0,0 +1,42 @@ +import TextWidget from './widgets/TextWidget'; +import TextareaWidget from './widgets/TextareaWidget'; +import SelectWidget from './widgets/SelectWidget'; +import CheckboxWidget from './widgets/CheckboxWidget'; +import AttributeReleaseWidget from './widgets/AttributeReleaseWidget'; +import RadioWidget from './widgets/RadioWidget'; +import OptionWidget from './widgets/OptionWidget'; +import UpDownWidget from './widgets/UpDownWidget'; + +import FieldTemplate from './templates/FieldTemplate'; +import ArrayFieldTemplate from './templates/ArrayFieldTemplate'; +import ObjectFieldTemplate from './templates/ObjectFieldTemplate'; + +import TitleField from './fields/TitleField'; +import DescriptionField from './fields/DescriptionField'; +import FilterTargetField from './fields/FilterTargetField'; +import StringListWithDefaultField from './fields/StringListWithDefaultField'; + +export const fields = { + // SchemaField: CustomSchemaField + TitleField, + DescriptionField, + FilterTargetField, + StringListWithDefaultField +}; + +export const templates = { + FieldTemplate, + ArrayFieldTemplate, + ObjectFieldTemplate +} + +export const widgets = { + OptionWidget, + TextWidget, + TextareaWidget, + SelectWidget, + CheckboxWidget, + RadioWidget, + UpDownWidget, + AttributeReleaseWidget +}; \ No newline at end of file diff --git a/ui/src/app/form/component/templates/ArrayFieldTemplate.js b/ui/src/app/form/component/templates/ArrayFieldTemplate.js new file mode 100644 index 000000000..e138c10a0 --- /dev/null +++ b/ui/src/app/form/component/templates/ArrayFieldTemplate.js @@ -0,0 +1,283 @@ +import React from "react"; +import { utils } from "@rjsf/core"; +import Row from "react-bootstrap/Row"; +import Col from "react-bootstrap/Col"; +import Container from "react-bootstrap/Container"; +import Accordion from 'react-bootstrap/Accordion'; +import Button from 'react-bootstrap/Button'; + +import AddButton from "../AddButton"; +import IconButton from "../IconButton"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { faCaretDown } from "@fortawesome/free-solid-svg-icons"; +import Translate from "../../../i18n/components/translate"; + +const { isMultiSelect, getDefaultRegistry } = utils; + +const ArrayFieldTemplate = (props) => { + const { schema, registry = getDefaultRegistry() } = props; + + // TODO: update types so we don't have to cast registry as any + if (isMultiSelect(schema, (registry).rootSchema)) { + + return ; + } else { + return ; + } +}; + + +const ArrayFieldTitle = ({ + TitleField, + idSchema, + title, + required, +}) => { + if (!title) { + return null; + } + + const id = `${idSchema.$id}__title`; + return ; +}; + + +const ArrayFieldDescription = ({ + DescriptionField, + idSchema, + description, +}) => { + if (!description) { + return null; + } + + const id = `${idSchema.$id}__description`; + return ; +}; + +// Used in the two templates + +const ObjectArrayItem = ({type, ...props}) => { + const btnStyle = { + flex: 1, + paddingLeft: 6, + paddingRight: 6, + fontWeight: "bold", + }; + return ( +
+ +
+
+ +   + + + {props.hasToolbar && ( +
+ {(props.hasMoveUp || props.hasMoveDown) && ( +
+ +
+ )} + + {(props.hasMoveUp || props.hasMoveDown) && ( +
+ +
+ )} + + {props.hasRemove && ( +
+ +
+ )} +
+ )} +
+ +
{props.children}
+
+
+
+
+ ); +} + +const DefaultArrayItem = (props) => { + const btnStyle = { + flex: 1, + paddingLeft: 6, + paddingRight: 6, + fontWeight: "bold", + }; + + const uiSchemaOptions = props.uiSchema ? props.uiSchema['ui:options'] || {} : {}; + + return ( +
+
+
{props.children}
+ {props.hasToolbar && ( +
+ {(props.hasMoveUp || props.hasMoveDown) && ( +
+ +
+ )} + + {(props.hasMoveUp || props.hasMoveDown) && ( +
+ +
+ )} + + {props.hasRemove && ( +
+ +
+ )} +
+ )} +
+
+ ); +}; + +const DefaultFixedArrayFieldTemplate = (props) => { + return ( +
+
+ + {props.canAdd && ( + + )} +
+ + + {props.uiSchema["ui:description"] !== false && (props.uiSchema["ui:description"] || props.schema.description) && ( +
+ {props.uiSchema["ui:description"] || props.schema.description} +
+ )} + +
+ {props.items && props.items.map(DefaultArrayItem)} +
+ + +
+ ); +}; + +const DefaultNormalArrayFieldTemplate = (props) => { + + const showTitle = props.uiSchema.hasOwnProperty("ui:title") ? props.uiSchema["ui:title"] === false && !props.canAdd ? false : true : true; + + return ( + + +
+ {showTitle && } + {props.canAdd && ( + + )} + {(props.uiSchema["ui:description"] || props.schema.description) && ( + + )} +
+ + {props.items && props.items.map(p => + props.schema.items.type === 'object' || props.schema.items.$ref ? + ObjectArrayItem({ type: props.uiSchema.type, ...p }) + : + DefaultArrayItem({ ...p, uiSchema: props.uiSchema.items }) + )} + + +
+ ); +}; + +export default ArrayFieldTemplate; \ No newline at end of file diff --git a/ui/src/app/form/component/templates/FieldTemplate.js b/ui/src/app/form/component/templates/FieldTemplate.js new file mode 100644 index 000000000..1e2b8f7eb --- /dev/null +++ b/ui/src/app/form/component/templates/FieldTemplate.js @@ -0,0 +1,39 @@ +import React from "react"; + +import Form from "react-bootstrap/Form"; + +import {Translate} from '../../../i18n/components/translate'; + +export function FieldTemplate ({ + id, + label, + children, + displayLabel, + rawErrors = [], + errors = [], + rawHelp, + help, + rawDescription, + ...props +}) { + + return ( + <>{!props.hidden ? + +
+ {children} +
+
+ {rawHelp && rawErrors.length < 1 && ( + 0 ? "text-danger" : "text-muted"} id={id}> + + + )} +
+
+ : <> + } + ); +}; + +export default FieldTemplate; \ No newline at end of file diff --git a/ui/src/app/form/component/templates/ObjectFieldTemplate.js b/ui/src/app/form/component/templates/ObjectFieldTemplate.js new file mode 100644 index 000000000..0fe0089e4 --- /dev/null +++ b/ui/src/app/form/component/templates/ObjectFieldTemplate.js @@ -0,0 +1,74 @@ +import React from "react"; + +import Container from "react-bootstrap/Container"; +import Row from "react-bootstrap/Row"; +import Col from "react-bootstrap/Col"; +import Translate from "../../../i18n/components/translate"; + +const ObjectFieldTemplate = ({ + DescriptionField, + description, + TitleField, + title, + properties, + required, + uiSchema, + idSchema, + schema, + hidden, + ...props +}) => { + + const displayTitle = (uiSchema["ui:title"] || (title && schema.title)); + + return ( + <> + {!hidden && + <> + {displayTitle && ( + <> + +
+ + )} + {displayTitle && description && ( + + )} + + <> + {uiSchema.layout ? + {uiSchema.layout.groups.map((group, rIdx) => ( + + {properties.some(p => group.fields.indexOf(p.name) > -1) && + + {group.title && } + {properties.filter(p => group.fields.indexOf(p.name) > -1).map((element, eIdx) => ( + {element.content} + ))} + + } + + ))} + : + properties.map((element, index) => ( + + {element.content} + + )) + } + + + + } + + ); +}; + +export default ObjectFieldTemplate; \ No newline at end of file diff --git a/ui/src/app/form/component/widgets/AttributeReleaseWidget.js b/ui/src/app/form/component/widgets/AttributeReleaseWidget.js new file mode 100644 index 000000000..9ff995e59 --- /dev/null +++ b/ui/src/app/form/component/widgets/AttributeReleaseWidget.js @@ -0,0 +1,133 @@ +import React from "react"; +import Form from "react-bootstrap/Form"; +import Translate from "../../../i18n/components/translate"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { faCheck, faTimes } from "@fortawesome/free-solid-svg-icons"; +import Button from 'react-bootstrap/Button'; + +const selectValue = (value, selected, all) => { + const at = all.indexOf(value); + const updated = selected.slice(0, at).concat(value, selected.slice(at)); + + // As inserting values at predefined index positions doesn't work with empty + // arrays, we need to reorder the updated selection to match the initial order + return updated.sort((a, b) => all.indexOf(a) > all.indexOf(b)); +}; + +const deselectValue = (value, selected) => { + return selected.filter((v) => v !== value); +}; + +const AttributeReleaseWidget = ({ + schema, + label, + id, + disabled, + options, + value, + autofocus, + readonly, + required, + onChange, + onBlur, + onFocus, +}) => { + const { enumOptions, enumDisabled } = options; + + const _onChange = (option) => ({ + target: { checked }, + }) => { + const all = (enumOptions).map(({ value }) => value); + + if (checked) { + onChange(selectValue(option.value, value, all)); + } else { + onChange(deselectValue(option.value, value)); + } + }; + + const _onBlur = ({ target: { value } }) => + onBlur(id, value); + const _onFocus = ({ + target: { value }, + }) => onFocus(id, value); + + const onCheckAll = () => { + const all = (enumOptions).map(({ value }) => value); + let update = []; + enumOptions.forEach(v => update = selectValue(v.value, update, all)); + + onChange(update); + } + const onClearAll = () => { + onChange([]); + } + + return ( +
+ + + + + + + + + + {(enumOptions).map((option, index) => { + const checked = value.indexOf(option.value) !== -1; + const itemDisabled = + enumDisabled && (enumDisabled).indexOf(option.value) !== -1; + return ( + + + + + ); + })} + + + + + + + + + +
Attribute NameYes
+
+
+ +
+
+
Check All Attributes + +
Clear All Attributes + +
+
+ ); +}; + +/* +*/ + +export default AttributeReleaseWidget; \ No newline at end of file diff --git a/ui/src/app/form/component/widgets/CheckboxWidget.js b/ui/src/app/form/component/widgets/CheckboxWidget.js new file mode 100644 index 000000000..b1833159c --- /dev/null +++ b/ui/src/app/form/component/widgets/CheckboxWidget.js @@ -0,0 +1,57 @@ +import React from "react"; + +import Form from "react-bootstrap/Form"; +import Translate from "../../../i18n/components/translate"; +import { InfoIcon } from "../InfoIcon"; + +const CheckboxWidget = (props) => { + const { + id, + value, + required, + disabled, + readonly, + label, + schema, + autofocus, + onChange, + onBlur, + onFocus, + } = props; + + const _onChange = ({ + target: { checked }, + }) => onChange(checked); + const _onBlur = ({ + target: { checked }, + }) => onBlur(id, checked); + const _onFocus = ({ + target: { checked }, + }) => onFocus(id, checked); + + // const desc = label || schema.description; + return ( + + + + + {(label || schema.title) && required ? * : null} + + {schema.description && } + } + checked={typeof value === "undefined" ? false : value} + required={required} + disabled={disabled || readonly} + autoFocus={autofocus} + onChange={_onChange} + type="checkbox" + onBlur={_onBlur} + onFocus={_onFocus} + /> + + ); +}; + +export default CheckboxWidget; \ No newline at end of file diff --git a/ui/src/app/form/component/widgets/OptionWidget.js b/ui/src/app/form/component/widgets/OptionWidget.js new file mode 100644 index 000000000..88648c0c5 --- /dev/null +++ b/ui/src/app/form/component/widgets/OptionWidget.js @@ -0,0 +1,142 @@ +import React, { useRef } from "react"; + +import ListGroup from "react-bootstrap/ListGroup"; +import Form from "react-bootstrap/Form"; +import Button from 'react-bootstrap/Button'; + +import Translate from "../../../i18n/components/translate"; +import { InfoIcon } from "../InfoIcon"; + +import { Typeahead } from 'react-bootstrap-typeahead'; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { faAsterisk, faCaretDown, faCaretUp } from "@fortawesome/free-solid-svg-icons"; +import { useTranslator } from "../../../i18n/hooks"; + +const ToggleButton = ({ isOpen, onClick, disabled }) => ( + +); + +const OptionWidget = ({ + id, + placeholder, + required, + readonly, + disabled, + type, + label, + value, + onChange, + onBlur, + onFocus, + autofocus, + options, + schema, + rawErrors = [], + uiSchema, + ...props +}) => { + + const typeahead = useRef(); + + const _onChange = (selected) => { + const sel = selected[0]; + const val = typeof sel === 'object' && sel.label ? sel.label : sel; + setInputValue(val); + onChange(val); + }; + const _onBlur = ({ target: { value } }) => onBlur(id, value); + const _onFocus = ({ target: { value } }) => onFocus(id, value); + // const inputType = (type || schema.type) === 'string' ? 'text' : `${type || schema.type}`; + + const opts = Array.isArray(options) || options.enumOptions ? options : schema.examples ? schema.examples : uiSchema.options ? uiSchema.options : []; + + const translator = useTranslator(); + + const [touched, setTouched] = React.useState(false); + + const onCustomBlur = (evt) => { + setTouched(true); + _onBlur(evt); + _onChange([inputValue]); + }; + + const onKeydown = (evt) => { + if (evt.keyCode === 13) { + if (typeahead.current.state.showMenu && !typeahead.current.state.activeItem) { + typeahead.current.toggleMenu(); + } + _onChange([inputValue]); + } + }; + + const defaultInputValue = typeof value === 'object' && value && value.label ? value.label : value; + + const [ inputValue, setInputValue ] = React.useState( defaultInputValue ); + + const onInputChange = (val) => { + setInputValue(val); + }; + + return ( + + 0) ? "text-danger" : ""}`}> + + + {(label || schema.title) && required ? : null} + + {schema.description && } + + 0 ? "is-invalid" : ""}`} + options={opts} + placeholder={uiSchema['ui:placeholder'] ? translator(uiSchema['ui:placeholder'] ): ''} + disabled={disabled || readonly} + onBlur={onCustomBlur} + onFocus={_onFocus} + onInputChange={ onInputChange } + onKeyDown={ onKeydown } + filterBy={(option, props) => true} + renderMenuItemChildren={(option, {options, text}, index) => { + return {option}; + }} + newSelectionPrefix={''} + > + {({ isMenuShown, toggleMenu }) => ( + toggleMenu()} disabled={disabled || readonly} /> + )} + + {rawErrors.length > 0 && touched && ( + + {rawErrors.map((error, i) => { + return ( + 0 ? 'sr-only' : ''}`}> + + {error} + + + ); + })} + + )} + + ); +}; + +export default OptionWidget; \ No newline at end of file diff --git a/ui/src/app/form/component/widgets/RadioWidget.js b/ui/src/app/form/component/widgets/RadioWidget.js new file mode 100644 index 000000000..c92d63e95 --- /dev/null +++ b/ui/src/app/form/component/widgets/RadioWidget.js @@ -0,0 +1,74 @@ +import React from "react"; + +import Form from "react-bootstrap/Form"; +import Translate from "../../../i18n/components/translate"; +import { InfoIcon } from "../InfoIcon"; + + +const RadioWidget = ({ + id, + schema, + options, + value, + required, + disabled, + readonly, + label, + onChange, + onBlur, + onFocus, + ...props +}) => { + const { enumOptions, enumDisabled } = options; + + const _onChange = ({ + target: { value }, + }) => + onChange(schema.type === "boolean" ? value !== "false" : value); + const _onBlur = ({ target: { value } }) => + onBlur(id, value); + const _onFocus = ({ + target: { value }, + }) => onFocus(id, value); + + const inline = Boolean(options && options.inline); + + return ( + + + + + {(label || schema.title) && required ? * : null} + + {schema.description && } + + {(enumOptions).map((option, i) => { + const itemDisabled = + Array.isArray(enumDisabled) && + enumDisabled.indexOf(option.value) !== -1; + const checked = option.value === value; + + const radio = ( + } + id={`${id}-${option.label}`} + key={i} + name={id} + type="radio" + disabled={disabled || itemDisabled || readonly} + checked={checked} + required={required} + value={option.value} + onChange={_onChange} + onBlur={_onBlur} + onFocus={_onFocus} + /> + ); + return radio; + })} + + ); +}; + +export default RadioWidget; \ No newline at end of file diff --git a/ui/src/app/form/component/widgets/SelectWidget.js b/ui/src/app/form/component/widgets/SelectWidget.js new file mode 100644 index 000000000..9a2cd421c --- /dev/null +++ b/ui/src/app/form/component/widgets/SelectWidget.js @@ -0,0 +1,152 @@ +import React from "react"; + +import Form from "react-bootstrap/Form"; +import ListGroup from "react-bootstrap/ListGroup"; + +import { utils } from "@rjsf/core"; + +import Translate from "../../../i18n/components/translate"; +import { InfoIcon } from "../InfoIcon"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { faAsterisk } from "@fortawesome/free-solid-svg-icons"; +import { useTranslator } from "../../../i18n/hooks"; + +const { asNumber, guessType } = utils; + +const nums = new Set(["number", "integer"]); + +/** + * This is a silly limitation in the DOM where option change event values are + * always retrieved as strings. + */ +const processValue = (schema, value) => { + // "enum" is a reserved word, so only "type" and "items" can be destructured + const { type, items } = schema; + if (value === "") { + return undefined; + } else if (type === "array" && items && nums.has(items.type)) { + return value.map(asNumber); + } else if (type === "boolean") { + return value === "true"; + } else if (type === "number") { + return asNumber(value); + } + + // If type is undefined, but an enum is present, try and infer the type from + // the enum values + if (schema.enum) { + if (schema.enum.every((x) => guessType(x) === "number")) { + return asNumber(value); + } else if (schema.enum.every((x) => guessType(x) === "boolean")) { + return value === "true"; + } + } + + return value; +}; + +const SelectWidget = ({ + schema, + id, + options, + label, + required, + disabled, + readonly, + value, + multiple, + autofocus, + onChange, + onBlur, + onFocus, + placeholder, + rawErrors = [], +}) => { + const { enumOptions, enumDisabled } = options; + + const emptyValue = multiple ? [] : ""; + + const translator = useTranslator(); + + function getValue( + event, + multiple + ) { + if (multiple) { + return [].slice + .call(event.target.options) + .filter((o) => o.selected) + .map((o) => o.value); + } else { + return event.target.value; + } + } + + const [touched, setTouched] = React.useState(false); + + return ( + + 0 ? "text-danger" : ""}`}> + + + {(label || schema.title) && required ? : null} + + {schema.description && } + + 0 ? "is-invalid" : ""} + onBlur={ + onBlur && + ((event) => { + const newValue = getValue(event, multiple); + onBlur(id, processValue(schema, newValue)); + setTouched(true); + }) + } + onFocus={ + onFocus && + ((event) => { + const newValue = getValue(event, multiple); + onFocus(id, processValue(schema, newValue)); + }) + } + onChange={(event) => { + const newValue = getValue(event, multiple); + onChange(processValue(schema, newValue)); + }}> + {!multiple && schema.default === undefined && ( + + )} + {(enumOptions).map(({ value, label }, i) => + + )} + + {rawErrors.length > 0 && touched && ( + + {rawErrors.map((error, i) => { + return ( + 0 ? 'sr-only' : ''}`}> + + {error} + + + ); + })} + + )} + + ); +}; + +export default SelectWidget; \ No newline at end of file diff --git a/ui/src/app/form/component/widgets/TextWidget.js b/ui/src/app/form/component/widgets/TextWidget.js new file mode 100644 index 000000000..08343905f --- /dev/null +++ b/ui/src/app/form/component/widgets/TextWidget.js @@ -0,0 +1,93 @@ +import React from "react"; +import { faAsterisk } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; + +import ListGroup from "react-bootstrap/ListGroup"; +import Form from "react-bootstrap/Form"; + +import Translate from "../../../i18n/components/translate"; +import { InfoIcon } from "../InfoIcon"; + +const TextWidget = ({ + id, + placeholder, + required, + readonly, + disabled, + type, + label, + value, + onChange, + onBlur, + onFocus, + autofocus, + options, + schema, + rawErrors = [], + ...props +}) => { + const _onChange = ({target: { value }}) => onChange(value === "" ? options.emptyValue : value); + const _onBlur = ({ target: { value } }) => onBlur(id, value); + const _onFocus = ({target: { value }} ) => onFocus(id, value); + const inputType = (type || schema.type) === 'string' ? 'text' : `${type || schema.type}`; + + const [touched, setTouched] = React.useState(false); + + const onCustomBlur = (evt) => { + setTouched(true); + _onBlur(evt); + }; + + // const classNames = [rawErrors.length > 0 ? "is-invalid" : "", type === 'file' ? 'custom-file-label': ""] + return ( + + 0 && touched ? "text-danger" : ""}`}> + + + {(label || schema.title) && required ? + : null} + + {schema.description && } + + 0 && touched ? "is-invalid" : ""} + list={schema.examples ? `examples_${id}` : undefined} + type={inputType} + value={value || value === 0 ? value : ""} + onChange={_onChange} + onBlur={onCustomBlur} + onFocus={_onFocus} + /> + {schema.examples ? ( + + {(schema.examples) + .concat(schema.default ? ([schema.default]) : []) + .map((example) => { + return + ) : null} + {rawErrors.length > 0 && touched && ( + + {rawErrors.map((error, i) => { + return ( + 0 ? 'sr-only' : ''}`}> + + {error} + + + ); + })} + + )} + + ); +}; + +export default TextWidget; \ No newline at end of file diff --git a/ui/src/app/form/component/widgets/TextareaWidget.js b/ui/src/app/form/component/widgets/TextareaWidget.js new file mode 100644 index 000000000..9afdace93 --- /dev/null +++ b/ui/src/app/form/component/widgets/TextareaWidget.js @@ -0,0 +1,89 @@ +import React from "react"; +import { faAsterisk } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; + +import ListGroup from "react-bootstrap/ListGroup"; +import Form from "react-bootstrap/Form"; +import FormControl from "react-bootstrap/FormControl"; +import InputGroup from "react-bootstrap/InputGroup"; + +import Translate from "../../../i18n/components/translate"; +import { InfoIcon } from "../InfoIcon"; + +const TextareaWidget = ({ + id, + placeholder, + value, + required, + disabled, + autofocus, + label, + readonly, + onBlur, + onFocus, + onChange, + options, + schema, + rawErrors = [], +}) => { + const _onChange = ({ + target: { value }, + }) => + onChange(value === "" ? options.emptyValue : value); + const _onBlur = ({ + target: { value }, + }) => onBlur(id, value); + const _onFocus = ({ + target: { value }, + }) => onFocus(id, value); + + const [touched, setTouched] = React.useState(false); + + const onCustomBlur = (evt) => { + setTouched(true); + _onBlur(evt); + }; + + return ( + <> + 0 ? "text-danger" : ""}`}> + + + {(label || schema.title) && required ? : null} + + {schema.description && } + + + + + {rawErrors.length > 0 && touched && ( + + {rawErrors.map((error, i) => { + return ( + 0 ? 'sr-only' : ''}`}> + + {error} + + + ); + })} + + )} + + ); +}; + +export default TextareaWidget; \ No newline at end of file diff --git a/ui/src/app/form/component/widgets/UpDownWidget.js b/ui/src/app/form/component/widgets/UpDownWidget.js new file mode 100644 index 000000000..4394a070f --- /dev/null +++ b/ui/src/app/form/component/widgets/UpDownWidget.js @@ -0,0 +1,86 @@ +import React from "react"; + +import { faAsterisk } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; + +import ListGroup from "react-bootstrap/ListGroup"; +import Form from "react-bootstrap/Form"; + +import Translate from "../../../i18n/components/translate"; +import { useTranslator } from "../../../i18n/hooks"; +import { InfoIcon } from "../InfoIcon"; + +const UpDownWidget = ({ + id, + required, + readonly, + disabled, + label, + value, + onChange, + onBlur, + onFocus, + autofocus, + schema, + uiSchema, + rawErrors = [] +}) => { + const _onChange = ({ + target: { value }, + }) => onChange(value); + const _onBlur = ({ target: { value } }) => + onBlur(id, value); + const _onFocus = ({ + target: { value }, + }) => onFocus(id, value); + + const translator = useTranslator(); + + const [touched, setTouched] = React.useState(false); + + const onCustomBlur = (evt) => { + setTouched(true); + _onBlur(evt); + }; + + return ( + + + + + {(label || schema.title) && required ? : null} + + {schema.description && } + + + {rawErrors.length > 0 && touched && ( + + {rawErrors.map((error, i) => { + return ( + 0 ? 'sr-only' : ''}`}> + + {error} + + + ); + })} + + )} + + ); +}; + +export default UpDownWidget; \ No newline at end of file diff --git a/ui/src/app/i18n/action/message.action.ts b/ui/src/app/i18n/action/message.action.ts deleted file mode 100644 index 4949f7357..000000000 --- a/ui/src/app/i18n/action/message.action.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { Action } from '@ngrx/store'; - -export enum MessagesActionTypes { - MESSAGES_LOAD_REQUEST = '[Messages] Load REQUEST', - MESSAGES_LOAD_SUCCESS = '[Messages] Load SUCCESS', - MESSAGES_LOAD_ERROR = '[Messages] Load ERROR', - - SET_LOCALE = '[Messages] Set Locale' -} - -export class MessagesLoadRequestAction implements Action { - readonly type = MessagesActionTypes.MESSAGES_LOAD_REQUEST; - - constructor() { } -} - -export class MessagesLoadSuccessAction implements Action { - readonly type = MessagesActionTypes.MESSAGES_LOAD_SUCCESS; - - constructor(public payload: any) { } -} - -export class MessagesLoadErrorAction implements Action { - readonly type = MessagesActionTypes.MESSAGES_LOAD_ERROR; - - constructor(public payload: { message: string }) { } -} - -export class SetLocale implements Action { - readonly type = MessagesActionTypes.SET_LOCALE; - - constructor(public payload: string) {} -} - -export type Actions = - | MessagesLoadRequestAction - | MessagesLoadSuccessAction - | MessagesLoadErrorAction - | SetLocale; diff --git a/ui/src/app/i18n/component/i18n-text.component.html b/ui/src/app/i18n/component/i18n-text.component.html deleted file mode 100644 index 8f888138f..000000000 --- a/ui/src/app/i18n/component/i18n-text.component.html +++ /dev/null @@ -1,69 +0,0 @@ - - {{ key }} - User Interface / MDUI Information - SP SSO Descriptor Information - Logout Endpoints - Security Information - Assertion Consumer Service - Relying Party Overrides - Attribute Release - SP/Organization Information - Organization Information - Finished! - - Signing - Encryption - Both - - SP SSO Descriptor Information - Organization Information - User Interface / MDUI Information - Security Descriptor Information - - Entity ID - Service Provider Name - Organization - Contacts - MDUI Information - Security Information - Assertion Consumer Services - Service Provider Sso Descriptor - Logout Endpoints - Service Enabled - Relying Party Overrides - Attribute Release - Filter Name - Filter Enabled - FilterTarget - Name - Type - Value - Email Address - URL - Binding Type - Display Name - Information URL - Privacy Statement URL - Logo URL - Logo Height - Logo Width - Description - Sign Assertions - Don't Sign Response - Turn off encryption - Use Sha - Ignore Authentication Method - Omit Not Before - Responder ID - Name ID Formats - Authentication Methods - x509 Certificate Available - Authentication Requests Signed - Want Assertions Signed - x509 Certificates - Protocol Support Enumeration - Name ID Formats - Binding - Location URL - Make Default - diff --git a/ui/src/app/i18n/component/i18n-text.component.spec.ts b/ui/src/app/i18n/component/i18n-text.component.spec.ts deleted file mode 100644 index ae84d3e17..000000000 --- a/ui/src/app/i18n/component/i18n-text.component.spec.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { I18nService } from '../service/i18n.service'; -import { CommonModule } from '@angular/common'; -import { StoreModule, combineReducers, Store } from '@ngrx/store'; - -import * as fromI18n from '../reducer'; -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { Component } from '@angular/core'; -import { MessagesLoadSuccessAction } from '../action/message.action'; -import { I18nTextComponent } from './i18n-text.component'; -import { MockI18nService } from '../../../testing/i18n.stub'; - -@Component({ - template: ` - Word - ` -}) -class TestHostComponent { - private _foo: string; - - public get foo(): string { - return this._foo; - } - - public set foo(val: string) { - this._foo = val; - } -} - -describe('Component: I18n text translation', () => { - let fixture: ComponentFixture; - let instance: TestHostComponent; - let store: Store; - let service: I18nService; - - const msg = { - 'metadata-ui': 'User Interface / MDUI Information', - bar: 'bar', - baz: 'baz' - }; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - { provide: I18nService, useClass: MockI18nService } - ], - imports: [ - CommonModule, - StoreModule.forRoot({ - 'i18n': combineReducers(fromI18n.reducers), - }) - ], - declarations: [ - I18nTextComponent, - TestHostComponent - ], - }); - store = TestBed.get(Store); - service = TestBed.get(I18nService); - - spyOn(store, 'dispatch').and.callThrough(); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - }); - - it('should set the correct text', () => { - instance.foo = 'metadata-ui'; - spyOn(service, 'translate').and.returnValue('foo'); - store.dispatch(new MessagesLoadSuccessAction(msg)); - - store.select(fromI18n.getMessages).subscribe(() => { - fixture.detectChanges(); - expect(fixture.nativeElement.textContent).toContain(msg['metadata-ui']); - }); - }); -}); diff --git a/ui/src/app/i18n/component/i18n-text.component.ts b/ui/src/app/i18n/component/i18n-text.component.ts deleted file mode 100644 index b75f1c9eb..000000000 --- a/ui/src/app/i18n/component/i18n-text.component.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Component, Input } from '@angular/core'; - -@Component({ - selector: 'i18n-text', - templateUrl: './i18n-text.component.html' -}) -export class I18nTextComponent { - @Input() key: string; - - constructor() { } -} diff --git a/ui/src/app/i18n/component/translate.component.spec.ts b/ui/src/app/i18n/component/translate.component.spec.ts deleted file mode 100644 index e28e232ac..000000000 --- a/ui/src/app/i18n/component/translate.component.spec.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { I18nService } from '../service/i18n.service'; -import { CommonModule } from '@angular/common'; -import { StoreModule, combineReducers, Store } from '@ngrx/store'; - -import * as fromI18n from '../reducer'; -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { Component } from '@angular/core'; -import { MessagesLoadSuccessAction } from '../action/message.action'; -import { TranslateComponent } from './translate.component'; -import { MockI18nService, MockI18nModule } from '../../../testing/i18n.stub'; - -@Component({ - template: ` - Word - ` -}) -class TestHostComponent { - private _foo: string; - - public get foo(): string { - return this._foo; - } - - public set foo(val: string) { - this._foo = val; - } -} - -describe('Component: I18n translation', () => { - let fixture: ComponentFixture; - let instance: TestHostComponent; - let store: Store; - let service: I18nService; - - const msg = { - foo: 'foo', - bar: 'bar', - baz: 'baz' - }; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - { provide: I18nService, useClass: MockI18nService } - ], - imports: [ - CommonModule, - StoreModule.forRoot({ - 'i18n': combineReducers(fromI18n.reducers), - }) - ], - declarations: [ - TranslateComponent, - TestHostComponent - ], - }); - store = TestBed.get(Store); - service = TestBed.get(I18nService); - - spyOn(store, 'dispatch').and.callThrough(); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - }); - - it('should set the correct text', () => { - spyOn(service, 'translate').and.returnValue('foo'); - store.dispatch(new MessagesLoadSuccessAction(msg)); - - store.select(fromI18n.getMessages).subscribe(() => { - fixture.detectChanges(); - expect(fixture.nativeElement.textContent).toContain(msg.foo); - }); - }); -}); diff --git a/ui/src/app/i18n/component/translate.component.ts b/ui/src/app/i18n/component/translate.component.ts deleted file mode 100644 index 88343d51f..000000000 --- a/ui/src/app/i18n/component/translate.component.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { - Component, - Input, - OnDestroy -} from '@angular/core'; -import { Subscription } from 'rxjs'; -import { I18nService } from '../service/i18n.service'; -import * as fromI18n from '../reducer'; -import { Store } from '@ngrx/store'; -import { Messages } from '../model/Messages'; - -/*tslint:disable:component-selector */ - -@Component({ - selector: 'translate-i18n', - template: ` - - - {{ translated }} - - ` -}) -export class TranslateComponent implements OnDestroy { - private _key: string; - lastParams: any; - currentParams: any; - messages: Messages = {}; - sub: Subscription; - default: string; - translated: string; - - @Input() set key(key: string) { - if (key) { - this.default = this.default || this._key; - this._key = key; - this.update(); - } - } - - @Input() set params(params: any) { - this.currentParams = params || {}; - this.update(); - } - - constructor( - private service: I18nService, - private store: Store - ) { - this.sub = this.store.select(fromI18n.getMessages).subscribe(m => { - if (m && Object.keys(m).length) { - this.messages = m; - this.update(); - } - }); - } - - update(): void { - this.translated = this.service.translate(this._key, this.currentParams, this.messages); - } - - ngOnDestroy() { - if (this.sub) { - this.sub.unsubscribe(); - } - } -} diff --git a/ui/src/app/i18n/components/translate.js b/ui/src/app/i18n/components/translate.js new file mode 100644 index 000000000..909cc2d74 --- /dev/null +++ b/ui/src/app/i18n/components/translate.js @@ -0,0 +1,16 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +import { useTranslation } from '../hooks'; + +export function Translate ({ value, params = {} }) { + const translated = useTranslation(value, params); + return (<>{translated || value}) +} + +Translate.propTypes = { + key: PropTypes.string, + params: PropTypes.object +}; + +export default Translate; \ No newline at end of file diff --git a/ui/src/app/i18n/context/I18n.provider.js b/ui/src/app/i18n/context/I18n.provider.js new file mode 100644 index 000000000..42c33e921 --- /dev/null +++ b/ui/src/app/i18n/context/I18n.provider.js @@ -0,0 +1,34 @@ +import React from "react"; +import useFetch from 'use-http'; +import API_BASE_PATH from '../../App.constant'; + +const I18nContext = React.createContext(); + +const { Provider, Consumer } = I18nContext; + +const path = '/messages'; + +/*eslint-disable react-hooks/exhaustive-deps*/ +function I18nProvider ({ children }) { + + const { get, response } = useFetch(`${API_BASE_PATH}`, { + cacheLife: 10000, + cachePolicy: 'cache-first' + }); + + React.useEffect(() => { loadMessages() }, []); + + async function loadMessages() { + const msgs = await get(`${path}`); + if (response.ok) setMessages(msgs); + } + + const [messages, setMessages] = React.useState({}); + return ( + <> + {Object.keys(messages).length > 1 && {children}} + + ); +} + +export { I18nContext, I18nProvider, Consumer as I18nConsumer }; \ No newline at end of file diff --git a/ui/src/app/i18n/effect/message.effect.spec.ts b/ui/src/app/i18n/effect/message.effect.spec.ts deleted file mode 100644 index 5f03b662c..000000000 --- a/ui/src/app/i18n/effect/message.effect.spec.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { TestBed } from '@angular/core/testing'; -import { provideMockActions } from '@ngrx/effects/testing'; -import { ReplaySubject } from 'rxjs'; - -import { MessageEffects } from './message.effect'; - -import { Subject, of, throwError } from 'rxjs'; -import { MessagesLoadRequestAction, MessagesLoadSuccessAction, MessagesLoadErrorAction } from '../action/message.action'; -import { I18nService } from '../service/i18n.service'; -import { StoreModule, combineReducers, Store } from '@ngrx/store'; -import * as fromI18n from '../reducer'; - -describe('I18n Message Effects', () => { - let effects: MessageEffects; - let actions: Subject; - let i18nService: I18nService; - let store: Store; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - StoreModule.forRoot({ - i18n: combineReducers(fromI18n.reducers, { - messages: { - fetching: false, - messages: null, - error: null, - locale: 'en-US' - } - }) - }), - ], - providers: [ - { - provide: I18nService, - useValue: { - get: (locale: string) => of({}) - } - }, - MessageEffects, - provideMockActions(() => actions), - ], - }); - - effects = TestBed.get(MessageEffects); - i18nService = TestBed.get(I18nService); - store = TestBed.get(Store); - spyOn(store, 'dispatch'); - }); - - it('should fire a success action', () => { - let msgs = {}; - spyOn(i18nService, 'get').and.returnValue(of(msgs)); - spyOn(store, 'select').and.returnValue(of('en_US')); - actions = new ReplaySubject(1); - - actions.next(new MessagesLoadRequestAction()); - - effects.loadMessages$.subscribe(result => { - expect(result).toEqual(new MessagesLoadSuccessAction(msgs)); - }); - }); - - it('should fire an error action', () => { - let err = new Error('404'); - spyOn(i18nService, 'get').and.returnValue(throwError(err)); - spyOn(store, 'select').and.returnValue(of('en_US')); - actions = new ReplaySubject(1); - - actions.next(new MessagesLoadRequestAction()); - - effects.loadMessages$.subscribe(result => { - expect(result).toEqual(new MessagesLoadErrorAction(err)); - }); - }); -}); diff --git a/ui/src/app/i18n/effect/message.effect.ts b/ui/src/app/i18n/effect/message.effect.ts deleted file mode 100644 index af34c50b6..000000000 --- a/ui/src/app/i18n/effect/message.effect.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; - -import { of } from 'rxjs'; -import { map, catchError, switchMap, withLatestFrom } from 'rxjs/operators'; - -import { - MessagesActionTypes, - MessagesLoadErrorAction, - MessagesLoadRequestAction, - MessagesLoadSuccessAction, - SetLocale -} from '../action/message.action'; -import { I18nService } from '../service/i18n.service'; -import * as fromCore from '../reducer'; -import { Store } from '@ngrx/store'; - -// The tests for this succeed but a Jasmine error is thrown in afterAll -// TODO: Research afterAll error in Jasmine - /* istanbul ignore next */ -@Injectable() -export class MessageEffects { - - @Effect() - loadMessages$ = this.actions$.pipe( - ofType(MessagesActionTypes.MESSAGES_LOAD_REQUEST), - withLatestFrom( - this.store.select(fromCore.getLocale) - ), - map(([action, locale]) => locale.replace('-', '_')), - switchMap(locale => { - return this.i18nService.get(locale) - .pipe( - map(u => new MessagesLoadSuccessAction({ ...u })), - catchError(error => of(new MessagesLoadErrorAction(error))) - ); - }) - ); - @Effect() - setLanguage$ = this.actions$.pipe( - ofType(MessagesActionTypes.SET_LOCALE), - map(action => action.payload), - map(language => new MessagesLoadRequestAction()) - ); - - constructor( - private i18nService: I18nService, - private actions$: Actions, - private store: Store - ) { } -} diff --git a/ui/src/app/i18n/hooks.js b/ui/src/app/i18n/hooks.js new file mode 100644 index 000000000..1d447c687 --- /dev/null +++ b/ui/src/app/i18n/hooks.js @@ -0,0 +1,28 @@ +import { useContext } from 'react'; +import { I18nContext } from './context/I18n.provider'; + +export function translate(value, interpolated) { + return Object.entries(interpolated).reduce((current, interpolate) => { + let reg = new RegExp(`{\\s*${interpolate[0]}\\s*}`, 'gm'); + return current.replace(reg, interpolate[1]); + }, value); +} + +export function getMessage(value, messages) { + return messages.hasOwnProperty(value) ? messages[value] : (Object.keys(messages).length ? value : ''); +} + +export function useTranslation (value, interpolated = {}) { + const messages = useContext(I18nContext); + const val = getMessage(value, messages); + return useInterpolatedTranslation(val, interpolated); +} + +export function useTranslator() { + const messages = useContext(I18nContext); + return (value, interpolated = {}) => translate(getMessage(value, messages), interpolated); +} + +export function useInterpolatedTranslation(value, interpolated) { + return translate(value, interpolated); +} \ No newline at end of file diff --git a/ui/src/app/i18n/hooks.test.js b/ui/src/app/i18n/hooks.test.js new file mode 100644 index 000000000..23f41c145 --- /dev/null +++ b/ui/src/app/i18n/hooks.test.js @@ -0,0 +1,71 @@ +import React from 'react'; + +import { translate, getMessage, useTranslation, useTranslator } from './hooks'; + +const msgs = { foo: 'bar { baz }' }; + +describe('getMessage', () => { + it('should return the expected message based on the key', () => { + expect(getMessage('foo', msgs)).toEqual('bar { baz }'); + }); +}) + +describe('translate', () => { + it('should translate the provided message', () => { + const msg = getMessage('foo', msgs); + expect(translate(msg, { baz: 'baz' })).toEqual('bar baz'); + }); + + it('should return provided value if no interpolation strings are passed', () => { + expect(translate('foo', {})).toEqual('foo'); + }); + + it('should return an empty string if messages are empty', () => { + expect(getMessage('foo', {})).toEqual(''); + }); +}); + +describe('useTranslation hook', () => { + let realUseContext; + let useContextMock; + beforeEach(() => { + realUseContext = React.useContext; + useContextMock = React.useContext = jest.fn(); + }); + // Cleanup mock + afterEach(() => { + React.useContext = realUseContext; + }); + + test("mock hook", () => { + useContextMock.mockReturnValue(msgs); + + expect(useTranslation('foo', { baz: 'baz' })).toBe('bar baz'); + }); + //jest.mock('useContext') + + it('should translate the provided message', () => { + const msg = getMessage('foo', { foo: 'bar { baz }' }); + expect(translate(msg, { baz: 'baz' })).toEqual('bar baz'); + }); +}); + +describe('useTranslator hook', () => { + let realUseContext; + let useContextMock; + beforeEach(() => { + realUseContext = React.useContext; + useContextMock = React.useContext = jest.fn(); + }); + // Cleanup mock + afterEach(() => { + React.useContext = realUseContext; + }); + + test("mock hook", () => { + useContextMock.mockReturnValue(msgs); + const translator = useTranslator(); + + expect(translator('foo', { baz: 'baz' })).toBe('bar baz'); + }); +}); \ No newline at end of file diff --git a/ui/src/app/i18n/i18n.module.spec.ts b/ui/src/app/i18n/i18n.module.spec.ts deleted file mode 100644 index 5306929cb..000000000 --- a/ui/src/app/i18n/i18n.module.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { TestBed } from '@angular/core/testing'; -import { StoreModule } from '@ngrx/store'; -import { EffectsModule } from '@ngrx/effects'; -import { I18nModule } from './i18n.module'; -import { I18nService } from './service/i18n.service'; -import { HttpClientModule } from '@angular/common/http'; -import { CoreModule } from '../core/core.module'; - -describe('I18n Module', () => { - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - StoreModule.forRoot({}), - EffectsModule.forRoot([]), - I18nModule.forRoot(), - HttpClientModule, - CoreModule.forRoot() - ] - }); - }); - - it('should compile', () => { - expect(TestBed.get(I18nService)).toBeDefined(); - }); -}); diff --git a/ui/src/app/i18n/i18n.module.ts b/ui/src/app/i18n/i18n.module.ts deleted file mode 100644 index 56fa2895b..000000000 --- a/ui/src/app/i18n/i18n.module.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { NgModule, ModuleWithProviders } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { StoreModule } from '@ngrx/store'; -import { EffectsModule } from '@ngrx/effects'; - -import { reducers } from './reducer'; -import { HttpClientModule } from '@angular/common/http'; -import { I18nService } from './service/i18n.service'; -import { MessageEffects } from './effect/message.effect'; -import { TranslatePipe } from './pipe/i18n.pipe'; -import { CoreModule } from '../core/core.module'; -import { TranslateComponent } from './component/translate.component'; -import { I18nTextComponent } from './component/i18n-text.component'; - -export const COMPONENTS = [ - TranslateComponent, - I18nTextComponent -]; -export const DIRECTIVES = []; -export const PIPES = [ - TranslatePipe -]; - -@NgModule({ - imports: [ - CommonModule, - HttpClientModule, - CoreModule - ], - declarations: [ - ...PIPES, - ...COMPONENTS, - ...DIRECTIVES - ], - exports: [ - ...PIPES, - ...COMPONENTS, - ...DIRECTIVES - ], -}) -export class I18nModule { - static forRoot(): ModuleWithProviders { - return { - ngModule: RootI18nModule, - providers: [ - I18nService - ] - }; -} -} - -@NgModule({ - imports: [ - StoreModule.forFeature('i18n', reducers), - EffectsModule.forFeature([MessageEffects]), - ], -}) -export class RootI18nModule { } diff --git a/ui/src/app/i18n/model/Messages.ts b/ui/src/app/i18n/model/Messages.ts deleted file mode 100644 index e561dccbd..000000000 --- a/ui/src/app/i18n/model/Messages.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface Messages { - [key: string]: string; -} diff --git a/ui/src/app/i18n/pipe/i18n.pipe.spec.ts b/ui/src/app/i18n/pipe/i18n.pipe.spec.ts deleted file mode 100644 index b1fbc9cb9..000000000 --- a/ui/src/app/i18n/pipe/i18n.pipe.spec.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { TranslatePipe } from './i18n.pipe'; -import { I18nService } from '../service/i18n.service'; -import { CommonModule } from '@angular/common'; -import { StoreModule, combineReducers, Store } from '@ngrx/store'; - -import * as fromI18n from '../reducer'; -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { Component } from '@angular/core'; -import { MessagesLoadSuccessAction } from '../action/message.action'; -import { MockI18nService, MockI18nModule } from '../../../testing/i18n.stub'; - -@Component({ - template: ` - {{ foo | translate }} - ` -}) -class TestHostComponent { - private _foo: string; - - public get foo(): string { - return this._foo; - } - - public set foo(val: string) { - this._foo = val; - } -} - -describe('Pipe: I18n translation', () => { - let fixture: ComponentFixture; - let instance: TestHostComponent; - let store: Store; - let service: I18nService; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - { provide: I18nService, useClass: MockI18nService } - ], - imports: [ - CommonModule, - StoreModule.forRoot({ - 'i18n': combineReducers(fromI18n.reducers), - }) - ], - declarations: [ - TranslatePipe, - TestHostComponent - ], - }); - store = TestBed.get(Store); - service = TestBed.get(I18nService); - - spyOn(store, 'dispatch').and.callThrough(); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - }); - - it('should set the correct text', () => { - spyOn(service, 'translate').and.returnValue('hi there'); - store.dispatch(new MessagesLoadSuccessAction({ foo: 'hi there' })); - - store.select(fromI18n.getMessages).subscribe(() => { - fixture.detectChanges(); - expect(fixture.nativeElement.textContent).toContain('hi there'); - }); - }); -}); diff --git a/ui/src/app/i18n/pipe/i18n.pipe.ts b/ui/src/app/i18n/pipe/i18n.pipe.ts deleted file mode 100644 index 374f146f1..000000000 --- a/ui/src/app/i18n/pipe/i18n.pipe.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { PipeTransform, Pipe, ChangeDetectorRef, OnDestroy } from '@angular/core'; -import { Store } from '@ngrx/store'; -import * as fromI18n from '../reducer'; -import { Subscription } from 'rxjs'; -import { I18nService } from '../service/i18n.service'; - -@Pipe({ - name: 'translate', - pure: false -}) -export class TranslatePipe implements PipeTransform, OnDestroy { - - sub: Subscription; - - messages: { [propName: string]: string } = {}; - - constructor( - private store: Store, - private i18nService: I18nService, - private _ref: ChangeDetectorRef - ) { - this.sub = this.store.select(fromI18n.getMessages).subscribe(messages => { - this.messages = messages ? messages : {}; - this._ref.markForCheck(); - }); - } - - transform(value: string, interpolated: { [prop: string]: string } = {}): any { - return this.i18nService.translate(value, interpolated, this.messages); - } - - ngOnDestroy(): void { - this.sub.unsubscribe(); - } -} diff --git a/ui/src/app/i18n/reducer/index.ts b/ui/src/app/i18n/reducer/index.ts deleted file mode 100644 index d8474cd18..000000000 --- a/ui/src/app/i18n/reducer/index.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { - createSelector, - createFeatureSelector -} from '@ngrx/store'; - -import * as fromMessages from './message.reducer'; -import * as fromRoot from '../../app.reducer'; -import { getCurrentLanguage } from '../../shared/util'; - -export interface I18nState { - messages: fromMessages.MessageState; -} - -export interface State extends fromRoot.State { - core: I18nState; -} - -export const reducers = { - messages: fromMessages.reducer -}; - -export const getCoreFeature = createFeatureSelector('i18n'); -export const getMessageStateFn = (state: I18nState) => state.messages; - -export const getMessageState = createSelector(getCoreFeature, getMessageStateFn); -export const getLocale = createSelector(getMessageState, fromMessages.getLocale); -export const getLanguage = createSelector(getLocale, locale => getCurrentLanguage(locale)); - -export const getMessages = createSelector(getMessageState, fromMessages.getMessages); -export const getFetchingMessages = createSelector(getMessageState, fromMessages.isFetching); diff --git a/ui/src/app/i18n/reducer/message.reducer.ts b/ui/src/app/i18n/reducer/message.reducer.ts deleted file mode 100644 index d4debe3a1..000000000 --- a/ui/src/app/i18n/reducer/message.reducer.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { - MessagesActionTypes, - Actions, - -} from '../action/message.action'; - -export interface MessageState { - fetching: boolean; - messages: any; - error: any; - locale: string; -} - -export const initialState: MessageState = { - fetching: false, - messages: {}, - error: null, - locale: null -}; - -export function reducer(state = initialState, action: Actions): MessageState { - switch (action.type) { - case MessagesActionTypes.MESSAGES_LOAD_REQUEST: { - return { - ...state, - fetching: true - }; - } - case MessagesActionTypes.MESSAGES_LOAD_SUCCESS: { - return { - ...state, - fetching: false, - messages: action.payload - }; - } - case MessagesActionTypes.MESSAGES_LOAD_ERROR: { - return { - ...state, - fetching: false, - messages: null, - error: action.payload - }; - } - case MessagesActionTypes.SET_LOCALE: { - return { - ...state, - locale: action.payload - }; - } - default: { - return state; - } - } -} - - -export const getMessages = (state: MessageState) => state.messages; -export const getLocale = (state: MessageState) => state.locale; -export const getError = (state: MessageState) => state.error; -export const isFetching = (state: MessageState) => state.fetching; diff --git a/ui/src/app/i18n/service/i18n.service.spec.ts b/ui/src/app/i18n/service/i18n.service.spec.ts deleted file mode 100644 index e8059fe80..000000000 --- a/ui/src/app/i18n/service/i18n.service.spec.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { TestBed, inject, waitForAsync } from '@angular/core/testing'; -import { I18nService } from './i18n.service'; -import { HttpClientModule, HttpRequest } from '@angular/common/http'; -import { NavigatorService } from '../../core/service/navigator.service'; -import { HttpTestingController, HttpClientTestingModule } from '@angular/common/http/testing'; - -describe('i18n Service', () => { - let service: I18nService; - let nav: NavigatorService; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - HttpClientModule, - HttpClientTestingModule - ], - providers: [ - { - provide: NavigatorService, - useValue: { - native: { - language: 'en-US', - languages: ['en-US', 'zh-CN', 'ja-JP'] - } - } - }, - I18nService - ] - }); - service = TestBed.get(I18nService); - nav = TestBed.get(NavigatorService); - }); - - it('should instantiate', () => { - expect(service).toBeDefined(); - }); - - describe('get method', () => { - it(`should send an expected GET request`, waitForAsync(inject([I18nService, HttpTestingController], - (i18n: I18nService, backend: HttpTestingController) => { - const lang = 'en'; - i18n.get(lang).subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `${service.base}${service.path}` - && req.method === 'GET' - && req.params.get('lang') === lang; - }, `GET attributes by term`); - } - ))); - }); - - describe('getCurrentLanguage method', () => { - it('should return the current language', () => { - expect(service.getCurrentLanguage()).toEqual('en'); - }); - }); - - describe('getCurrentLocale method', () => { - it('should return the current language', () => { - expect(service.getCurrentLocale()).toEqual('en-US'); - }); - }); - - describe('translate method', () => { - it('should translate the provided message', () => { - expect(service.translate('foo', { baz: 'baz' }, { foo: 'bar { baz }' })).toEqual('bar baz'); - }); - - it('should accept provided messages to check', () => { - expect(service.translate('foo', null, { baz: 'bar { baz }' })).toEqual('foo'); - expect(service.translate('foo', null, {})).toEqual(''); - }); - }); - - describe('interpolate method', () => { - it('should return provided value if no interpolation strings are passed', () => { - expect(service.interpolate('foo')).toEqual('foo'); - }); - }); -}); diff --git a/ui/src/app/i18n/service/i18n.service.ts b/ui/src/app/i18n/service/i18n.service.ts deleted file mode 100644 index 26f0ba4ff..000000000 --- a/ui/src/app/i18n/service/i18n.service.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; -import { HttpClient, HttpParams } from '@angular/common/http'; -import { NavigatorService } from '../../core/service/navigator.service'; -import { getCurrentLanguage, getCurrentLocale } from '../../shared/util'; -import { Messages } from '../model/Messages'; -import API_BASE_PATH from '../../app.constant'; - -@Injectable() -export class I18nService { - - readonly path = '/messages'; - readonly base = API_BASE_PATH; - - constructor( - private http: HttpClient, - private navigator: NavigatorService - ) {} - - get(locale: string): Observable { - let params: HttpParams = new HttpParams(); - params = params.set('lang', locale); - return this.http.get(`${ this.base }${this.path}`, { - params - }); - } - - getCurrentLanguage(): string { - return getCurrentLanguage(this.navigator.native); - } - - getCurrentLocale(): string { - return getCurrentLocale(this.navigator.native); - } - - translate(value: string, interpolated: any, messages: Messages): string { - interpolated = interpolated || {}; - let val = messages.hasOwnProperty(value) ? messages[value] : (Object.keys(messages).length ? value : ''); - return this.interpolate(val, interpolated); - } - - interpolate(value: string, interpolated: { [prop: string]: string } = {}): string { - return Object.entries(interpolated).reduce((current, interpolate) => { - let reg = new RegExp(`{\\s*${interpolate[0]}\\s*}`, 'gm'); - return current.replace(reg, interpolate[1]); - }, value); - } -} diff --git a/ui/src/app/metadata/Attribute.js b/ui/src/app/metadata/Attribute.js new file mode 100644 index 000000000..c8d2aa502 --- /dev/null +++ b/ui/src/app/metadata/Attribute.js @@ -0,0 +1,30 @@ +import React from 'react'; +import { Switch, Route, useRouteMatch, Redirect } from 'react-router-dom'; +import { MetadataAttributes } from './hoc/MetadataAttributes'; +import { NewAttribute } from './new/NewAttribute'; +import { MetadataAttributeEdit } from './view/MetadataAttributeEdit'; +import { MetadataAttributeList } from './view/MetadataAttributeList'; + +export function Attribute() { + + let { path } = useRouteMatch(); + + return ( + + + + {(entities, onDelete) => + + } + + } /> + + + } /> + + + } /> + + + ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/Filter.js b/ui/src/app/metadata/Filter.js new file mode 100644 index 000000000..fce73f351 --- /dev/null +++ b/ui/src/app/metadata/Filter.js @@ -0,0 +1,36 @@ +import React from 'react'; +import { Switch, Route, useRouteMatch, Redirect } from 'react-router-dom'; +import { MetadataFilterList } from './editor/MetadataFilterList'; +import MetadataFilterSelector from './hoc/MetadataFilterSelector'; +import MetadataSchema from './hoc/MetadataSchema'; +import MetadataSelector from './hoc/MetadataSelector'; +import { NewFilter } from './new/NewFilter'; +import { EditFilter } from './view/EditFilter'; + +export function Filter() { + + const { path } = useRouteMatch(); + + return ( + + + + {(entity) => + + + + } + + } /> + + + } /> + + + + + } /> + + + ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/Metadata.js b/ui/src/app/metadata/Metadata.js new file mode 100644 index 000000000..a9ff0b182 --- /dev/null +++ b/ui/src/app/metadata/Metadata.js @@ -0,0 +1,65 @@ +import React from 'react'; +import { Switch, Route, useRouteMatch, Redirect } from 'react-router-dom'; +import { MetadataOptions } from './view/MetadataOptions'; +import { MetadataDetail } from './component/MetadataDetail'; +import { MetadataHistory } from './view/MetadataHistory'; +import { MetadataSelector } from './hoc/MetadataSelector'; +import { MetadataSchema } from './hoc/MetadataSchema'; +import { MetadataXmlLoader } from './hoc/MetadataXmlLoader'; +import { MetadataXml } from './view/MetadataXml'; +import { MetadataComparison } from './view/MetadataComparison'; +import { MetadataVersion } from './view/MetadataVersion'; +import { MetadataEdit } from './view/MetadataEdit'; +import { MetadataRestore } from './view/MetadataRestore'; + +export function Metadata () { + + let { path } = useRouteMatch(); + + return ( + <> + + {(entity) => + + + + + + + + } /> + + + + + } /> + + + + + } /> + + + + + } /> + + + + + } /> + + + } /> + + + } /> + + + + + } + + + ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/component/DeleteConfirmation.js b/ui/src/app/metadata/component/DeleteConfirmation.js new file mode 100644 index 000000000..a0f2f8c09 --- /dev/null +++ b/ui/src/app/metadata/component/DeleteConfirmation.js @@ -0,0 +1,54 @@ +import React from 'react'; + +import Modal from 'react-bootstrap/Modal'; +import Button from 'react-bootstrap/Button'; + +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons'; +import Translate from '../../i18n/components/translate'; + +export function DeleteConfirmation({ children, body, title }) { + + const [deleting, setDeleting] = React.useState(false); + + const ref = React.useRef(); + + const onConfirmClick = () => { + if (ref.current && typeof ref.current === 'function') { + ref.current(); + } + setDeleting(false); + } + + const onCancelClick = () => { + setDeleting(false); + }; + + const onShow = (callback) => { + ref.current = callback; + setDeleting(true); + }; + + return ( + <> + {children((callback) => onShow(callback))} + onCancelClick()}> + {title && Delete Metadata Source?} + + +

+ You are deleting an entity. This cannot be undone. Continue? +

+
+ + + + +
+ + ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/component/DeleteConfirmation.test.js b/ui/src/app/metadata/component/DeleteConfirmation.test.js new file mode 100644 index 000000000..8aa4a57ee --- /dev/null +++ b/ui/src/app/metadata/component/DeleteConfirmation.test.js @@ -0,0 +1,46 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import { act } from 'react-dom/test-utils'; + +import { DeleteConfirmation } from './DeleteConfirmation'; + +jest.mock('../../i18n/components/translate', () => { + return 'span'; +}) + +const noop = jest.fn(); + +let container; + +beforeEach(() => { + container = document.createElement('div'); + document.body.appendChild(container); +}); + +afterEach(() => { + document.body.removeChild(container); + container = null; +}); + +test('Delete confirmation', () => { + act(() => { + ReactDOM.render( + + {(block) => } + , + container); + }); + + const initiator = container.querySelector('button'); + + act(() => { + initiator.dispatchEvent(new MouseEvent('click', { bubbles: true })); + }); + + let modal = container.querySelector('.modal'); + const confirm = container.querySelector('.btn-danger'); + + expect(modal).toBeDefined(); + expect(confirm).toBeDefined(); + +}); \ No newline at end of file diff --git a/ui/src/app/metadata/component/MetadataConfiguration.js b/ui/src/app/metadata/component/MetadataConfiguration.js new file mode 100644 index 000000000..79acec8c5 --- /dev/null +++ b/ui/src/app/metadata/component/MetadataConfiguration.js @@ -0,0 +1,39 @@ +import React from 'react'; +import FormattedDate from '../../core/components/FormattedDate'; +import Translate from '../../i18n/components/translate'; +import { MetadataSection } from './MetadataSection'; +import { usePropertyWidth } from './properties/hooks'; + +import { ObjectProperty } from './properties/ObjectProperty'; + +export function MetadataConfiguration ({ configuration, onEdit }) { + + const columns = configuration.dates?.length || 1; + const width = usePropertyWidth(columns); + + return ( + <> + { configuration && configuration.sections.map((section, sidx) => + + {section?.properties?.length > 0 && + +
+ Option + {configuration.dates.map((d, didx) => + + {configuration.dates.length <= 1 ? + Value + : + + } + + )} +
+ +
+ } +
+ ) } + + ); +} diff --git a/ui/src/app/metadata/component/MetadataDetail.js b/ui/src/app/metadata/component/MetadataDetail.js new file mode 100644 index 000000000..d685727b8 --- /dev/null +++ b/ui/src/app/metadata/component/MetadataDetail.js @@ -0,0 +1,33 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; +import Translate from '../../i18n/components/translate'; + +import { MetadataObjectContext } from '../hoc/MetadataSelector'; + +export function MetadataDetail ({ children }) { + + const metadata = React.useContext(MetadataObjectContext); + + return ( +
+
+
+ + { children } +
+
+
+ + ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/component/MetadataHeader.js b/ui/src/app/metadata/component/MetadataHeader.js new file mode 100644 index 000000000..d8a2baa85 --- /dev/null +++ b/ui/src/app/metadata/component/MetadataHeader.js @@ -0,0 +1,35 @@ +import React from 'react'; +import FormattedDate from '../../core/components/FormattedDate'; + +import Translate from '../../i18n/components/translate'; + +export function MetadataHeader ({ model, current = true, enabled = true, children, ...props }) { + return ( +
+
+
+
+ Saved:  + + + +
+ By:  + {model.createdBy } +
+ {children} +
+ +

+ + Enabled + +   + + Current + +

+
+
+ ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/component/MetadataSection.js b/ui/src/app/metadata/component/MetadataSection.js new file mode 100644 index 000000000..7925b961c --- /dev/null +++ b/ui/src/app/metadata/component/MetadataSection.js @@ -0,0 +1,46 @@ +import React from 'react'; +import { faEdit } from '@fortawesome/free-solid-svg-icons'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import Button from 'react-bootstrap/Button'; +import Translate from '../../i18n/components/translate'; + +export function MetadataSection ({ section, index = -1, onEdit, children }) { + + + + return ( + <> +
+
+
+

+ {index > -1 && + + {index < 10 && 0} + { index + 1 } + + } + + + + +

+ {onEdit && +
+ +
+ } +
+ {section && section.properties && section.properties.length && +
+ { children } +
+ } +
+
+ + ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/component/MetadataViewToggle.js b/ui/src/app/metadata/component/MetadataViewToggle.js new file mode 100644 index 000000000..59975b9fb --- /dev/null +++ b/ui/src/app/metadata/component/MetadataViewToggle.js @@ -0,0 +1,26 @@ +import React from 'react'; +import { NavLink } from 'react-router-dom'; + +import {Translate} from '../../i18n/components/translate'; +import { MetadataXmlContext } from '../hoc/MetadataXmlLoader'; + +export function MetadataViewToggle () { + const xml = React.useContext(MetadataXmlContext); + + return ( + <> + {xml ? +
+ + Toggle view: + Options + + + Toggle view: + XML + +
+ : ''} + + ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/component/properties/ArrayProperty.js b/ui/src/app/metadata/component/properties/ArrayProperty.js new file mode 100644 index 000000000..8c5f08c44 --- /dev/null +++ b/ui/src/app/metadata/component/properties/ArrayProperty.js @@ -0,0 +1,115 @@ +import React from 'react'; +import { faEye } from '@fortawesome/free-solid-svg-icons'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import Button from 'react-bootstrap/Button'; + +import Translate from '../../../i18n/components/translate'; +import { usePropertyWidth } from './hooks'; +import { PropertyValue } from './PropertyValue'; +import { FilterTargetPreview } from '../../hoc/FilterTargetPreview'; + +export function ArrayProperty ({ property, columns, preview }) { + + const width = usePropertyWidth(columns); + + const [keys, setKeys] = React.useState(0); + const [range, setRange] = React.useState([]); + const [dataList, setDataList] = React.useState([]); + + React.useEffect(() => { + setKeys(property.value.reduce((val, version) => version ? version.length > val ? version.length : val : val, 0)); + setDataList(property.items?.enum); + }, [property]); + + React.useEffect(() => { + setRange([...Array(keys).keys()]) + }, [keys]); + + return ( + <> + {property?.items?.type === 'object' && +
+
{ property.name }
+ {range.map((i) => +
+ {Object.keys(property.items.properties).map((prop, n) => +
+ {property.differences && Changed: } + {property.items.properties && +
+ {property.items.properties[prop].title} +
+ } + { property.value.map((version, vIdx) => + + {version && version[i] && + + } + {(!version || !version[i]) && +
+ - +
+ } +
+ )} +
+ )} + +
+ )} +
+ } + {property?.items?.type === 'string' && + <> + { property?.items?.enum?.length && property.uniqueItems ? + <> + {dataList.map((item, itemIdx) => +
+ {item.differences && Changed: } + { item.label } + { property.value.map((v, vIdx) => +
+ {v && v.indexOf(item.key) > -1 && true } + {(!v || !(v.indexOf(item.key) > -1)) && false } +
+ )} +
+ )} + + : +
+ {property.differences && Changed: } + { property.name } + {property.value.map((v, vidx) => + + {(!v || !v.length) &&

-

} + {(v && v.length > 0) && +
    + {v.map((item, idx) => +
  • 1 ? '' : 'border-0'}`}> + + {preview && item && + + + {(onPreview) => ( + + )} + +   + + } +
  • + )} +
+ } +
+ )} +
+ } + + } + + ); +} diff --git a/ui/src/app/metadata/component/properties/ArrayValue.js b/ui/src/app/metadata/component/properties/ArrayValue.js new file mode 100644 index 000000000..e21523e52 --- /dev/null +++ b/ui/src/app/metadata/component/properties/ArrayValue.js @@ -0,0 +1,5 @@ +import React from 'react'; + +export function ArrayValue () { + return (<>); +} diff --git a/ui/src/app/metadata/component/properties/FilterTargetProperty.js b/ui/src/app/metadata/component/properties/FilterTargetProperty.js new file mode 100644 index 000000000..d58dacbb6 --- /dev/null +++ b/ui/src/app/metadata/component/properties/FilterTargetProperty.js @@ -0,0 +1,20 @@ +import React from 'react'; +import { ArrayProperty } from './ArrayProperty'; +import { PrimitiveProperty } from './PrimitiveProperty'; + +export function FilterTargetProperty ({ property, columns }) { + + return ( + <> + {property.properties.map((prop, idx) => + + { prop.type === 'array' ? + + : + + } + + )} + + ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/component/properties/ObjectProperty.js b/ui/src/app/metadata/component/properties/ObjectProperty.js new file mode 100644 index 000000000..2afb157ac --- /dev/null +++ b/ui/src/app/metadata/component/properties/ObjectProperty.js @@ -0,0 +1,29 @@ +import React from 'react'; + +import { PrimitiveProperty } from './PrimitiveProperty'; +import { ArrayProperty } from './ArrayProperty'; +import Translate from '../../../i18n/components/translate'; + +export function ObjectProperty ({ property, columns, onPreview }) { + const getProperty = (prop, idx) => { + switch(prop.type) { + case 'array': + return + case 'object': + return + + {prop.name &&
} + +
+
+ default: + return + } + } + + return ( +
+ {property && property.properties.map((prop, pIdx) => getProperty(prop, pIdx))} +
+ ); +} diff --git a/ui/src/app/metadata/component/properties/PrimitiveProperty.js b/ui/src/app/metadata/component/properties/PrimitiveProperty.js new file mode 100644 index 000000000..f86a798b7 --- /dev/null +++ b/ui/src/app/metadata/component/properties/PrimitiveProperty.js @@ -0,0 +1,33 @@ +import React from 'react'; + +import Translate from '../../../i18n/components/translate'; + +import { usePropertyWidth } from './hooks'; +import { PropertyValue } from './PropertyValue'; + +export function PrimitiveProperty ({ property, columns }) { + + const width = usePropertyWidth(columns); + + return ( +
+ {property.differences && Changed: } + {property.name && + <> +
+ + { property.name } + + {property.value.map((v, valIdx) => + + ) } +
+ + + } +
+ ); +} +/**/ \ No newline at end of file diff --git a/ui/src/app/metadata/component/properties/PropertyValue.js b/ui/src/app/metadata/component/properties/PropertyValue.js new file mode 100644 index 000000000..807c86e61 --- /dev/null +++ b/ui/src/app/metadata/component/properties/PropertyValue.js @@ -0,0 +1,29 @@ +import React from 'react'; +import Popover from 'react-bootstrap/Popover'; +import OverlayTrigger from 'react-bootstrap/OverlayTrigger'; + +import { usePropertyWidth } from './hooks'; + +export function PropertyValue ({ name, value, columns, className }) { + + const width = usePropertyWidth(columns); + + return ( + <> + { name && value !== null && value !== undefined ? + + {value.toString()} + + )}> + + {value !== undefined ? value.toString() : (value === false) ? value.toString() : '-'} + + + : -} + + ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/component/properties/hooks.js b/ui/src/app/metadata/component/properties/hooks.js new file mode 100644 index 000000000..fe4f809e6 --- /dev/null +++ b/ui/src/app/metadata/component/properties/hooks.js @@ -0,0 +1,3 @@ +export function usePropertyWidth(columns) { + return `${Math.floor(100 / (columns + 1))}%` +} \ No newline at end of file diff --git a/ui/src/app/metadata/configuration/action/compare.action.ts b/ui/src/app/metadata/configuration/action/compare.action.ts deleted file mode 100644 index da012bea7..000000000 --- a/ui/src/app/metadata/configuration/action/compare.action.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { Action } from '@ngrx/store'; -import { Metadata } from '../../domain/domain.type'; - -export enum CompareActionTypes { - COMPARE_METADATA_REQUEST = '[Compare Version] Compare Version Request', - COMPARE_METADATA_SUCCESS = '[Compare Version] Compare Version Success', - COMPARE_METADATA_ERROR = '[Compare Version] Compare Version Error', - SET_VERSIONS = '[Compare Version] Set Versions', - CLEAR_VERSIONS = '[Compare Version] Clear Versions', - SET_VIEW_CHANGED = '[Compare Version] View Changed Only' -} - -export class CompareVersionRequest implements Action { - readonly type = CompareActionTypes.COMPARE_METADATA_REQUEST; - - constructor(public payload: string[]) { } -} - -export class CompareVersionSuccess implements Action { - readonly type = CompareActionTypes.COMPARE_METADATA_SUCCESS; - - constructor(public payload: Metadata[]) { } -} - -export class CompareVersionError implements Action { - readonly type = CompareActionTypes.COMPARE_METADATA_ERROR; - - constructor(public payload: any) { } -} - -export class SetMetadataVersions implements Action { - readonly type = CompareActionTypes.SET_VERSIONS; - - constructor(public payload: Metadata[]) { } -} - -export class ViewChanged implements Action { - readonly type = CompareActionTypes.SET_VIEW_CHANGED; - constructor(public payload: boolean) { } -} - -export class ClearVersions implements Action { - readonly type = CompareActionTypes.CLEAR_VERSIONS; -} - -export type CompareActionsUnion = - | CompareVersionRequest - | CompareVersionSuccess - | CompareVersionError - | SetMetadataVersions - | ClearVersions - | ViewChanged; diff --git a/ui/src/app/metadata/configuration/action/configuration.action.ts b/ui/src/app/metadata/configuration/action/configuration.action.ts deleted file mode 100644 index b1eb9c00a..000000000 --- a/ui/src/app/metadata/configuration/action/configuration.action.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { Action } from '@ngrx/store'; -import { Metadata } from '../../domain/domain.type'; -import { Schema } from '../model/schema'; -import { Wizard } from '../../../wizard/model'; - -export enum ConfigurationActionTypes { - LOAD_SCHEMA_REQUEST = '[Metadata Configuration] Load Schema Request', - LOAD_SCHEMA_SUCCESS = '[Metadata Configuration] Load Schema Success', - LOAD_SCHEMA_ERROR = '[Metadata Configuration] Load Schema Error', - - LOAD_XML_REQUEST = '[Metadata Configuration] Load XML Request', - LOAD_XML_SUCCESS = '[Metadata Configuration] Load XML Success', - LOAD_XML_ERROR = '[Metadata Configuration] Load XML Error', - - SET_METADATA = '[Metadata Configuration] Set Metadata Attributes', - SET_DEFINITION = '[Metadata Configuration] Set Metadata Definition', - SET_SCHEMA = '[Metadata Configuration] Set Metadata Schema', - SET_XML = '[Metadata Configuration] Set Metadata Xml', - SET_METADATA_MODEL = '[Metadata Configuration] Set Metadata Model', - - DOWNLOAD_XML = '[Metadata Configuration] Download Metadata Xml', - - CLEAR = '[Metadata Configuration] Clear' -} - -export class LoadSchemaRequest implements Action { - readonly type = ConfigurationActionTypes.LOAD_SCHEMA_REQUEST; - - constructor(public payload: string) { } -} - -export class LoadSchemaSuccess implements Action { - readonly type = ConfigurationActionTypes.LOAD_SCHEMA_SUCCESS; - - constructor(public payload: Schema) { } -} - -export class LoadSchemaError implements Action { - readonly type = ConfigurationActionTypes.LOAD_SCHEMA_ERROR; - - constructor(public payload: any) { } -} - -export class LoadXmlRequest implements Action { - readonly type = ConfigurationActionTypes.LOAD_XML_REQUEST; - - constructor(public payload: { id: string, type: string }) { } -} - -export class LoadXmlSuccess implements Action { - readonly type = ConfigurationActionTypes.LOAD_XML_SUCCESS; - - constructor(public payload: string) { } -} - -export class LoadXmlError implements Action { - readonly type = ConfigurationActionTypes.LOAD_XML_ERROR; - - constructor(public payload: any) { } -} - -export class SetMetadata implements Action { - readonly type = ConfigurationActionTypes.SET_METADATA; - - constructor(public payload: { id: string, type: string, version?: string }) { } -} - -export class SetMetadataModel implements Action { - readonly type = ConfigurationActionTypes.SET_METADATA_MODEL; - - constructor(public payload: Metadata) { } -} - -export class SetConfigurationDefinition implements Action { - readonly type = ConfigurationActionTypes.SET_DEFINITION; - - constructor(public payload: Wizard) { } -} - -export class SetConfigurationSchema implements Action { - readonly type = ConfigurationActionTypes.SET_SCHEMA; - - constructor(public payload: Schema) { } -} - -export class SetXml implements Action { - readonly type = ConfigurationActionTypes.SET_XML; - - constructor(public payload: string) { } -} - -export class DownloadXml implements Action { - readonly type = ConfigurationActionTypes.DOWNLOAD_XML; -} - -export class ClearConfiguration implements Action { - readonly type = ConfigurationActionTypes.CLEAR; -} - -export type ConfigurationActionsUnion = - | LoadSchemaRequest - | LoadSchemaSuccess - | LoadSchemaError - | LoadXmlRequest - | LoadXmlSuccess - | LoadXmlError - | SetMetadata - | SetConfigurationDefinition - | SetConfigurationSchema - | SetXml - | DownloadXml - | ClearConfiguration; diff --git a/ui/src/app/metadata/configuration/action/filter.action.ts b/ui/src/app/metadata/configuration/action/filter.action.ts deleted file mode 100644 index 6567fd0e2..000000000 --- a/ui/src/app/metadata/configuration/action/filter.action.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { Action } from '@ngrx/store'; -import { Metadata } from '../../domain/domain.type'; -import { FormDefinition } from '../../../wizard/model/form-definition'; -import { FilterComparison } from '../model/compare'; -import { Schema } from '../model/schema'; - -export enum FilterCompareActionTypes { - LOAD_SCHEMA_REQUEST = '[Filter Compare Version] Compare Version Request', - LOAD_SCHEMA_SUCCESS = '[Filter Compare Version] Compare Version Success', - LOAD_SCHEMA_ERROR = '[Filter Compare Version] Compare Version Error', - SET_SCHEMA = '[Filter Compare Version] Set Schema', - SET_DEFINITION = '[Filter Compare Version] Set Definition', - COMPARE_FILTERS = '[Filter Compare Version] Compare Filters', - CLEAR = '[Filter Compare Version] Clear Filter Comparison' -} - -export class LoadFilterSchemaRequest implements Action { - readonly type = FilterCompareActionTypes.LOAD_SCHEMA_REQUEST; - - constructor(public payload: string) { } -} - -export class LoadFilterSchemaSuccess implements Action { - readonly type = FilterCompareActionTypes.LOAD_SCHEMA_SUCCESS; - - constructor(public payload: Schema) { } -} - -export class LoadFilterSchemaError implements Action { - readonly type = FilterCompareActionTypes.LOAD_SCHEMA_ERROR; - - constructor(public payload: any) { } -} - -export class SetFilterComparisonSchema implements Action { - readonly type = FilterCompareActionTypes.SET_SCHEMA; - constructor(public payload: any) { } -} - -export class SetFilterComparisonDefinition implements Action { - readonly type = FilterCompareActionTypes.SET_DEFINITION; - constructor(public payload: FormDefinition) { } -} - -export class ClearFilterComparison implements Action { - readonly type = FilterCompareActionTypes.CLEAR; -} - -export class CompareFilterVersions implements Action { - readonly type = FilterCompareActionTypes.COMPARE_FILTERS; - - constructor(public payload: FilterComparison) { } -} - -export type FilterCompareActionsUnion = - | LoadFilterSchemaRequest - | LoadFilterSchemaSuccess - | LoadFilterSchemaError - | SetFilterComparisonSchema - | SetFilterComparisonDefinition - | CompareFilterVersions - | ClearFilterComparison; diff --git a/ui/src/app/metadata/configuration/action/history.action.ts b/ui/src/app/metadata/configuration/action/history.action.ts deleted file mode 100644 index 5ee05ea65..000000000 --- a/ui/src/app/metadata/configuration/action/history.action.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { Action } from '@ngrx/store'; -import { MetadataHistory } from '../model/history'; - -export enum HistoryActionTypes { - LOAD_HISTORY_REQUEST = '[Configuration History] Load History Request', - LOAD_HISTORY_SUCCESS = '[Configuration History] Load History Success', - LOAD_HISTORY_ERROR = '[Configuration History] Load History Error', - SET_HISTORY = '[Configuration History] Set History', - CLEAR_HISTORY = '[Configuration History] Clear History', - SELECT_VERSION = '[Configuration History] Select Version' -} - -export class LoadHistoryRequest implements Action { - readonly type = HistoryActionTypes.LOAD_HISTORY_REQUEST; - - constructor(public payload: { id: string, type: string }) { } -} - -export class LoadHistorySuccess implements Action { - readonly type = HistoryActionTypes.LOAD_HISTORY_SUCCESS; - - constructor(public payload: MetadataHistory) { } -} - -export class LoadHistoryError implements Action { - readonly type = HistoryActionTypes.LOAD_HISTORY_ERROR; - - constructor(public payload: any) { } -} - -export class SelectVersion implements Action { - readonly type = HistoryActionTypes.SELECT_VERSION; - constructor(public payload: string | null) { } -} - -export class SetHistory implements Action { - readonly type = HistoryActionTypes.SET_HISTORY; - - constructor(public payload: MetadataHistory) {} -} - -export class ClearHistory implements Action { - readonly type = HistoryActionTypes.CLEAR_HISTORY; -} - -export type HistoryActionsUnion = - | LoadHistoryRequest - | LoadHistorySuccess - | LoadHistoryError - | SetHistory - | ClearHistory - | SelectVersion; diff --git a/ui/src/app/metadata/configuration/action/restore.action.ts b/ui/src/app/metadata/configuration/action/restore.action.ts deleted file mode 100644 index 978e9eee4..000000000 --- a/ui/src/app/metadata/configuration/action/restore.action.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { Action } from '@ngrx/store'; -import { Metadata } from '../../domain/domain.type'; -import { VersionRequest } from '../model/request'; - -export enum RestoreActionTypes { - RESTORE_VERSION_REQUEST = '[Restore Version] Restore Version Request', - RESTORE_VERSION_SUCCESS = '[Restore Version] Restore Version Success', - RESTORE_VERSION_ERROR = '[Restore Version] Restore Version Error', - - UPDATE_RESTORATION_REQUEST = '[Restore Version] Update Changes Request', - UPDATE_RESTORATION_SUCCESS = '[Restore Version] Update Changes Success', - - UPDATE_STATUS = '[Restore Version] Update Restore Form Status', - SET_SAVING_STATUS = '[Restore Version] Set Saving Status', - - CLEAR_VERSION = '[Restore Version] Clear Versions', - CANCEL_RESTORE = '[Restore Version] Cancel Restore' -} - -export class RestoreVersionRequest implements Action { - readonly type = RestoreActionTypes.RESTORE_VERSION_REQUEST; - constructor() { } -} - -export class RestoreVersionSuccess implements Action { - readonly type = RestoreActionTypes.RESTORE_VERSION_SUCCESS; - constructor(public payload: { id: string, type: string, model: Metadata }) { } -} - -export class RestoreVersionError implements Action { - readonly type = RestoreActionTypes.RESTORE_VERSION_ERROR; - constructor(public payload: any) { } -} - -export class UpdateRestorationChangesRequest implements Action { - readonly type = RestoreActionTypes.UPDATE_RESTORATION_REQUEST; - constructor(public payload: Partial) { } -} - -export class UpdateRestorationChangesSuccess implements Action { - readonly type = RestoreActionTypes.UPDATE_RESTORATION_SUCCESS; - constructor(public payload: Partial) { } -} - -export class UpdateRestoreFormStatus implements Action { - readonly type = RestoreActionTypes.UPDATE_STATUS; - - constructor(public payload: { [key: string]: string }) { } -} - -export class SetSavingStatus implements Action { - readonly type = RestoreActionTypes.SET_SAVING_STATUS; - - constructor(public payload: boolean) { } -} - -export class CancelRestore implements Action { - readonly type = RestoreActionTypes.CANCEL_RESTORE; - constructor() { } -} - -export type RestoreActionsUnion = - | RestoreVersionRequest - | RestoreVersionSuccess - | RestoreVersionError - | UpdateRestorationChangesRequest - | UpdateRestorationChangesSuccess - | UpdateRestoreFormStatus - | SetSavingStatus - | CancelRestore; diff --git a/ui/src/app/metadata/configuration/action/version.action.ts b/ui/src/app/metadata/configuration/action/version.action.ts deleted file mode 100644 index 0379a240b..000000000 --- a/ui/src/app/metadata/configuration/action/version.action.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { Action } from '@ngrx/store'; -import { Metadata } from '../../domain/domain.type'; -import { VersionRequest } from '../model/request'; - -export enum VersionActionTypes { - SELECT_VERSION_SUCCESS = '[Version] Select Version Success', - SELECT_VERSION_ERROR = '[Version] Select Version Error', - SELECT_VERSION_REQUEST = '[Version] Select Version Request', - - CLEAR_VERSION = '[Version] Clear Versions' -} - -export class SelectVersionRequest implements Action { - readonly type = VersionActionTypes.SELECT_VERSION_REQUEST; - - constructor(public payload: VersionRequest) { } -} - -export class SelectVersionSuccess implements Action { - readonly type = VersionActionTypes.SELECT_VERSION_SUCCESS; - - constructor(public payload: Metadata) { } -} -export class SelectVersionError implements Action { - readonly type = VersionActionTypes.SELECT_VERSION_ERROR; - - constructor(public payload: any) { } -} - -export class ClearVersion implements Action { - readonly type = VersionActionTypes.CLEAR_VERSION; - - constructor() { } -} - -export type VersionActionsUnion = - | SelectVersionRequest - | SelectVersionError - | SelectVersionSuccess - | ClearVersion; diff --git a/ui/src/app/metadata/configuration/component/editor.component.html b/ui/src/app/metadata/configuration/component/editor.component.html deleted file mode 100644 index fd71771aa..000000000 --- a/ui/src/app/metadata/configuration/component/editor.component.html +++ /dev/null @@ -1,14 +0,0 @@ -
- - - {{ lock.value ? 'Locked' : 'Unlocked' }} - - For Advanced Knowledge Only -
- \ No newline at end of file diff --git a/ui/src/app/metadata/configuration/component/editor.component.ts b/ui/src/app/metadata/configuration/component/editor.component.ts deleted file mode 100644 index 59f3ef375..000000000 --- a/ui/src/app/metadata/configuration/component/editor.component.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Component, Input, Output, EventEmitter } from '@angular/core'; -import { FormControl } from '@angular/forms'; -import { Metadata } from '../../domain/domain.type'; - - -@Component({ - selector: 'metadata-editor', - templateUrl: './editor.component.html', - styleUrls: [] -}) -export class MetadataEditorComponent { - - @Input() schema: any; - @Input() bindings: any; - @Input() validators: { [key: string]: any }; - @Input() model: Metadata; - @Input() lockable: boolean; - - @Output() change: EventEmitter = new EventEmitter(); - @Output() status: EventEmitter = new EventEmitter(); - @Output() onLockChange: EventEmitter = new EventEmitter(); - - lock: FormControl = new FormControl(true); - - constructor() { - this.lock.valueChanges.subscribe(locked => this.onLockChange.emit(locked)); - } -} - diff --git a/ui/src/app/metadata/configuration/component/filter-configuration-list-item.component.html b/ui/src/app/metadata/configuration/component/filter-configuration-list-item.component.html deleted file mode 100644 index fcacb9481..000000000 --- a/ui/src/app/metadata/configuration/component/filter-configuration-list-item.component.html +++ /dev/null @@ -1,46 +0,0 @@ -
- {{ index + 1 }} -
- - -
- - {{ filter['@type'] }} - - Enabled - Disabled - -
-
-
-
-
- -   - Edit - - -
-
- - -
\ No newline at end of file diff --git a/ui/src/app/metadata/configuration/component/filter-configuration-list-item.component.ts b/ui/src/app/metadata/configuration/component/filter-configuration-list-item.component.ts deleted file mode 100644 index 9e5cb7630..000000000 --- a/ui/src/app/metadata/configuration/component/filter-configuration-list-item.component.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges } from '@angular/core'; -import { Store } from '@ngrx/store'; -import { MetadataFilter } from '../../domain/model'; -import { MetadataConfigurationService } from '../service/configuration.service'; -import { MetadataConfiguration } from '../model/metadata-configuration'; -import { PreviewEntity } from '../../domain/action/entity.action'; -import { Metadata } from '../../domain/domain.type'; -import * as fromRoot from '../../../app.reducer'; - -@Component({ - selector: 'filter-configuration-list-item', - templateUrl: './filter-configuration-list-item.component.html' -}) -export class FilterConfigurationListItemComponent implements OnChanges { - @Input() filter: MetadataFilter; - @Input() index: number; - @Input() isFirst: boolean; - @Input() isLast: boolean; - @Input() editable: boolean; - - @Output() onUpdateOrderUp: EventEmitter = new EventEmitter(); - @Output() onUpdateOrderDown: EventEmitter = new EventEmitter(); - @Output() onRemove: EventEmitter = new EventEmitter(); - - open = false; - configuration: MetadataConfiguration; - definition: any; - - constructor( - private configService: MetadataConfigurationService, - private store: Store - ) {} - - onPreview($event: { data: any, parent: Metadata }): void { - this.store.dispatch(new PreviewEntity({ - id: $event.data, - entity: this.definition.getEntity($event.parent) - })); - } - - ngOnChanges(changes: SimpleChanges): void { - if (changes.filter) { - this.definition = this.configService.getDefinition(this.filter['@type']); - this.configService.loadSchema(this.definition.schema).subscribe(schema => { - this.configuration = this.configService.getMetadataConfiguration( - this.filter, - this.definition, - schema - ); - }); - } - } -} diff --git a/ui/src/app/metadata/configuration/component/filter-configuration-list.component.html b/ui/src/app/metadata/configuration/component/filter-configuration-list.component.html deleted file mode 100644 index 992660c33..000000000 --- a/ui/src/app/metadata/configuration/component/filter-configuration-list.component.html +++ /dev/null @@ -1,18 +0,0 @@ -
    -
  • - -
  • -
-
-

No Filters

-

No filters have been added to this Metadata Provider

-
\ No newline at end of file diff --git a/ui/src/app/metadata/configuration/component/filter-configuration-list.component.ts b/ui/src/app/metadata/configuration/component/filter-configuration-list.component.ts deleted file mode 100644 index 17f377480..000000000 --- a/ui/src/app/metadata/configuration/component/filter-configuration-list.component.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Component, Input } from '@angular/core'; -import { FilterListComponent } from '../../filter/component/filter-list.component'; - -@Component({ - selector: 'filter-configuration-list', - templateUrl: './filter-configuration-list.component.html' -}) -export class FilterConfigurationListComponent extends FilterListComponent { - @Input() editable = true; -} diff --git a/ui/src/app/metadata/configuration/component/filter-version-list.component.html b/ui/src/app/metadata/configuration/component/filter-version-list.component.html deleted file mode 100644 index 60398635b..000000000 --- a/ui/src/app/metadata/configuration/component/filter-version-list.component.html +++ /dev/null @@ -1,51 +0,0 @@ - -
- Order - Option - - {{ date | date:DATE_FORMAT }} - -
-
- -
-
- {{ i + 1 }} -
-
-
-
-
-
-

{{ filter.name }}

-

{{ filter['@type'] }}

-
- -
-
- -
-
-
-
-

No Filters

-

No filters have been added to this Metadata Provider

-
-
- -
-
diff --git a/ui/src/app/metadata/configuration/component/filter-version-list.component.spec.ts b/ui/src/app/metadata/configuration/component/filter-version-list.component.spec.ts deleted file mode 100644 index c13607cef..000000000 --- a/ui/src/app/metadata/configuration/component/filter-version-list.component.spec.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; - -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { FilterVersionListComponent } from './filter-version-list.component'; -import { FilterComparison } from '../model/compare'; -import { FilterConfiguration } from '../model/metadata-configuration'; - -export const TestData: FilterConfiguration = { - dates: ['2019-09-23T20:54:31.081Z', '2019-10-23T20:54:31.081Z'], - filters: [ - [ - { - resourceId: 'foo', - name: 'Test 1', - type: 'EntityAttributesFilter', - comparable: false - }, - { - resourceId: 'bar', - name: 'Test 2', - type: 'EntityAttributesFilter', - comparable: false - } - ] - ] -}; - -@Component({ - template: `` -}) -class TestHostComponent { - @ViewChild(FilterVersionListComponent, {static: true}) - public componentUnderTest: FilterVersionListComponent; - - filters = TestData; - - compare(versions: FilterComparison): void { } -} - -describe('Filter Version List Component', () => { - let fixture: ComponentFixture; - let instance: TestHostComponent; - let list: FilterVersionListComponent; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [], - imports: [ - MockI18nModule, - RouterTestingModule - ], - declarations: [ - FilterVersionListComponent, - TestHostComponent - ], - }); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - list = instance.componentUnderTest; - fixture.detectChanges(); - }); - - it('should compile', () => { - expect(list).toBeDefined(); - }); - - describe('compareSelected', () => { - it('should emit an event with the selected filter data', () => { - spyOn(instance, 'compare'); - list.selected = 'foo'; - fixture.detectChanges(); - list.compareSelected(); - fixture.detectChanges(); - expect(instance.compare).toHaveBeenCalled(); - }); - }); -}); diff --git a/ui/src/app/metadata/configuration/component/filter-version-list.component.ts b/ui/src/app/metadata/configuration/component/filter-version-list.component.ts deleted file mode 100644 index 2d2865d00..000000000 --- a/ui/src/app/metadata/configuration/component/filter-version-list.component.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { Component, Input, Output, EventEmitter } from '@angular/core'; -import { FilterConfiguration, MetadataConfiguration } from '../model/metadata-configuration'; -import { CONFIG_DATE_FORMAT } from '../configuration.values'; -import { Observable } from 'rxjs'; -import { FilterComparison } from '../model/compare'; - -@Component({ - selector: 'filter-version-list', - templateUrl: './filter-version-list.component.html' -}) -export class FilterVersionListComponent { - - @Input() filters: FilterConfiguration; - @Output() compare: EventEmitter = new EventEmitter(); - - selected: string; - comparing: string; - selectedFilters$: Observable; - - DATE_FORMAT = CONFIG_DATE_FORMAT; - - constructor() {} - - compareSelected() { - const reduced = this.filters.filters.reduce((acc, l) => acc.concat(l), []); - const filtered = reduced.filter(f => f && f.resourceId === this.selected); - const type = filtered[0]['@type']; - - this.compare.emit({ - modelId: this.selected, - modelType: type, - models: filtered - }); - } - - get width(): string { - const columns = this.filters.dates.length; - return `${Math.floor(100 / (columns + 1))}`; - } -} diff --git a/ui/src/app/metadata/configuration/component/history-list.component.html b/ui/src/app/metadata/configuration/component/history-list.component.html deleted file mode 100644 index 590bf72a4..000000000 --- a/ui/src/app/metadata/configuration/component/history-list.component.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - -
Metadata Version History
- Select Version - Save DateChanged ByActions
-
- - -
-
- - {{ version.date | date:DATE_FORMAT }} (Current) - - - {{ version.date | date:DATE_FORMAT }} - - {{ version.creator }} - -
- \ No newline at end of file diff --git a/ui/src/app/metadata/configuration/component/history-list.component.spec.ts b/ui/src/app/metadata/configuration/component/history-list.component.spec.ts deleted file mode 100644 index 257262963..000000000 --- a/ui/src/app/metadata/configuration/component/history-list.component.spec.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { HistoryListComponent } from './history-list.component'; -import { MetadataHistory } from '../model/history'; -import { MetadataVersion } from '../model/version'; -import { RouterTestingModule } from '@angular/router/testing'; - -export const TestData = { - versions: [ - { - id: 'foo', - date: new Date().toDateString(), - creator: 'admin' - } - ] -}; - -@Component({ - template: `` -}) -class TestHostComponent { - @ViewChild(HistoryListComponent, {static: true}) - public componentUnderTest: HistoryListComponent; - - history: MetadataHistory = TestData; - - compare(versions: MetadataVersion[]): void {} - restore(version: MetadataVersion): void {} -} - -describe('Metadata History List Component', () => { - let fixture: ComponentFixture; - let instance: TestHostComponent; - let list: HistoryListComponent; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [], - imports: [ - MockI18nModule, - RouterTestingModule - ], - declarations: [ - HistoryListComponent, - TestHostComponent - ], - }); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - list = instance.componentUnderTest; - fixture.detectChanges(); - }); - - it('should compile', () => { - expect(list).toBeDefined(); - }); - - describe('compare selected', () => { - it('should allow the user to toggle selected versions for comparison', () => { - list.toggleVersionSelected(TestData.versions[0]); - expect(list.selected.length).toBe(1); - }); - - it('should emit an event with the selected values when the Compare Selected button is clicked', () => { - spyOn(instance, 'compare'); - const selected = TestData.versions; - list.compareSelected(selected); - fixture.detectChanges(); - expect(instance.compare).toHaveBeenCalledWith(selected); - }); - }); - - describe('restore', () => { - it('should emit an event with the selected version when the Restore button is clicked', () => { - spyOn(instance, 'restore'); - const selected = TestData.versions[0]; - list.restoreVersion(selected); - fixture.detectChanges(); - expect(instance.restore).toHaveBeenCalledWith(selected); - }); - }); - - describe('toggleVersionSelected method', () => { - it('should add or remove the selected version', () => { - list.toggleVersionSelected(TestData.versions[0]); - fixture.detectChanges(); - list.toggleVersionSelected(TestData.versions[0]); - fixture.detectChanges(); - expect(list.selected.length).toBe(0); - }); - }); -}); diff --git a/ui/src/app/metadata/configuration/component/history-list.component.ts b/ui/src/app/metadata/configuration/component/history-list.component.ts deleted file mode 100644 index 68e596ab5..000000000 --- a/ui/src/app/metadata/configuration/component/history-list.component.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { Component, Input, EventEmitter, ChangeDetectionStrategy, Output } from '@angular/core'; -import { MetadataHistory } from '../model/history'; -import { MetadataVersion } from '../model/version'; -import { CONFIG_DATE_FORMAT } from '../configuration.values'; - -@Component({ - selector: 'history-list', - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './history-list.component.html', - styleUrls: [] -}) -export class HistoryListComponent { - @Input() history: MetadataVersion[]; - @Output() compare: EventEmitter = new EventEmitter(); - @Output() restore: EventEmitter = new EventEmitter(); - - selected: MetadataVersion[] = []; - - DATE_FORMAT = CONFIG_DATE_FORMAT; - - constructor() {} - - toggleVersionSelected(version: MetadataVersion): void { - if (this.selected.indexOf(version) > -1) { - this.selected = this.selected.filter(s => s !== version); - } else { - this.selected = [...this.selected, version]; - } - } - - compareSelected(selected: MetadataVersion[]): void { - this.compare.emit(selected); - } - - restoreVersion(version: MetadataVersion): void { - this.restore.emit(version); - } -} diff --git a/ui/src/app/metadata/configuration/component/metadata-configuration.component.html b/ui/src/app/metadata/configuration/component/metadata-configuration.component.html deleted file mode 100644 index 1388ffe6e..000000000 --- a/ui/src/app/metadata/configuration/component/metadata-configuration.component.html +++ /dev/null @@ -1,40 +0,0 @@ -
- -
-
-
-

- - 0{{ i + 1 }} - - {{ section.label | translate }} -

-
- -
-
-
- -
- Option - - Value - {{ date | date:DATE_FORMAT }} - -
- - -
-
-
-
-
-
\ No newline at end of file diff --git a/ui/src/app/metadata/configuration/component/metadata-configuration.component.scss b/ui/src/app/metadata/configuration/component/metadata-configuration.component.scss deleted file mode 100644 index 39fcf193c..000000000 --- a/ui/src/app/metadata/configuration/component/metadata-configuration.component.scss +++ /dev/null @@ -1,18 +0,0 @@ -@import '../../../../theme/_palette'; - -.bg-diff { - background: #FEE8E9; - position: relative; - border-color: #CCC !important; - &::before { - $size: 24px; - content: "\f06a"; - font-family: 'FontAwesome'; - text-align: center; - width: $size; - height: $size; - position: absolute; - left: -$size; - top: 0.5rem; - } -} diff --git a/ui/src/app/metadata/configuration/component/metadata-configuration.component.spec.ts b/ui/src/app/metadata/configuration/component/metadata-configuration.component.spec.ts deleted file mode 100644 index bce7bff3a..000000000 --- a/ui/src/app/metadata/configuration/component/metadata-configuration.component.spec.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { Component, ViewChild, Input } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { MetadataConfigurationComponent } from './metadata-configuration.component'; - -import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; -import { MetadataConfiguration } from '../model/metadata-configuration'; -import { Property } from '../../domain/model/property'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { Router } from '@angular/router'; - -@Component({ - selector: 'object-property', - template: `` -}) -class ObjectPropertyComponent { - @Input() property: Property; - @Input() columns = 1; -} - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(MetadataConfigurationComponent, {static: true}) - public componentUnderTest: MetadataConfigurationComponent; - - configuration: MetadataConfiguration = { - dates: [], - sections: [] - }; -} - -describe('Metadata Configuration Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: MetadataConfigurationComponent; - let router: Router; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - MockI18nModule, - RouterTestingModule - ], - declarations: [ - MetadataConfigurationComponent, - ObjectPropertyComponent, - TestHostComponent - ], - }).compileComponents(); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - router = TestBed.get(Router); - fixture.detectChanges(); - })); - - it('should accept a configuration input', waitForAsync(() => { - expect(app).toBeTruthy(); - })); - - describe('edit method', () => { - it('should call onEdit.emit', () => { - spyOn(app.onEdit, 'emit'); - app.edit('foo'); - expect(app.onEdit.emit).toHaveBeenCalled(); - }); - }); - - describe('width getter', () => { - it('should default to 100%', () => { - expect(app.width).toBe('100%'); - }); - it('should calculate the width based on dates', () => { - instance.configuration = { - ...instance.configuration, - dates: [ - new Date().toISOString(), - new Date().toISOString() - ] - }; - fixture.detectChanges(); - expect(app.width).toBe('33%'); - }); - }); -}); diff --git a/ui/src/app/metadata/configuration/component/metadata-configuration.component.ts b/ui/src/app/metadata/configuration/component/metadata-configuration.component.ts deleted file mode 100644 index 41d930af9..000000000 --- a/ui/src/app/metadata/configuration/component/metadata-configuration.component.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { Component, Input, Output, EventEmitter, OnChanges } from '@angular/core'; -import { MetadataConfiguration } from '../model/metadata-configuration'; -import { Metadata } from '../../domain/domain.type'; -import { CONFIG_DATE_FORMAT } from '../configuration.values'; - -@Component({ - selector: 'metadata-configuration', - templateUrl: './metadata-configuration.component.html', - styleUrls: ['./metadata-configuration.component.scss'] -}) -export class MetadataConfigurationComponent implements OnChanges { - @Input() configuration: MetadataConfiguration; - @Input() definition: any; - @Input() entity: Metadata; - @Input() numbered = true; - - @Output() preview: EventEmitter = new EventEmitter(); - @Output() onEdit: EventEmitter = new EventEmitter(); - - zero = false; - - DATE_FORMAT = CONFIG_DATE_FORMAT; - - ngOnChanges(): void { - if (this.configuration) { - this.zero = !this.configuration.sections.some(s => !!s.properties.length); - } - } - - get editable(): boolean { - return !!this.onEdit.observers.length; - } - - edit(id: string): void { - this.onEdit.emit(id); - } - - onPreview($event): void { - this.preview.emit($event); - } - - get width(): string { - const columns = this.configuration.dates.length; - return `${Math.floor(100 / (columns + 1)) }%`; - } -} diff --git a/ui/src/app/metadata/configuration/component/metadata-header.component.html b/ui/src/app/metadata/configuration/component/metadata-header.component.html deleted file mode 100644 index 942c04b5c..000000000 --- a/ui/src/app/metadata/configuration/component/metadata-header.component.html +++ /dev/null @@ -1,22 +0,0 @@ -
-
-
-
- Saved:  - {{ (version.modifiedDate) | date:DATE_FORMAT }} -
- By:  - {{ version.createdBy }} -
- -
- -

- Enabled - Disabled -   - Current - Not Current -

-
-
diff --git a/ui/src/app/metadata/configuration/component/metadata-header.component.spec.ts b/ui/src/app/metadata/configuration/component/metadata-header.component.spec.ts deleted file mode 100644 index 0f6e9b9f5..000000000 --- a/ui/src/app/metadata/configuration/component/metadata-header.component.spec.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { MetadataVersion } from '../model/version'; -import { MetadataHeaderComponent } from './metadata-header.component'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(MetadataHeaderComponent, {static: true}) - public componentUnderTest: MetadataHeaderComponent; - - isEnabled = true; - - version: MetadataVersion = { - id: 'foo', - creator: 'foobar', - date: new Date().toDateString() - }; - isCurrent = false; -} - -describe('Metadata Header Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: MetadataHeaderComponent; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - MockI18nModule - ], - declarations: [ - MetadataHeaderComponent, - TestHostComponent - ] - }).compileComponents(); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should accept a property input', waitForAsync(() => { - expect(app).toBeTruthy(); - })); -}); diff --git a/ui/src/app/metadata/configuration/component/metadata-header.component.ts b/ui/src/app/metadata/configuration/component/metadata-header.component.ts deleted file mode 100644 index cc0df37b1..000000000 --- a/ui/src/app/metadata/configuration/component/metadata-header.component.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Component, Input } from '@angular/core'; -import { Metadata } from '../../domain/domain.type'; - -import { CONFIG_DATE_FORMAT } from '../configuration.values'; - -@Component({ - selector: 'metadata-header', - templateUrl: './metadata-header.component.html', - styleUrls: [] -}) - -export class MetadataHeaderComponent { - @Input() isEnabled: boolean; - @Input() version: Metadata; - @Input() isCurrent: boolean; - - DATE_FORMAT = CONFIG_DATE_FORMAT; - - constructor() {} -} - diff --git a/ui/src/app/metadata/configuration/component/property/array-property.component.html b/ui/src/app/metadata/configuration/component/property/array-property.component.html deleted file mode 100644 index e84365d4c..000000000 --- a/ui/src/app/metadata/configuration/component/property/array-property.component.html +++ /dev/null @@ -1,90 +0,0 @@ -
-
{{ property.name }}
-
-
- Changed: -
- {{ property.items.properties[prop].title }} -
- -
- {{ version[i][prop] }} -
-
- - -
-
-
-
-
- - - - - - - - -
- -
-
-
- Changed: - {{ item.label }} -
- - true - - - false - -
-
-
-
-
- -
- Changed: - {{ property.name }} - -

-

-
    -
  • - -   - - {{ item }} -
  • -
- -
    -
  • - {{ item }} -
  • -
-
-
-
-
\ No newline at end of file diff --git a/ui/src/app/metadata/configuration/component/property/array-property.component.scss b/ui/src/app/metadata/configuration/component/property/array-property.component.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/ui/src/app/metadata/configuration/component/property/array-property.component.spec.ts b/ui/src/app/metadata/configuration/component/property/array-property.component.spec.ts deleted file mode 100644 index 3c9aa3793..000000000 --- a/ui/src/app/metadata/configuration/component/property/array-property.component.spec.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { Component, ViewChild, Input } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; - -import { NgbDropdownModule, NgbPopoverModule } from '@ng-bootstrap/ng-bootstrap'; -import { Property } from '../../../domain/model/property'; -import { MockI18nModule } from '../../../../../testing/i18n.stub'; -import { SCHEMA } from '../../../../../testing/form-schema.stub'; -import { getStepProperty } from '../../../domain/utility/configuration'; -import { ArrayPropertyComponent } from './array-property.component'; -import { AttributesService } from '../../../domain/service/attributes.service'; -import { MockAttributeService } from '../../../../../testing/attributes.stub'; -import { of } from 'rxjs'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(ArrayPropertyComponent, {static: true}) - public componentUnderTest: ArrayPropertyComponent; - - property: Property = getStepProperty(SCHEMA.properties.list, [{ - name: 'foo', - type: 'baz', - description: 'foo bar baz', - list: [] - }], SCHEMA.definitions); - - setProperty(property: Property): void { - this.property = property; - } -} - -describe('Array Property Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: ArrayPropertyComponent; - let service: AttributesService; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbPopoverModule, - MockI18nModule, - RouterTestingModule - ], - declarations: [ - ArrayPropertyComponent, - TestHostComponent - ], - providers: [ - { provide: AttributesService, useClass: MockAttributeService } - ] - }).compileComponents(); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - service = TestBed.get(AttributesService); - fixture.detectChanges(); - })); - - it('should accept a property input', waitForAsync(() => { - expect(app).toBeTruthy(); - })); - - describe('attributeList$ getter', () => { - it('should return an empty list when no data or dataUrl is set', () => { - expect(app.dataList).toBeUndefined(); - }); - it('should return a list of data items from the schema', () => { - const datalist = [ - { key: 'foo', label: 'foo' }, - { key: 'bar', label: 'bar' }, - { key: 'baz', label: 'baz' }, - ]; - instance.setProperty({ - ...instance.property, - widget: { - id: 'datalist', - data: datalist - } - }); - fixture.detectChanges(); - expect(app.dataList).toEqual(datalist); - }); - }); -}); diff --git a/ui/src/app/metadata/configuration/component/property/array-property.component.ts b/ui/src/app/metadata/configuration/component/property/array-property.component.ts deleted file mode 100644 index 4d09d9a8f..000000000 --- a/ui/src/app/metadata/configuration/component/property/array-property.component.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { Component, Input, OnChanges, Output, EventEmitter } from '@angular/core'; -import { Property } from '../../../domain/model/property'; -import { Observable, of } from 'rxjs'; -import { AttributesService } from '../../../domain/service/attributes.service'; -import { ConfigurationPropertyComponent } from './configuration-property.component'; -import UriValidator from '../../../../shared/validation/uri.validator'; - -@Component({ - selector: 'array-property', - templateUrl: './array-property.component.html', - styleUrls: ['./array-property.component.scss'] -}) - -export class ArrayPropertyComponent extends ConfigurationPropertyComponent implements OnChanges { - @Input() property: Property; - - @Output() preview: EventEmitter = new EventEmitter(); - - range = []; - - constructor( - private attrService: AttributesService - ) { - super(); - } - - ngOnChanges(): void { - const keys = this.property.value.reduce((val, version) => version ? version.length > val ? version.length : val : val, 0); - this.range = [...Array(keys).keys()]; - } - - isUrl(str: string): boolean { - return UriValidator.isUri(str); - } - - get dataList(): { key: string, label: string, differences?: boolean }[] { - return this.property.widget.data; - } -} - diff --git a/ui/src/app/metadata/configuration/component/property/configuration-property.component.spec.ts b/ui/src/app/metadata/configuration/component/property/configuration-property.component.spec.ts deleted file mode 100644 index 35e115f88..000000000 --- a/ui/src/app/metadata/configuration/component/property/configuration-property.component.spec.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { Component, ViewChild, Input } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; - -import { NgbPopoverModule } from '@ng-bootstrap/ng-bootstrap'; -import { Property } from '../../../domain/model/property'; -import { MockI18nModule } from '../../../../../testing/i18n.stub'; -import { SCHEMA } from '../../../../../testing/form-schema.stub'; -import { getStepProperty } from '../../../domain/utility/configuration'; -import { ConfigurationPropertyComponent } from './configuration-property.component'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(ConfigurationPropertyComponent, {static: true}) - public componentUnderTest: ConfigurationPropertyComponent; - - property: Property = getStepProperty(SCHEMA.properties.name, { - name: 'foo', - type: 'baz', - description: 'foo bar baz' - }, SCHEMA.definitions); -} - -describe('Configuration Property Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: ConfigurationPropertyComponent; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbPopoverModule, - MockI18nModule, - RouterTestingModule - ], - declarations: [ - ConfigurationPropertyComponent, - TestHostComponent - ] - }).compileComponents(); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should accept a property input', waitForAsync(() => { - expect(app).toBeTruthy(); - })); - - describe('getKeys method', () => { - it('should return the property`s child keys', () => { - expect(app.getKeys({ properties: { foo: 'bar', baz: 'bar' } })).toEqual(['foo', 'baz']); - }); - }); - - describe('getItemType method', () => { - it('should return the item`s type', () => { - expect(app.getItemType({items: { widget: { id: 'string' } } } as Property)).toBe('string'); - expect(app.getItemType({items: {}} as Property)).toBe('default'); - expect(app.getItemType({} as Property)).toBe('default'); - }); - }); -}); diff --git a/ui/src/app/metadata/configuration/component/property/configuration-property.component.ts b/ui/src/app/metadata/configuration/component/property/configuration-property.component.ts deleted file mode 100644 index 7e666bc03..000000000 --- a/ui/src/app/metadata/configuration/component/property/configuration-property.component.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Component, Input } from '@angular/core'; -import { Property } from '../../../domain/model/property'; - -@Component({ - selector: 'configuration-property', - template: `{{ property | json }}` -}) - -export class ConfigurationPropertyComponent { - @Input() property: Property; - @Input() columns = 1; - - constructor() { } - - getKeys(schema): string[] { - return Object.keys(schema.properties); - } - - getItemType(property: Property): string { - const items = property.items; - const def = 'default'; - return items ? items.widget ? items.widget.id : def : def; - } - - get width(): string { - return `${ Math.floor(100 / (this.columns + 1)) }%`; - } -} - diff --git a/ui/src/app/metadata/configuration/component/property/filter-target-property.component.html b/ui/src/app/metadata/configuration/component/property/filter-target-property.component.html deleted file mode 100644 index f8bfbb5c8..000000000 --- a/ui/src/app/metadata/configuration/component/property/filter-target-property.component.html +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/ui/src/app/metadata/configuration/component/property/filter-target-property.component.spec.ts b/ui/src/app/metadata/configuration/component/property/filter-target-property.component.spec.ts deleted file mode 100644 index 4ec53ce0c..000000000 --- a/ui/src/app/metadata/configuration/component/property/filter-target-property.component.spec.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; - -import { NgbPopoverModule } from '@ng-bootstrap/ng-bootstrap'; -import { Property } from '../../../domain/model/property'; -import { MockI18nModule } from '../../../../../testing/i18n.stub'; -import { SCHEMA } from '../../../../../testing/form-schema.stub'; -import { getStepProperty } from '../../../domain/utility/configuration'; -import { FilterTargetPropertyComponent } from './filter-target-property.component'; -import { ArrayPropertyComponentStub, PrimitivePropertyComponentStub } from '../../../../../testing/property-component.stub'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(FilterTargetPropertyComponent, {static: true}) - public componentUnderTest: FilterTargetPropertyComponent; - - property: Property = getStepProperty(SCHEMA.properties.formatFilterTarget, { - formatFilterTargetType: 'ENTITY_ID', - value: [ - 'foo', - 'bar', - 'baz' - ] - }, SCHEMA.definitions); -} - -describe('Filter Target Property Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: FilterTargetPropertyComponent; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbPopoverModule, - MockI18nModule, - RouterTestingModule - ], - declarations: [ - FilterTargetPropertyComponent, - PrimitivePropertyComponentStub, - ArrayPropertyComponentStub, - TestHostComponent - ], - providers: [] - }).compileComponents(); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should accept a property input', waitForAsync(() => { - expect(app).toBeTruthy(); - })); -}); diff --git a/ui/src/app/metadata/configuration/component/property/filter-target-property.component.ts b/ui/src/app/metadata/configuration/component/property/filter-target-property.component.ts deleted file mode 100644 index 8c0e89b00..000000000 --- a/ui/src/app/metadata/configuration/component/property/filter-target-property.component.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Component, Input, Output, EventEmitter } from '@angular/core'; -import { Property } from '../../../domain/model/property'; -import { ConfigurationPropertyComponent } from './configuration-property.component'; - -@Component({ - selector: 'filter-target-property', - templateUrl: './filter-target-property.component.html', - styleUrls: [] -}) -export class FilterTargetPropertyComponent extends ConfigurationPropertyComponent { - @Input() parent: Property; - - @Output() preview: EventEmitter = new EventEmitter(); - - constructor() { - super(); - } - - onPreview(data: any) { - this.preview.emit({ - parent: this.parent, - data - }); - } -} - diff --git a/ui/src/app/metadata/configuration/component/property/object-property.component.html b/ui/src/app/metadata/configuration/component/property/object-property.component.html deleted file mode 100644 index cf984071c..000000000 --- a/ui/src/app/metadata/configuration/component/property/object-property.component.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - -
{{ prop.name | translate }}
- -
- - -
-
-
diff --git a/ui/src/app/metadata/configuration/component/property/object-property.component.spec.ts b/ui/src/app/metadata/configuration/component/property/object-property.component.spec.ts deleted file mode 100644 index f3bc215a7..000000000 --- a/ui/src/app/metadata/configuration/component/property/object-property.component.spec.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; - -import { NgbPopoverModule } from '@ng-bootstrap/ng-bootstrap'; -import { Property } from '../../../domain/model/property'; -import { MockI18nModule } from '../../../../../testing/i18n.stub'; -import { ObjectPropertyComponent } from './object-property.component'; -import { SCHEMA } from '../../../../../testing/form-schema.stub'; -import { getStepProperty } from '../../../domain/utility/configuration'; -import { PrimitivePropertyComponent } from './primitive-property.component'; -import { ArrayPropertyComponent } from './array-property.component'; -import { FilterTargetPropertyComponent } from './filter-target-property.component'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(ObjectPropertyComponent, {static: true}) - public componentUnderTest: ObjectPropertyComponent; - - property: Property = getStepProperty(SCHEMA.properties.name, { - name: 'foo', - type: 'baz', - description: 'foo bar baz' - }, SCHEMA.definitions); -} - -describe('Object Property Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: ObjectPropertyComponent; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbPopoverModule, - MockI18nModule, - RouterTestingModule - ], - declarations: [ - ObjectPropertyComponent, - PrimitivePropertyComponent, - ArrayPropertyComponent, - FilterTargetPropertyComponent, - TestHostComponent - ] - }).compileComponents(); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should accept a property input', waitForAsync(() => { - expect(app).toBeTruthy(); - })); -}); diff --git a/ui/src/app/metadata/configuration/component/property/object-property.component.ts b/ui/src/app/metadata/configuration/component/property/object-property.component.ts deleted file mode 100644 index 9eef4afbd..000000000 --- a/ui/src/app/metadata/configuration/component/property/object-property.component.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Component, Input, Output, EventEmitter } from '@angular/core'; -import { Property } from '../../../domain/model/property'; -import { ConfigurationPropertyComponent } from './configuration-property.component'; - -@Component({ - selector: 'object-property', - templateUrl: './object-property.component.html', - styleUrls: [] -}) - -export class ObjectPropertyComponent extends ConfigurationPropertyComponent { - @Input() property: Property; - @Output() preview: EventEmitter = new EventEmitter(); - - constructor() { - super(); - } -} - diff --git a/ui/src/app/metadata/configuration/component/property/primitive-property.component.html b/ui/src/app/metadata/configuration/component/property/primitive-property.component.html deleted file mode 100644 index 393052386..000000000 --- a/ui/src/app/metadata/configuration/component/property/primitive-property.component.html +++ /dev/null @@ -1,18 +0,0 @@ -
-Changed: -
- {{ property.name }} - {{ v ? v : (v === false) ? v : '-' }} -
-
\ No newline at end of file diff --git a/ui/src/app/metadata/configuration/component/property/primitive-property.component.spec.ts b/ui/src/app/metadata/configuration/component/property/primitive-property.component.spec.ts deleted file mode 100644 index 9982137a3..000000000 --- a/ui/src/app/metadata/configuration/component/property/primitive-property.component.spec.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { Component, ViewChild, Input } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; - -import { NgbDropdownModule, NgbPopoverModule } from '@ng-bootstrap/ng-bootstrap'; -import { Property } from '../../../domain/model/property'; -import { MockI18nModule } from '../../../../../testing/i18n.stub'; -import { PrimitivePropertyComponent } from './primitive-property.component'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(PrimitivePropertyComponent, {static: true}) - public componentUnderTest: PrimitivePropertyComponent; - - property: Property = { - title: 'foo', - type: 'string', - name: 'foo', - value: ['bar'], - items: null, - properties: null, - widget: { - id: 'string' - } - }; -} - -describe('Primitive Property Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: PrimitivePropertyComponent; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - NgbPopoverModule, - MockI18nModule, - RouterTestingModule - ], - declarations: [ - PrimitivePropertyComponent, - TestHostComponent - ], - }).compileComponents(); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should accept a property input', waitForAsync(() => { - expect(app).toBeTruthy(); - })); -}); diff --git a/ui/src/app/metadata/configuration/component/property/primitive-property.component.ts b/ui/src/app/metadata/configuration/component/property/primitive-property.component.ts deleted file mode 100644 index e18b525af..000000000 --- a/ui/src/app/metadata/configuration/component/property/primitive-property.component.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Component, Input } from '@angular/core'; -import { ConfigurationPropertyComponent } from './configuration-property.component'; - -@Component({ - selector: 'primitive-property', - templateUrl: './primitive-property.component.html', - styleUrls: [] -}) -export class PrimitivePropertyComponent extends ConfigurationPropertyComponent { - constructor() { - super(); - } -} - diff --git a/ui/src/app/metadata/configuration/configuration.module.ts b/ui/src/app/metadata/configuration/configuration.module.ts deleted file mode 100644 index b7f2827a4..000000000 --- a/ui/src/app/metadata/configuration/configuration.module.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { NgModule, ModuleWithProviders } from '@angular/core'; -import { CommonModule, DatePipe } from '@angular/common'; -import { StoreModule } from '@ngrx/store'; -import { EffectsModule } from '@ngrx/effects'; -import { RouterModule } from '@angular/router'; -import { NgbPopoverModule } from '@ng-bootstrap/ng-bootstrap'; - -import { I18nModule } from '../../i18n/i18n.module'; -import { MetadataConfigurationComponent } from './component/metadata-configuration.component'; -import { ConfigurationComponent } from './container/configuration.component'; -import { MetadataConfigurationService } from './service/configuration.service'; -import * as fromConfig from './reducer'; -import { MetadataConfigurationEffects } from './effect/configuration.effect'; -import { ConfigurationPropertyComponent } from './component/property/configuration-property.component'; -import { PrimitivePropertyComponent } from './component/property/primitive-property.component'; -import { ObjectPropertyComponent } from './component/property/object-property.component'; -import { ArrayPropertyComponent } from './component/property/array-property.component'; -import { FilterTargetPropertyComponent } from './component/property/filter-target-property.component'; - -import { MetadataOptionsComponent } from './container/metadata-options.component'; -import { MetadataXmlComponent } from './container/metadata-xml.component'; -import { MetadataHeaderComponent } from './component/metadata-header.component'; -import { MetadataHistoryEffects } from './effect/history.effect'; -import { MetadataHistoryService } from './service/history.service'; -import { MetadataHistoryComponent } from './container/metadata-history.component'; -import { HistoryListComponent } from './component/history-list.component'; -import { DomainModule } from '../domain/domain.module'; -import { MetadataComparisonComponent } from './container/metadata-comparison.component'; -import { CompareVersionEffects } from './effect/compare.effect'; -import { FilterModule } from '../filter/filter.module'; -import { FilterConfigurationListComponent } from './component/filter-configuration-list.component'; -import { FilterConfigurationListItemComponent } from './component/filter-configuration-list-item.component'; -import { SharedModule } from '../../shared/shared.module'; - -import { RestoreComponent } from './container/restore.component'; -import { RestoreEffects } from './effect/restore.effect'; -import { VersionComponent } from './container/version.component'; -import { VersionOptionsComponent } from './container/version-options.component'; -import { VersionEffects } from './effect/version.effect'; -import { MetadataEditorComponent } from './component/editor.component'; -import { WizardModule } from '../../wizard/wizard.module'; -import { FormModule } from '../../schema-form/schema-form.module'; -import { RestoreEditComponent } from './container/restore-edit.component'; -import { RestoreEditStepComponent } from './container/restore-edit-step.component'; - -import { IndexResolver } from './service/index-resolver.service'; -import { FilterVersionListComponent } from './component/filter-version-list.component'; -import { FilterCompareVersionEffects } from './effect/filter.effect'; - -@NgModule({ - declarations: [ - MetadataConfigurationComponent, - MetadataOptionsComponent, - MetadataXmlComponent, - ConfigurationPropertyComponent, - PrimitivePropertyComponent, - ObjectPropertyComponent, - ArrayPropertyComponent, - ConfigurationComponent, - MetadataHeaderComponent, - MetadataHistoryComponent, - HistoryListComponent, - MetadataComparisonComponent, - FilterConfigurationListComponent, - FilterConfigurationListItemComponent, - FilterTargetPropertyComponent, - RestoreComponent, - VersionComponent, - VersionOptionsComponent, - MetadataEditorComponent, - RestoreEditComponent, - RestoreEditStepComponent, - FilterVersionListComponent - ], - entryComponents: [], - imports: [ - CommonModule, - I18nModule, - NgbPopoverModule, - RouterModule, - DomainModule, - FilterModule, - SharedModule, - WizardModule, - FormModule - ], - exports: [ - MetadataConfigurationComponent - ], - providers: [ - DatePipe, - IndexResolver - ] -}) -export class MetadataConfigurationModule { - static forRoot(): ModuleWithProviders { - return { - ngModule: RootMetadataConfigurationModule, - providers: [ - MetadataConfigurationService, - MetadataHistoryService - ] - }; - } -} - -@NgModule({ - imports: [ - MetadataConfigurationModule, - StoreModule.forFeature('metadata-configuration', fromConfig.reducers), - EffectsModule.forFeature( - [ - MetadataConfigurationEffects, - MetadataHistoryEffects, - CompareVersionEffects, - RestoreEffects, - FilterCompareVersionEffects, - VersionEffects - ] - ) - ], - providers: [] -}) -export class RootMetadataConfigurationModule { } diff --git a/ui/src/app/metadata/configuration/configuration.routing.ts b/ui/src/app/metadata/configuration/configuration.routing.ts deleted file mode 100644 index 886303790..000000000 --- a/ui/src/app/metadata/configuration/configuration.routing.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { Routes } from '@angular/router'; -import { ConfigurationComponent } from './container/configuration.component'; -import { MetadataOptionsComponent } from './container/metadata-options.component'; -import { MetadataXmlComponent } from './container/metadata-xml.component'; -import { MetadataHistoryComponent } from './container/metadata-history.component'; -import { MetadataComparisonComponent } from './container/metadata-comparison.component'; -import { RestoreComponent } from './container/restore.component'; -import { VersionComponent } from './container/version.component'; -import { VersionOptionsComponent } from './container/version-options.component'; -import { RestoreEditComponent } from './container/restore-edit.component'; -import { IndexResolver } from './service/index-resolver.service'; -import { RestoreEditStepComponent } from './container/restore-edit-step.component'; - -export const ConfigurationRoutes: Routes = [ - { - path: ':type/:id/configuration', - component: ConfigurationComponent, - children: [ - { - path: '', - redirectTo: 'options' - }, - { - path: 'options', - component: MetadataOptionsComponent, - data: { title: `Metadata Configuration Options` } - }, - { - path: 'xml', - component: MetadataXmlComponent, - data: { title: `Metadata Configuration XML` } - }, - { - path: 'history', - component: MetadataHistoryComponent, - data: { title: `Metadata History` } - }, - { - path: 'compare', - component: MetadataComparisonComponent, - data: { title: `Metadata Comparison` } - }, - { - path: 'version/:version', - component: VersionComponent, - children: [ - { - path: 'options', - component: VersionOptionsComponent, - data: { title: `Metadata Version Options` } - }, - { - path: 'restore', - component: RestoreComponent, - data: { title: `Restore Metadata Version` } - }, - { - path: 'edit', - redirectTo: 'edit/common' - }, - { - path: 'edit', - component: RestoreEditComponent, - children: [ - { - path: ':index', - component: RestoreEditStepComponent, - resolve: { - index: IndexResolver - }, - data: { title: `Edit Metadata` } - } - ] - } - ] - } - ] - } -]; diff --git a/ui/src/app/metadata/configuration/configuration.values.ts b/ui/src/app/metadata/configuration/configuration.values.ts deleted file mode 100644 index 53c2279e9..000000000 --- a/ui/src/app/metadata/configuration/configuration.values.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { MetadataSourceEditor } from '../domain/model/wizards/metadata-source-editor'; - -export enum PATHS { - resolver = 'EntityDescriptor', - provider = 'MetadataResolvers' -} - -export enum TYPES { - resolver = 'resolver', - provider = 'provider' -} - -export const DEFINITIONS = { - resolver: MetadataSourceEditor -}; - -export const CONFIG_DATE_FORMAT = 'MMM dd, yyyy HH:mm:ss'; diff --git a/ui/src/app/metadata/configuration/container/configuration.component.html b/ui/src/app/metadata/configuration/container/configuration.component.html deleted file mode 100644 index e2fd5be4a..000000000 --- a/ui/src/app/metadata/configuration/container/configuration.component.html +++ /dev/null @@ -1,21 +0,0 @@ -
-
-
- - - - -
-
-
\ No newline at end of file diff --git a/ui/src/app/metadata/configuration/container/configuration.component.spec.ts b/ui/src/app/metadata/configuration/container/configuration.component.spec.ts deleted file mode 100644 index 8d33546fe..000000000 --- a/ui/src/app/metadata/configuration/container/configuration.component.spec.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, combineReducers } from '@ngrx/store'; -import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; - -import { ConfigurationComponent } from './configuration.component'; -import * as fromConfiguration from '../reducer'; -import * as fromProviders from '../../provider/reducer'; -import * as fromResolvers from '../../resolver/reducer'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(ConfigurationComponent, {static: true}) - public componentUnderTest: ConfigurationComponent; -} - -describe('Metadata Configuration Page Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: ConfigurationComponent; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - StoreModule.forRoot({ - 'metadata-configuration': combineReducers(fromConfiguration.reducers), - 'provider': combineReducers(fromProviders.reducers), - 'resolver': combineReducers(fromResolvers.reducers) - }), - MockI18nModule, - RouterTestingModule - ], - declarations: [ - ConfigurationComponent, - TestHostComponent - ], - }).compileComponents(); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should load metadata objects', waitForAsync(() => { - expect(app).toBeTruthy(); - })); -}); diff --git a/ui/src/app/metadata/configuration/container/configuration.component.ts b/ui/src/app/metadata/configuration/container/configuration.component.ts deleted file mode 100644 index 1704bc6a6..000000000 --- a/ui/src/app/metadata/configuration/container/configuration.component.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { Component, ChangeDetectionStrategy, OnDestroy } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { takeUntil, map } from 'rxjs/operators'; -import { Store } from '@ngrx/store'; -import { Observable, Subject } from 'rxjs'; - -import * as fromConfiguration from '../reducer'; - -import { ClearConfiguration, SetMetadata } from '../action/configuration.action'; -import * as fromReducer from '../reducer'; - -@Component({ - selector: 'configuration-page', - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './configuration.component.html', - styleUrls: [] -}) -export class ConfigurationComponent implements OnDestroy { - private ngUnsubscribe: Subject = new Subject(); - - name$: Observable; - type$: Observable; - - constructor( - private store: Store, - private routerState: ActivatedRoute - ) { - this.routerState.params.pipe( - takeUntil(this.ngUnsubscribe), - map(({ id, type, version }) => new SetMetadata({ - id, - type, - version - })) - ).subscribe(this.store); - - this.name$ = this.store.select(fromReducer.getConfigurationModelName); - this.type$ = this.store.select(fromReducer.getConfigurationModelType); - } - - ngOnDestroy() { - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - this.store.dispatch(new ClearConfiguration()); - } -} diff --git a/ui/src/app/metadata/configuration/container/metadata-comparison.component.html b/ui/src/app/metadata/configuration/container/metadata-comparison.component.html deleted file mode 100644 index 4c4d58ff2..000000000 --- a/ui/src/app/metadata/configuration/container/metadata-comparison.component.html +++ /dev/null @@ -1,55 +0,0 @@ -

- Compare - Source - Provider - Configuration -

-
-
- -   - Version History - - -
- - -
-

- Metadata Filter -

-
- - - - - -
- -
- -
-
-
-
-
- - Loading... -
\ No newline at end of file diff --git a/ui/src/app/metadata/configuration/container/metadata-comparison.component.spec.ts b/ui/src/app/metadata/configuration/container/metadata-comparison.component.spec.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/ui/src/app/metadata/configuration/container/metadata-comparison.component.ts b/ui/src/app/metadata/configuration/container/metadata-comparison.component.ts deleted file mode 100644 index 8fb4a817b..000000000 --- a/ui/src/app/metadata/configuration/container/metadata-comparison.component.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { Component, ChangeDetectionStrategy, OnDestroy } from '@angular/core'; -import { Observable, BehaviorSubject, Subscription } from 'rxjs'; -import { Store } from '@ngrx/store'; -import { ActivatedRoute } from '@angular/router'; -import { map, withLatestFrom } from 'rxjs/operators'; -import { ConfigurationState, getComparisonConfigurationCount } from '../reducer'; -import { CompareVersionRequest, ClearVersions, ViewChanged } from '../action/compare.action'; -import { MetadataConfiguration, FilterConfiguration } from '../model/metadata-configuration'; -import * as fromReducer from '../reducer'; -import { CompareFilterVersions, ClearFilterComparison } from '../action/filter.action'; -import { FilterComparison } from '../model/compare'; - -@Component({ - selector: 'metadata-comparison', - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './metadata-comparison.component.html', - styleUrls: [] -}) -export class MetadataComparisonComponent implements OnDestroy { - - limiter: BehaviorSubject = new BehaviorSubject(false); - - versions$: Observable = this.store.select(fromReducer.getLimitedComparisonConfigurations); - numVersions$: Observable = this.store.select(getComparisonConfigurationCount); - type$: Observable = this.store.select(fromReducer.getConfigurationModelType); - loading$: Observable = this.store.select(fromReducer.getComparisonLoading); - limited$: Observable = this.store.select(fromReducer.getViewChangedOnly); - sub: Subscription; - filters$: Observable = this.store.select(fromReducer.getComparisonFilterConfiguration); - filterCompare$: Observable = this.store.select(fromReducer.getLimitedFilterComparisonConfiguration); - isProvider$: Observable = this.type$.pipe(map(t => t !== 'resolver')); - - constructor( - private store: Store, - private activatedRoute: ActivatedRoute - ) { - this.activatedRoute.queryParams.pipe( - map(params => params.versions), - map(versions => Array.isArray(versions) ? versions : [versions]), - map(versions => new CompareVersionRequest(versions)) - ).subscribe(this.store); - - this.sub = this.limiter.pipe( - withLatestFrom(this.limited$), - map(([compare, limit]) => new ViewChanged(!limit)) - ).subscribe(this.store); - } - - compareFilters (comparison: FilterComparison) { - this.store.dispatch(new CompareFilterVersions(comparison)); - } - - resetCompareFilters () { - this.store.dispatch(new ClearFilterComparison()); - } - - ngOnDestroy(): void { - this.sub.unsubscribe(); - this.store.dispatch(new ClearVersions()); - this.resetCompareFilters(); - } -} diff --git a/ui/src/app/metadata/configuration/container/metadata-history.component.html b/ui/src/app/metadata/configuration/container/metadata-history.component.html deleted file mode 100644 index 23c2b4595..000000000 --- a/ui/src/app/metadata/configuration/container/metadata-history.component.html +++ /dev/null @@ -1,13 +0,0 @@ -

- Version History -

-
- -
-
- - Loading... -
\ No newline at end of file diff --git a/ui/src/app/metadata/configuration/container/metadata-history.component.spec.ts b/ui/src/app/metadata/configuration/container/metadata-history.component.spec.ts deleted file mode 100644 index 4a322ee3c..000000000 --- a/ui/src/app/metadata/configuration/container/metadata-history.component.spec.ts +++ /dev/null @@ -1,126 +0,0 @@ -import { Component, ViewChild, Input, EventEmitter, Output } from '@angular/core'; -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { MetadataHistoryComponent } from './metadata-history.component'; -import { MetadataHistory } from '../model/history'; -import { MetadataVersion } from '../model/version'; -import { MetadataHistoryService } from '../service/history.service'; -import { of } from 'rxjs'; -import { StoreModule, combineReducers } from '@ngrx/store'; -import * as fromConfiguration from '../reducer'; -import { Router, ActivatedRoute } from '@angular/router'; -import { RouterStub } from '../../../../testing/router.stub'; -import { ActivatedRouteStub } from '../../../../testing/activated-route.stub'; - -export const TestData = { - versions: [ - { - id: '1', - date: new Date().toDateString(), - creator: 'admin' - } - ] -}; - -@Component({ - selector: 'history-list', - template: `` -}) -class MockHistoryListComponent { - @Input() history: MetadataHistory; - @Output() compare: EventEmitter = new EventEmitter(); - @Output() restore: EventEmitter = new EventEmitter(); -} - -const MockHistoryService = { - query: () => of(TestData) -}; - -describe('Metadata Version History Component', () => { - let fixture: ComponentFixture; - let instance: MetadataHistoryComponent; - let router: Router; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - { - provide: MetadataHistoryService, useValue: MockHistoryService - }, - { - provide: Router, useClass: RouterStub - }, - { - provide: ActivatedRoute, useClass: ActivatedRouteStub - } - ], - imports: [ - MockI18nModule, - StoreModule.forRoot({ - 'metadata-configuration': combineReducers(fromConfiguration.reducers), - }), - ], - declarations: [ - MockHistoryListComponent, - MetadataHistoryComponent - ], - }); - - fixture = TestBed.createComponent(MetadataHistoryComponent); - instance = fixture.componentInstance; - router = TestBed.get(Router); - spyOn(router, 'navigate'); - fixture.detectChanges(); - }); - - it('should compile', () => { - expect(instance).toBeDefined(); - }); - - describe('compare versions method', () => { - it('should call the router.navigate method', () => { - instance.compareVersions(TestData.versions); - expect(router.navigate).toHaveBeenCalled(); - }); - }); - - describe('sortVersionsByDate method', () => { - it('should sort the versions by their date', () => { - const nowTime = new Date().getTime(); - const futureTime = nowTime + 10000; - const beforeTime = nowTime - 10000; - const nowDate = new Date(nowTime); - const futureDate = new Date(futureTime); - const beforeDate = new Date(beforeTime); - - const versions = [ - { - id: 'foo', - creator: 'bar', - date: nowDate.toISOString() - }, - { - id: 'bar', - creator: 'baz', - date: beforeDate.toISOString() - }, - { - id: 'baz', - creator: 'foo', - date: beforeDate.toISOString() - }, - { - id: 'baz2', - creator: 'foo', - date: futureDate.toISOString() - } - ]; - - const sorted = instance.sortVersionsByDate(versions); - expect(sorted[0].id).toEqual('baz2'); - expect(sorted[1].id).toEqual('foo'); - expect(sorted[2].id).toEqual('baz'); - expect(sorted[3].id).toEqual('bar'); - }); - }); -}); diff --git a/ui/src/app/metadata/configuration/container/metadata-history.component.ts b/ui/src/app/metadata/configuration/container/metadata-history.component.ts deleted file mode 100644 index c2c1d0a1a..000000000 --- a/ui/src/app/metadata/configuration/container/metadata-history.component.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { Component, ChangeDetectionStrategy, OnDestroy } from '@angular/core'; -import { Observable, combineLatest, Subject } from 'rxjs'; -import { Store } from '@ngrx/store'; -import { - ConfigurationState, - getVersionCollection, - getConfigurationModelId, - getConfigurationModelKind, - getHistoryLoading -} from '../reducer'; -import { MetadataVersion } from '../model/version'; -import { Router, ActivatedRoute } from '@angular/router'; -import { map, takeUntil } from 'rxjs/operators'; -import { LoadHistoryRequest, ClearHistory } from '../action/history.action'; - -@Component({ - selector: 'metadata-history', - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './metadata-history.component.html', - styleUrls: [] -}) -export class MetadataHistoryComponent implements OnDestroy { - - private ngUnsubscribe: Subject = new Subject(); - - history$: Observable; - loading$: Observable = this.store.select(getHistoryLoading); - - constructor( - private store: Store, - private router: Router, - private route: ActivatedRoute - ) { - combineLatest( - this.store.select(getConfigurationModelId), - this.store.select(getConfigurationModelKind) - ).pipe( - takeUntil(this.ngUnsubscribe), - map(([id, kind]) => ({ id, type: kind })), - map(request => new LoadHistoryRequest(request)) - ).subscribe(store); - - this.history$ = this.store.select(getVersionCollection) - .pipe(map(versions => this.sortVersionsByDate(versions))); - } - - sortVersionsByDate(versions: MetadataVersion[]): MetadataVersion[] { - return versions.sort((a, b) => { - const aDate = new Date(a.date).getTime(); - const bDate = new Date(b.date).getTime(); - return aDate === bDate ? 0 : aDate < bDate ? -1 : 1; - }).reverse(); - } - - compareVersions(versions: MetadataVersion[]): void { - const sorted = this.sortVersionsByDate(versions); - this.router.navigate( - ['../', 'compare'], - { - queryParams: { versions: sorted.map(v => v.id) }, - relativeTo: this.route - } - ); - } - - restoreVersion(version: MetadataVersion): void { - this.router.navigate( - [ '../', 'version', version.id, 'restore' ], - { - relativeTo: this.route - } - ); - } - - ngOnDestroy() { - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - this.store.dispatch(new ClearHistory()); - } -} diff --git a/ui/src/app/metadata/configuration/container/metadata-options.component.html b/ui/src/app/metadata/configuration/container/metadata-options.component.html deleted file mode 100644 index 5f210a630..000000000 --- a/ui/src/app/metadata/configuration/container/metadata-options.component.html +++ /dev/null @@ -1,84 +0,0 @@ -

- Source - Provider - Configuration -

- \ No newline at end of file diff --git a/ui/src/app/metadata/configuration/container/metadata-options.component.spec.ts b/ui/src/app/metadata/configuration/container/metadata-options.component.spec.ts deleted file mode 100644 index 277e66a47..000000000 --- a/ui/src/app/metadata/configuration/container/metadata-options.component.spec.ts +++ /dev/null @@ -1,151 +0,0 @@ -import { Component, ViewChild, Input } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule, SpyNgModuleFactoryLoader } from '@angular/router/testing'; -import { StoreModule, combineReducers, Store } from '@ngrx/store'; -import { NgbDropdownModule, NgbModalModule, NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; - -import { MetadataConfiguration } from '../model/metadata-configuration'; -import * as fromConfiguration from '../reducer'; -import * as fromFilters from '../../filter/reducer'; -import * as fromProviders from '../../provider/reducer'; -import * as fromResolvers from '../../resolver/reducer'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { MetadataOptionsComponent } from './metadata-options.component'; -import { CommonModule, ViewportScroller } from '@angular/common'; - -import { - MetadataConfigurationComponentStub, - MetadataHeaderComponentStub -} from '../../../../testing/metadata-configuration.stub'; -import { - FilterConfigurationListComponentStub -} from '../../../../testing/filter-list.stub'; -import { Metadata } from '../../domain/domain.type'; -import { FilterActionTypes } from '../../filter/action/filter.action'; -import { FilterCollectionActionTypes } from '../../filter/action/collection.action'; -import { MetadataFilter } from '../../domain/model'; -import { NgbModalStub } from '../../../../testing/modal.stub'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(MetadataOptionsComponent, {static: true}) - public componentUnderTest: MetadataOptionsComponent; - - configuration: MetadataConfiguration = { - dates: [], - sections: [] - }; -} - -describe('Metadata Options Page Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: MetadataOptionsComponent; - let store: Store; - let dispatchSpy; - let scroller: ViewportScroller; - let filter = { - type: 'EntityAttributesFilter', - resourceId: 'foo', - name: 'name', - createdBy: 'admin' - } as MetadataFilter; - let modal: NgbModal; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - StoreModule.forRoot({ - 'metadata-configuration': combineReducers(fromConfiguration.reducers), - 'filter': combineReducers(fromFilters.reducers), - 'provider': combineReducers(fromProviders.reducers), - 'resolver': combineReducers(fromResolvers.reducers) - }), - MockI18nModule, - RouterTestingModule, - CommonModule - ], - declarations: [ - MetadataOptionsComponent, - MetadataConfigurationComponentStub, - MetadataHeaderComponentStub, - TestHostComponent, - FilterConfigurationListComponentStub - ], - providers: [ - { - provide: NgbModal, - useClass: NgbModalStub - } - ] - }).compileComponents(); - - store = TestBed.get(Store); - scroller = TestBed.get(ViewportScroller); - modal = TestBed.get(NgbModal); - dispatchSpy = spyOn(store, 'dispatch'); - spyOn(store, 'select').and.callThrough(); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should load metadata objects', waitForAsync(() => { - expect(app).toBeTruthy(); - expect(store.select).toHaveBeenCalled(); - })); - - describe('setModel method', () => { - it('should set the id and kind attributes on the component', () => { - app.setModel({ id: 'foo' } as Metadata); - expect(app.id).toBe('foo'); - expect(app.kind).toBe('resolver'); - }); - - it('should dispatch a LoadFilterRequest event if the provided model is a provider', () => { - app.setModel({resourceId: 'foo', '@type': 'FileBackedHttpMetadataResolver'} as Metadata); - expect(store.dispatch).toHaveBeenCalled(); - expect(dispatchSpy.calls.mostRecent().args[0].type).toBe(FilterCollectionActionTypes.LOAD_FILTER_REQUEST); - }); - }); - - describe('onScrollTo', () => { - it('should call the viewportscroller', () => { - spyOn(scroller, 'scrollToAnchor'); - app.onScrollTo('fragment'); - expect(scroller.scrollToAnchor).toHaveBeenCalled(); - }); - }); - - describe('order methods', () => { - it('updateOrderUp should dispatch a ChangeFilterOrderUp action', () => { - app.updateOrderUp(filter); - expect(store.dispatch).toHaveBeenCalled(); - expect(dispatchSpy.calls.mostRecent().args[0].type).toBe(FilterCollectionActionTypes.CHANGE_FILTER_ORDER_UP); - }); - - it('updateOrderDown should dispatch a ChangeFilterOrderDown action', () => { - app.updateOrderDown(filter); - expect(store.dispatch).toHaveBeenCalled(); - expect(dispatchSpy.calls.mostRecent().args[0].type).toBe(FilterCollectionActionTypes.CHANGE_FILTER_ORDER_DOWN); - }); - }); - - describe('removeFilter method', () => { - it('should open a modal', () => { - spyOn(modal, 'open').and.returnValue({ - result: Promise.resolve(true) - } as NgbModalRef); - app.removeFilter('foo'); - expect(modal.open).toHaveBeenCalled(); - }); - }); -}); diff --git a/ui/src/app/metadata/configuration/container/metadata-options.component.ts b/ui/src/app/metadata/configuration/container/metadata-options.component.ts deleted file mode 100644 index 96cc49c2d..000000000 --- a/ui/src/app/metadata/configuration/container/metadata-options.component.ts +++ /dev/null @@ -1,148 +0,0 @@ -import { Store } from '@ngrx/store'; -import { Component, ChangeDetectionStrategy, OnDestroy } from '@angular/core'; -import { Observable, Subject } from 'rxjs'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { Router, ActivatedRoute } from '@angular/router'; -import { ViewportScroller } from '@angular/common'; -import { takeUntil, filter, withLatestFrom } from 'rxjs/operators'; - -import { - ConfigurationState, - getConfigurationSections, - getSelectedIsCurrent, - getConfigurationModelEnabled, - getConfigurationHasXml, - getConfigurationModel, - getConfigurationModelType -} from '../reducer'; -import { MetadataConfiguration } from '../model/metadata-configuration'; -import { MetadataEntity, MetadataFilter, MetadataResolver } from '../../domain/model'; -import { getAdditionalFilters } from '../../filter/reducer'; -import { - ClearFilters, - LoadFilterRequest, - ChangeFilterOrderDown, - ChangeFilterOrderUp, - RemoveFilterRequest -} from '../../filter/action/collection.action'; - -import { Metadata } from '../../domain/domain.type'; -import { DeleteFilterComponent } from '../../provider/component/delete-filter.component'; -import { ClearHistory } from '../action/history.action'; -import { DeleteDialogComponent } from '../../manager/component/delete-dialog.component'; -import { RemoveDraftRequest } from '../../resolver/action/draft.action'; -import { RemoveResolverRequest } from '../../resolver/action/collection.action'; -import { RemoveMetadataRequest } from '../../../admin/action/metadata-collection.action'; - -@Component({ - selector: 'metadata-options-page', - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './metadata-options.component.html', - styleUrls: [] -}) -export class MetadataOptionsComponent implements OnDestroy { - - protected ngUnsubscribe: Subject = new Subject(); - - configuration$: Observable = this.store.select(getConfigurationSections); - isEnabled$: Observable = this.store.select(getConfigurationModelEnabled); - isCurrent$: Observable = this.store.select(getSelectedIsCurrent); - hasXml$: Observable = this.store.select(getConfigurationHasXml); - filters$: Observable = this.store.select(getAdditionalFilters); - model$: Observable = this.store.select(getConfigurationModel); - type$: Observable = this.store.select(getConfigurationModelType); - id: string; - kind: string; - - constructor( - protected store: Store, - protected modalService: NgbModal, - protected scroller: ViewportScroller, - protected router: Router, - protected activatedRoute: ActivatedRoute - ) { - this.model$ - .pipe( - takeUntil(this.ngUnsubscribe), - filter(model => !!model) - ) - .subscribe(p => this.setModel(p)); - - const sub = this.filters$.pipe( - withLatestFrom(this.activatedRoute.fragment) - ).subscribe(([filters, fragment]) => { - if (filters && fragment) { - setTimeout(() => { - scroller.scrollToAnchor(fragment); - sub.unsubscribe(); - }, 100); - } - }); - } - - edit(id: string) { - this.router.navigate(['../', 'edit', id], { relativeTo: this.activatedRoute.parent }); - } - - setModel(data: Metadata): void { - this.id = 'resourceId' in data ? data.resourceId : data.id; - this.kind = '@type' in data ? 'provider' : 'resolver'; - if (this.kind === 'provider') { - this.store.dispatch(new LoadFilterRequest(this.id)); - } - } - - onScrollTo(element): void { - this.scroller.scrollToAnchor(element); - } - - updateOrderUp(filter: MetadataFilter): void { - this.store.dispatch(new ChangeFilterOrderUp({ - id: filter.resourceId, - providerId: this.activatedRoute.snapshot.params.providerId - })); - } - - updateOrderDown(filter: MetadataFilter): void { - this.store.dispatch(new ChangeFilterOrderDown({ - id: filter.resourceId, - providerId: this.activatedRoute.snapshot.params.providerId - })); - } - - removeFilter(id: string): void { - this.modalService - .open(DeleteFilterComponent) - .result - .then( - success => { - this.store.dispatch(new RemoveFilterRequest(id)); - }, - err => { - console.log('Cancelled'); - } - ); - } - - deleteResolver(id: string): void { - this.modalService - .open(DeleteDialogComponent) - .result - .then( - success => { - this.store.dispatch(new RemoveMetadataRequest(id)); - }, - err => { - console.log('Cancelled'); - } - ); - } - - ngOnDestroy(): void { - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - - this.store.dispatch(new ClearFilters()); - this.store.dispatch(new ClearHistory()); - } -} diff --git a/ui/src/app/metadata/configuration/container/metadata-xml.component.html b/ui/src/app/metadata/configuration/container/metadata-xml.component.html deleted file mode 100644 index 8a74ab376..000000000 --- a/ui/src/app/metadata/configuration/container/metadata-xml.component.html +++ /dev/null @@ -1,32 +0,0 @@ -

- Source - Provider - Configuration -

-
- -
-
-
{{ xml$ | async }}
-
- {{ xml$ | async }} -
-
- - -
-
\ No newline at end of file diff --git a/ui/src/app/metadata/configuration/container/metadata-xml.component.spec.ts b/ui/src/app/metadata/configuration/container/metadata-xml.component.spec.ts deleted file mode 100644 index 03d4d3a88..000000000 --- a/ui/src/app/metadata/configuration/container/metadata-xml.component.spec.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { Component, ViewChild, Input } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, combineReducers, Store } from '@ngrx/store'; -import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; - -import { MetadataConfiguration } from '../model/metadata-configuration'; -import * as fromConfiguration from '../reducer'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { MetadataXmlComponent } from './metadata-xml.component'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(MetadataXmlComponent, {static: true}) - public componentUnderTest: MetadataXmlComponent; -} - -describe('Metadata Xml Page Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: MetadataXmlComponent; - let store: Store; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - StoreModule.forRoot({ - 'metadata-configuration': combineReducers(fromConfiguration.reducers), - }), - MockI18nModule, - RouterTestingModule - ], - declarations: [ - MetadataXmlComponent, - TestHostComponent - ], - }).compileComponents(); - - store = TestBed.get(Store); - spyOn(store, 'dispatch'); - spyOn(store, 'select'); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should load metadata objects', waitForAsync(() => { - expect(app).toBeTruthy(); - expect(store.select).toHaveBeenCalledTimes(3); - })); - - describe('preview method', () => { - it('should dispatch an action', () => { - app.preview(); - expect(store.dispatch).toHaveBeenCalled(); - }); - }); -}); diff --git a/ui/src/app/metadata/configuration/container/metadata-xml.component.ts b/ui/src/app/metadata/configuration/container/metadata-xml.component.ts deleted file mode 100644 index b49a06184..000000000 --- a/ui/src/app/metadata/configuration/container/metadata-xml.component.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Store } from '@ngrx/store'; -import { Component } from '@angular/core'; -import { Observable } from 'rxjs'; - -import * as fromConfiguration from '../reducer'; -import { Metadata } from '../../domain/domain.type'; -import { DownloadXml } from '../action/configuration.action'; - -@Component({ - selector: 'metadata-xml-page', - templateUrl: './metadata-xml.component.html', - styleUrls: [] -}) -export class MetadataXmlComponent { - - entity: Metadata; - entity$: Observable; - xml: string; - xml$: Observable; - type$: Observable; - - constructor( - private store: Store - ) { - this.xml$ = this.store.select(fromConfiguration.getConfigurationXml); - this.entity$ = this.store.select(fromConfiguration.getConfigurationModel); - this.type$ = this.store.select(fromConfiguration.getConfigurationModelType); - } - - preview(): void { - this.store.dispatch(new DownloadXml()); - } -} diff --git a/ui/src/app/metadata/configuration/container/restore-edit-step.component.html b/ui/src/app/metadata/configuration/container/restore-edit-step.component.html deleted file mode 100644 index be953b86b..000000000 --- a/ui/src/app/metadata/configuration/container/restore-edit-step.component.html +++ /dev/null @@ -1,9 +0,0 @@ - \ No newline at end of file diff --git a/ui/src/app/metadata/configuration/container/restore-edit-step.component.spec.ts b/ui/src/app/metadata/configuration/container/restore-edit-step.component.spec.ts deleted file mode 100644 index d0608169f..000000000 --- a/ui/src/app/metadata/configuration/container/restore-edit-step.component.spec.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { Component, ViewChild, NO_ERRORS_SCHEMA } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, combineReducers, Store } from '@ngrx/store'; -import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; - -import { RestoreEditStepComponent } from './restore-edit-step.component'; -import * as fromConfiguration from '../reducer'; -import * as fromProviders from '../../provider/reducer'; -import * as fromResolvers from '../../resolver/reducer'; -import * as fromWizard from '../../../wizard/reducer'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; - -import { - RestoreActionTypes -} from '../action/restore.action'; -import { WizardActionTypes } from '../../../wizard/action/wizard.action'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(RestoreEditStepComponent, {static: true}) - public componentUnderTest: RestoreEditStepComponent; -} - -describe('Restore Version Edit Step Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: RestoreEditStepComponent; - let store: Store; - let dispatchSpy; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - StoreModule.forRoot({ - 'metadata-configuration': combineReducers(fromConfiguration.reducers), - 'provider': combineReducers(fromProviders.reducers), - 'resolver': combineReducers(fromResolvers.reducers), - 'wizard': combineReducers(fromWizard.reducers) - }), - MockI18nModule, - RouterTestingModule - ], - declarations: [ - RestoreEditStepComponent, - TestHostComponent - ], - schemas: [ - NO_ERRORS_SCHEMA - ] - }).compileComponents(); - - store = TestBed.get(Store); - dispatchSpy = spyOn(store, 'dispatch'); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should compile', () => { - expect(app).toBeTruthy(); - }); - - describe('onChange', () => { - it('should dispatch an update changes event', () => { - app.onChange({ name: 'test' }); - expect(store.dispatch).toHaveBeenCalled(); - expect(dispatchSpy.calls.mostRecent().args[0].type).toBe(RestoreActionTypes.UPDATE_RESTORATION_REQUEST); - }); - }); - - describe('updateStatus', () => { - it('should dispatch an update form status event', () => { - app.updateStatus({ value: 'foo' }, 'common'); - expect(store.dispatch).toHaveBeenCalled(); - expect(dispatchSpy.calls.mostRecent().args[0].type).toBe(RestoreActionTypes.UPDATE_STATUS); - }); - - it('should dispatch an update form status event', () => { - app.updateStatus({}, 'common'); - expect(store.dispatch).toHaveBeenCalled(); - expect(dispatchSpy.calls.mostRecent().args[0].type).toBe(RestoreActionTypes.UPDATE_STATUS); - }); - }); - - describe('updateLock', () => { - it('should dispatch a LockEditor event when passed a locked status', () => { - app.updateLock(true); - expect(store.dispatch).toHaveBeenCalled(); - expect(dispatchSpy.calls.mostRecent().args[0].type).toBe(WizardActionTypes.LOCK); - }); - - it('should dispatch a UnlockEditor event when passed a locked status', () => { - app.updateLock(false); - expect(store.dispatch).toHaveBeenCalled(); - expect(dispatchSpy.calls.mostRecent().args[0].type).toBe(WizardActionTypes.UNLOCK); - }); - }); -}); diff --git a/ui/src/app/metadata/configuration/container/restore-edit-step.component.ts b/ui/src/app/metadata/configuration/container/restore-edit-step.component.ts deleted file mode 100644 index 2a9a73a0e..000000000 --- a/ui/src/app/metadata/configuration/container/restore-edit-step.component.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { Component, OnDestroy } from '@angular/core'; -import { Observable, combineLatest, of, Subject } from 'rxjs'; -import { ActivatedRoute } from '@angular/router'; -import { Store } from '@ngrx/store'; -import { - ConfigurationState, getFormattedModel -} from '../reducer'; -import { getWizardDefinition, getSchema, getValidators, getCurrent, getWizardIndex } from '../../../wizard/reducer'; -import { Wizard, WizardStep } from '../../../wizard/model'; -import { Metadata } from '../../domain/domain.type'; -import { map, switchMap, withLatestFrom, filter } from 'rxjs/operators'; -import { NAV_FORMATS } from '../../domain/component/editor-nav.component'; -import { UpdateRestorationChangesRequest, UpdateRestoreFormStatus } from '../action/restore.action'; -import { LockEditor, UnlockEditor } from '../../../wizard/action/wizard.action'; -import { takeUntil } from 'rxjs/operators'; - -@Component({ - selector: 'restore-edit-step', - templateUrl: './restore-edit-step.component.html', - styleUrls: [] -}) - -export class RestoreEditStepComponent implements OnDestroy { - - private ngUnsubscribe: Subject = new Subject(); - - readonly lockChange$: Subject = new Subject(); - readonly statusChange$: Subject = new Subject(); - - definition$: Observable> = this.store.select(getWizardDefinition); - schema$: Observable = this.store.select(getSchema); - model$: Observable = this.store.select(getFormattedModel); - step$: Observable = this.store.select(getCurrent); - - lockable$: Observable = this.step$.pipe(filter(s => !!s), map(step => step.locked)); - - validators$: Observable; - - formats = NAV_FORMATS; - - constructor( - private store: Store - ) { - this.validators$ = this.definition$.pipe( - filter(def => !!def), - map(def => def.validatorParams), - switchMap(params => combineLatest(params.map(p => this.store.select(p)))), - switchMap(selections => this.store.select(getValidators(selections))) - ); - - this.step$ - .pipe(takeUntil(this.ngUnsubscribe), filter(step => !!step)) - .subscribe(s => this.lockChange$.next(s.locked ? true : false)); - - this.lockChange$ - .pipe(takeUntil(this.ngUnsubscribe)) - .subscribe(locked => this.updateLock(locked)); - - this.statusChange$ - .pipe( - takeUntil(this.ngUnsubscribe), - withLatestFrom(this.store.select(getWizardIndex)) - ) - .subscribe(([errors, currentPage]) => this.updateStatus(errors, currentPage)); - } - - onChange(changes: any): void { - this.store.dispatch(new UpdateRestorationChangesRequest(changes)); - } - - updateStatus(errors, currentPage) { - const status = { [currentPage]: !(errors.value) ? 'VALID' : 'INVALID' }; - this.store.dispatch(new UpdateRestoreFormStatus(status)); - } - - updateLock(locked: boolean) { - this.store.dispatch(locked ? new LockEditor() : new UnlockEditor()); - } - - ngOnDestroy() { - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - } -} diff --git a/ui/src/app/metadata/configuration/container/restore-edit.component.html b/ui/src/app/metadata/configuration/container/restore-edit.component.html deleted file mode 100644 index 7b1569f9a..000000000 --- a/ui/src/app/metadata/configuration/container/restore-edit.component.html +++ /dev/null @@ -1,50 +0,0 @@ -
-
-
- - -
-
- -   - -
-
-
- - All forms must be valid before changes can be saved! -
-
-
-
-
-
- - -
-
- -
-
-
- diff --git a/ui/src/app/metadata/configuration/container/restore-edit.component.spec.ts b/ui/src/app/metadata/configuration/container/restore-edit.component.spec.ts deleted file mode 100644 index 2388e6c97..000000000 --- a/ui/src/app/metadata/configuration/container/restore-edit.component.spec.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { Component, ViewChild, NO_ERRORS_SCHEMA } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, combineReducers, Store } from '@ngrx/store'; -import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; - -import { RestoreEditComponent } from './restore-edit.component'; -import * as fromConfiguration from '../reducer'; -import * as fromProviders from '../../provider/reducer'; -import * as fromResolvers from '../../resolver/reducer'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { RestoreActionTypes } from '../action/restore.action'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(RestoreEditComponent, {static: true}) - public componentUnderTest: RestoreEditComponent; -} - -describe('Restore Version Edit Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: RestoreEditComponent; - let store: Store; - let dispatchSpy; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - StoreModule.forRoot({ - 'metadata-configuration': combineReducers(fromConfiguration.reducers), - 'provider': combineReducers(fromProviders.reducers), - 'resolver': combineReducers(fromResolvers.reducers) - }), - MockI18nModule, - RouterTestingModule - ], - declarations: [ - RestoreEditComponent, - TestHostComponent - ], - schemas: [ NO_ERRORS_SCHEMA ] - }).compileComponents(); - - store = TestBed.get(Store); - dispatchSpy = spyOn(store, 'dispatch'); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should compile', () => { - expect(app).toBeTruthy(); - }); - - describe('save', () => { - it('should dispatch a save request event', () => { - app.save(); - expect(store.dispatch).toHaveBeenCalled(); - expect(dispatchSpy.calls.mostRecent().args[0].type).toBe(RestoreActionTypes.RESTORE_VERSION_REQUEST); - }); - }); - - describe('cancel', () => { - it('should dispatch a cancel request event', () => { - app.cancel(); - expect(store.dispatch).toHaveBeenCalled(); - expect(dispatchSpy.calls.mostRecent().args[0].type).toBe(RestoreActionTypes.CANCEL_RESTORE); - }); - }); -}); diff --git a/ui/src/app/metadata/configuration/container/restore-edit.component.ts b/ui/src/app/metadata/configuration/container/restore-edit.component.ts deleted file mode 100644 index 3ca9c6648..000000000 --- a/ui/src/app/metadata/configuration/container/restore-edit.component.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { Component } from '@angular/core'; -import { Observable } from 'rxjs'; -import { Store } from '@ngrx/store'; -import { - ConfigurationState, - getConfigurationModelKind, - getRestorationIsSaving, - getRestorationIsValid, - getInvalidRestorationForms -} from '../../configuration/reducer'; -import { RestoreVersionRequest, CancelRestore } from '../action/restore.action'; -import { NAV_FORMATS } from '../../domain/component/editor-nav.component'; -import { Metadata } from '../../domain/domain.type'; -import { getVersionModel } from '../reducer'; -import { map } from 'rxjs/operators'; - - -@Component({ - selector: 'restore-edit', - templateUrl: './restore-edit.component.html', - styleUrls: [] -}) - -export class RestoreEditComponent { - - model$: Observable = this.store.select(getVersionModel); - kind$: Observable = this.store.select(getConfigurationModelKind); - - isInvalid$: Observable = this.store.select(getRestorationIsValid).pipe(map(v => !v)); - status$: Observable = this.store.select(getInvalidRestorationForms); - isSaving$: Observable = this.store.select(getRestorationIsSaving); - - validators$: Observable; - - formats = NAV_FORMATS; - - constructor( - private store: Store - ) {} - - save() { - this.store.dispatch(new RestoreVersionRequest()); - } - - cancel() { - this.store.dispatch(new CancelRestore()); - } -} - diff --git a/ui/src/app/metadata/configuration/container/restore.component.html b/ui/src/app/metadata/configuration/container/restore.component.html deleted file mode 100644 index 51115e922..000000000 --- a/ui/src/app/metadata/configuration/container/restore.component.html +++ /dev/null @@ -1,25 +0,0 @@ - -

- - Restore Version ( date ) - -

-
-
-
-

- Create New Version from Previous Settings -

-

- Restoring this version will copy the Version ( date ) configuration and create a new Version from the selected version settings. You can then edit the configuration before saving the new version. -

-   - -
-
-
-
-
- - Loading... -
\ No newline at end of file diff --git a/ui/src/app/metadata/configuration/container/restore.component.spec.ts b/ui/src/app/metadata/configuration/container/restore.component.spec.ts deleted file mode 100644 index 45590e342..000000000 --- a/ui/src/app/metadata/configuration/container/restore.component.spec.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { Component, ViewChild, Input } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, combineReducers, Store } from '@ngrx/store'; -import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; - -import * as fromConfiguration from '../reducer'; -import * as fromProviders from '../../provider/reducer'; -import * as fromResolvers from '../../resolver/reducer'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { RestoreComponent } from './restore.component'; -import { of } from 'rxjs'; -import { DatePipe } from '@angular/common'; -import { Router } from '@angular/router'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(RestoreComponent, {static: true}) - public componentUnderTest: RestoreComponent; -} - -describe('Metadata Restore Page Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: RestoreComponent; - let store: Store; - let router: Router; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - StoreModule.forRoot({ - 'metadata-configuration': combineReducers(fromConfiguration.reducers), - 'provider': combineReducers(fromProviders.reducers), - 'resolver': combineReducers(fromResolvers.reducers) - }), - MockI18nModule, - RouterTestingModule - ], - declarations: [ - RestoreComponent, - TestHostComponent - ], - providers: [ - DatePipe - ] - }).compileComponents(); - - store = TestBed.get(Store); - router = TestBed.get(Router); - spyOn(store, 'dispatch'); - spyOn(store, 'select').and.callFake(() => of(new Date().toDateString())); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should load metadata objects', waitForAsync(() => { - expect(app).toBeTruthy(); - expect(store.select).toHaveBeenCalledTimes(2); - expect(store.dispatch).not.toHaveBeenCalled(); - })); - - describe('restore method', () => { - it('should navigate to the restore edit page', () => { - spyOn(router, 'navigate').and.callThrough(); - app.restore(); - expect(router.navigate).toHaveBeenCalled(); - }); - }); -}); diff --git a/ui/src/app/metadata/configuration/container/restore.component.ts b/ui/src/app/metadata/configuration/container/restore.component.ts deleted file mode 100644 index 75d1f2752..000000000 --- a/ui/src/app/metadata/configuration/container/restore.component.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { Component, ChangeDetectionStrategy } from '@angular/core'; -import { Store } from '@ngrx/store'; -import { Observable } from 'rxjs'; - -import * as fromConfiguration from '../reducer'; -import { CONFIG_DATE_FORMAT } from '../configuration.values'; -import { CancelRestore } from '../action/restore.action'; -import { map } from 'rxjs/operators'; - -import { DatePipe } from '@angular/common'; -import { Router, ActivatedRoute } from '@angular/router'; - -@Component({ - selector: 'restore-component', - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './restore.component.html', - styleUrls: [] -}) -export class RestoreComponent { - - dateString$ = this.store.select(fromConfiguration.getConfigurationVersionDate); - loading$ = this.store.select(fromConfiguration.getVersionLoading); - loaded$ = this.loading$.pipe(map(loading => !loading)); - date$: Observable; - - constructor( - private store: Store, - private datePipe: DatePipe, - private router: Router, - private route: ActivatedRoute - ) { - this.date$ = this.dateString$.pipe(map((date) => this.datePipe.transform(date, CONFIG_DATE_FORMAT))); - } - - restore() { - this.router.navigate(['../', 'edit', 'common'], { relativeTo: this.route }); - } - - cancel() { - this.store.dispatch(new CancelRestore()); - } -} diff --git a/ui/src/app/metadata/configuration/container/version-options.component.html b/ui/src/app/metadata/configuration/container/version-options.component.html deleted file mode 100644 index 837d42626..000000000 --- a/ui/src/app/metadata/configuration/container/version-options.component.html +++ /dev/null @@ -1,46 +0,0 @@ -

- Source - Provider - Configuration -

- -
- - Loading... -
\ No newline at end of file diff --git a/ui/src/app/metadata/configuration/container/version-options.component.spec.ts b/ui/src/app/metadata/configuration/container/version-options.component.spec.ts deleted file mode 100644 index cbdf6f18f..000000000 --- a/ui/src/app/metadata/configuration/container/version-options.component.spec.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { Component, ViewChild, NO_ERRORS_SCHEMA } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, combineReducers } from '@ngrx/store'; -import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; - -import { VersionOptionsComponent } from './version-options.component'; -import * as fromConfiguration from '../reducer'; -import * as fromProviders from '../../provider/reducer'; -import * as fromResolvers from '../../resolver/reducer'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { Metadata } from '../../domain/domain.type'; -import { ViewportScroller } from '@angular/common'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(VersionOptionsComponent, {static: true}) - public componentUnderTest: VersionOptionsComponent; -} - -describe('Metadata Version Options Page Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: VersionOptionsComponent; - let scroller: ViewportScroller; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - StoreModule.forRoot({ - 'metadata-configuration': combineReducers(fromConfiguration.reducers), - 'provider': combineReducers(fromProviders.reducers), - 'resolver': combineReducers(fromResolvers.reducers) - }), - MockI18nModule, - RouterTestingModule - ], - declarations: [ - VersionOptionsComponent, - TestHostComponent - ], - schemas: [ NO_ERRORS_SCHEMA ] - }).compileComponents(); - - scroller = TestBed.get(ViewportScroller); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should compile', () => { - expect(app).toBeTruthy(); - }); - - describe('setModel method', () => { - it('should set attributes based on the passed data', () => { - app.setModel({ id: 'foo', '@type': 'bar' } as Metadata); - expect(app.id).toBe('foo'); - expect(app.kind).toBe('provider'); - - app.setModel({ resourceId: 'baz' } as Metadata); - expect(app.id).toBe('baz'); - expect(app.kind).toBe('resolver'); - }); - }); - - describe('onScrollTo method', () => { - it('should set attributes based on the passed data', () => { - spyOn(scroller, 'scrollToAnchor'); - app.onScrollTo('foo'); - expect(scroller.scrollToAnchor).toHaveBeenCalledWith('foo'); - }); - }); -}); diff --git a/ui/src/app/metadata/configuration/container/version-options.component.ts b/ui/src/app/metadata/configuration/container/version-options.component.ts deleted file mode 100644 index 9059f079f..000000000 --- a/ui/src/app/metadata/configuration/container/version-options.component.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { Store } from '@ngrx/store'; -import { Component, ChangeDetectionStrategy, OnDestroy } from '@angular/core'; -import { Observable, Subject } from 'rxjs'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { ViewportScroller } from '@angular/common'; -import { takeUntil, filter } from 'rxjs/operators'; - -import { - ConfigurationState, - getConfigurationSections, - getSelectedVersion, - getConfigurationModelEnabled, - getConfigurationModelType, - getVersionModelFilters, - getVersionLoading -} from '../reducer'; -import { MetadataConfiguration } from '../model/metadata-configuration'; -import { MetadataVersion } from '../model/version'; -import { - ClearFilters -} from '../../filter/action/collection.action'; - -import { Metadata } from '../../domain/domain.type'; -import { getVersionModel, getVersionConfigurationSections } from '../reducer'; - -@Component({ - selector: 'version-options-page', - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './version-options.component.html', - styleUrls: [] -}) -export class VersionOptionsComponent implements OnDestroy { - - protected ngUnsubscribe: Subject = new Subject(); - - configuration$: Observable = this.store.select(getVersionConfigurationSections); - isEnabled$: Observable = this.store.select(getConfigurationModelEnabled); - model$: Observable = this.store.select(getVersionModel); - type$: Observable = this.store.select(getConfigurationModelType); - filters$: Observable = this.store.select(getVersionModelFilters); - loading$: Observable = this.store.select(getVersionLoading); - id: string; - kind: string; - - constructor( - protected store: Store, - protected modalService: NgbModal, - protected scroller: ViewportScroller - ) { - this.model$ - .pipe( - takeUntil(this.ngUnsubscribe), - filter(model => !!model) - ) - .subscribe(p => this.setModel(p)); - } - - setModel(data: Metadata): void { - this.id = 'resourceId' in data ? data.resourceId : data.id; - this.kind = '@type' in data ? 'provider' : 'resolver'; - } - - onScrollTo(element): void { - this.scroller.scrollToAnchor(element); - } - - ngOnDestroy(): void { - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - - this.store.dispatch(new ClearFilters()); - } -} diff --git a/ui/src/app/metadata/configuration/container/version.component.html b/ui/src/app/metadata/configuration/container/version.component.html deleted file mode 100644 index 90c6b6463..000000000 --- a/ui/src/app/metadata/configuration/container/version.component.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/src/app/metadata/configuration/container/version.component.spec.ts b/ui/src/app/metadata/configuration/container/version.component.spec.ts deleted file mode 100644 index 559449b2b..000000000 --- a/ui/src/app/metadata/configuration/container/version.component.spec.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, combineReducers } from '@ngrx/store'; -import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; - -import { VersionComponent } from './version.component'; -import * as fromConfiguration from '../reducer'; -import * as fromProviders from '../../provider/reducer'; -import * as fromResolvers from '../../resolver/reducer'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(VersionComponent, {static: true}) - public componentUnderTest: VersionComponent; -} - -describe('Metadata Version Page Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: VersionComponent; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - StoreModule.forRoot({ - 'metadata-configuration': combineReducers(fromConfiguration.reducers), - 'provider': combineReducers(fromProviders.reducers), - 'resolver': combineReducers(fromResolvers.reducers) - }), - MockI18nModule, - RouterTestingModule - ], - declarations: [ - VersionComponent, - TestHostComponent - ], - }).compileComponents(); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should compile', () => { - expect(app).toBeTruthy(); - }); -}); diff --git a/ui/src/app/metadata/configuration/container/version.component.ts b/ui/src/app/metadata/configuration/container/version.component.ts deleted file mode 100644 index 22c31601b..000000000 --- a/ui/src/app/metadata/configuration/container/version.component.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { Component, OnDestroy } from '@angular/core'; -import { Subscription, Subject } from 'rxjs'; -import { Store } from '@ngrx/store'; - -import { ActivatedRoute } from '@angular/router'; -import * as fromConfiguration from '../reducer'; -import { SelectVersionRequest } from '../action/version.action'; -import { map, withLatestFrom } from 'rxjs/operators'; - -@Component({ - selector: 'version-page', - templateUrl: './version.component.html', - styleUrls: [] -}) - -export class VersionComponent implements OnDestroy { - private ngUnsubscribe: Subject = new Subject(); - actionsSubscription: Subscription; - - constructor( - private store: Store, - private route: ActivatedRoute, - ) { - this.route - .params - .pipe( - withLatestFrom( - this.store.select(fromConfiguration.getConfigurationModelKind), - this.store.select(fromConfiguration.getConfigurationModelId) - ), - map(([ params, kind, id ]) => ({ version: params.version, id, type: kind })), - map(request => new SelectVersionRequest(request)) - ) - .subscribe(this.store); - } - - ngOnDestroy() { - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - } -} - diff --git a/ui/src/app/metadata/configuration/effect/compare.effect.ts b/ui/src/app/metadata/configuration/effect/compare.effect.ts deleted file mode 100644 index bb6e077d2..000000000 --- a/ui/src/app/metadata/configuration/effect/compare.effect.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { catchError, withLatestFrom, map, filter, combineLatest, switchMap } from 'rxjs/operators'; -import { of } from 'rxjs'; -import { MetadataHistoryService } from '../service/history.service'; -import { - CompareVersionRequest, - CompareActionTypes, - CompareVersionSuccess, - CompareVersionError, - SetMetadataVersions -} from '../action/compare.action'; -import { Store } from '@ngrx/store'; -import { State, getConfigurationModel } from '../reducer'; - -@Injectable() -export class CompareVersionEffects { - - @Effect() - compareVersionRequest$ = this.actions$.pipe( - ofType(CompareActionTypes.COMPARE_METADATA_REQUEST), - map(action => action.payload), - withLatestFrom( - this.store.select(getConfigurationModel) - ), - switchMap(([versions, model]) => { - const type = '@type' in model ? 'provider' : 'resolver'; - const id = '@type' in model ? model.resourceId : model.id; - return this.historyService.getVersions(id, versions, type).pipe( - map(v => new CompareVersionSuccess(v)), - catchError(err => of(new CompareVersionError(err))) - ); - }) - ); - - @Effect() - setVersionsOnSuccess$ = this.actions$.pipe( - ofType(CompareActionTypes.COMPARE_METADATA_SUCCESS), - map(action => action.payload), - map(versions => new SetMetadataVersions(versions)) - ); - - constructor( - private historyService: MetadataHistoryService, - private store: Store, - private actions$: Actions - ) { } -} diff --git a/ui/src/app/metadata/configuration/effect/configuration.effect.ts b/ui/src/app/metadata/configuration/effect/configuration.effect.ts deleted file mode 100644 index 91ce3d37a..000000000 --- a/ui/src/app/metadata/configuration/effect/configuration.effect.ts +++ /dev/null @@ -1,154 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { switchMap, catchError, map, tap, withLatestFrom, filter } from 'rxjs/operators'; -import { of, Observable } from 'rxjs'; -import * as FileSaver from 'file-saver'; -import { Store } from '@ngrx/store'; - -import { MetadataConfigurationService } from '../service/configuration.service'; -import { - ConfigurationActionTypes, - SetMetadata, - SetConfigurationDefinition, - LoadSchemaRequest, - LoadSchemaSuccess, - SetConfigurationSchema, - LoadSchemaError, - LoadXmlSuccess, - LoadXmlError, - SetXml, - DownloadXml -} from '../action/configuration.action'; -import { ResolverService } from '../../domain/service/resolver.service'; -import { State } from '../reducer/configuration.reducer'; -import { getConfigurationModel, getConfigurationXml } from '../reducer'; -import { MetadataResolver, MetadataProvider } from '../../domain/model'; -import { - SelectProviderSuccess, - ProviderCollectionActionTypes -} from '../../provider/action/collection.action'; -import { - SelectResolverSuccess, - ResolverCollectionActionTypes -} from '../../resolver/action/collection.action'; -import { MetadataHistoryService } from '../service/history.service'; -import { Metadata } from '../../domain/domain.type'; -import { SelectVersion } from '../action/history.action'; -import { - SetDefinition, - LoadSchemaSuccess as LoadWizardSchemaSuccess, - LoadSchemaRequest as LoadWizardSchemaRequest -} from '../../../wizard/action/wizard.action'; - -@Injectable() -export class MetadataConfigurationEffects { - - @Effect() - loadMetadata$ = this.actions$.pipe( - ofType(ConfigurationActionTypes.SET_METADATA), - map(action => action.payload), - switchMap(payload => - this.historyService.getVersion(payload.id, payload.type, payload.version).pipe( - map((response: Metadata) => { - return (payload.type === 'resolver') ? - new SelectResolverSuccess(response as MetadataResolver) : - new SelectProviderSuccess(response as MetadataProvider); - }) - ) - ) - ); - - @Effect() - setMetadataVersion$ = this.actions$.pipe( - ofType(ConfigurationActionTypes.SET_METADATA), - map(action => action.payload), - map(({version}) => new SelectVersion(version)) - ); - - @Effect() - loadMetadataXml$ = this.actions$.pipe( - ofType(ConfigurationActionTypes.SET_METADATA), - filter(action => action.payload.type === 'resolver'), - switchMap(action => this.resolverService.preview(action.payload.id).pipe( - map(xml => new LoadXmlSuccess(xml)), - catchError(error => of(new LoadXmlError(error))) - )) - ); - - @Effect() - setXmlOnLoad$ = this.actions$.pipe( - ofType(ConfigurationActionTypes.LOAD_XML_SUCCESS), - map(action => new SetXml(action.payload)) - ); - - @Effect() - setDefinitionOnResolverDataLoad$ = this.actions$.pipe( - ofType(ResolverCollectionActionTypes.SELECT_SUCCESS), - map(action => new SetConfigurationDefinition(this.configService.getDefinition('resolver'))) - ); - - @Effect() - setDefinitionOnProviderLoad$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.SELECT_PROVIDER_SUCCESS), - map(action => new SetConfigurationDefinition(this.configService.getDefinition(action.payload['@type']))) - ); - - @Effect() - loadSchemaOnDefinitionSet$ = this.actions$.pipe( - ofType(ConfigurationActionTypes.SET_DEFINITION), - map(action => new LoadSchemaRequest(action.payload.schema)) - ); - - @Effect() - setWizardDefinition$ = this.actions$.pipe( - ofType(ConfigurationActionTypes.SET_DEFINITION), - map(action => new SetDefinition(action.payload)) - ); - - @Effect() - setWizardSchema$ = this.actions$.pipe( - ofType(ConfigurationActionTypes.LOAD_SCHEMA_SUCCESS), - map(action => new LoadWizardSchemaSuccess(action.payload)) - ); - - @Effect() - loadSchemaData$ = this.actions$.pipe( - ofType(ConfigurationActionTypes.LOAD_SCHEMA_REQUEST), - switchMap(action => - this.configService - .loadSchema(action.payload) - .pipe( - map(schema => new LoadSchemaSuccess(schema)), - catchError(error => of(new LoadSchemaError(error))) - ) - ) - ); - - @Effect() - setSchema$ = this.actions$.pipe( - ofType(ConfigurationActionTypes.LOAD_SCHEMA_SUCCESS), - map(action => new SetConfigurationSchema(action.payload)) - ); - - @Effect({dispatch: false}) - downloadXml$ = this.actions$.pipe( - ofType(ConfigurationActionTypes.DOWNLOAD_XML), - withLatestFrom( - this.store.select(getConfigurationModel), - this.store.select(getConfigurationXml) - ), - tap(([action, entity, xml]) => { - const name = entity.name ? entity.name : (entity as MetadataResolver).serviceProviderName; - const blob = new Blob([xml], { type: 'text/xml;charset=utf-8' }); - FileSaver.saveAs(blob, `${name}.xml`); - }) - ); - - constructor( - private configService: MetadataConfigurationService, - private actions$: Actions, - private resolverService: ResolverService, - private historyService: MetadataHistoryService, - private store: Store - ) { } -} diff --git a/ui/src/app/metadata/configuration/effect/filter.effect.ts b/ui/src/app/metadata/configuration/effect/filter.effect.ts deleted file mode 100644 index 215ac755e..000000000 --- a/ui/src/app/metadata/configuration/effect/filter.effect.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { - LoadFilterSchemaRequest, - CompareFilterVersions, - SetFilterComparisonDefinition, - LoadFilterSchemaSuccess, - LoadFilterSchemaError, - SetFilterComparisonSchema -} from '../action/filter.action'; -import { Store } from '@ngrx/store'; -import { State } from '../reducer'; -import { FilterCompareActionTypes } from '../action/filter.action'; -import { MetadataConfigurationService } from '../service/configuration.service'; -import { switchMap, map, catchError } from 'rxjs/operators'; -import { of } from 'rxjs'; - -@Injectable() -export class FilterCompareVersionEffects { - - @Effect() - setDefinition$ = this.actions$.pipe( - ofType(FilterCompareActionTypes.COMPARE_FILTERS), - map(action => action.payload), - map(comparison => { - const def = this.configService.getDefinition(comparison.modelType); - return new SetFilterComparisonDefinition(def); - }) - ); - - @Effect() - loadSchemaOnDefinitionSet$ = this.actions$.pipe( - ofType(FilterCompareActionTypes.SET_DEFINITION), - map(action => action.payload), - map(def => new LoadFilterSchemaRequest(def.schema)) - ); - - @Effect() - loadSchemaData$ = this.actions$.pipe( - ofType(FilterCompareActionTypes.LOAD_SCHEMA_REQUEST), - switchMap(action => - this.configService - .loadSchema(action.payload) - .pipe( - map(schema => new LoadFilterSchemaSuccess(schema)), - catchError(error => of(new LoadFilterSchemaError(error))) - ) - ) - ); - - @Effect() - loadSchemaSuccess$ = this.actions$.pipe( - ofType(FilterCompareActionTypes.LOAD_SCHEMA_SUCCESS), - map(action => action.payload), - map(schema => new SetFilterComparisonSchema(schema)) - ); - - constructor( - private configService: MetadataConfigurationService, - private store: Store, - private actions$: Actions - ) {} -} diff --git a/ui/src/app/metadata/configuration/effect/history.effect.ts b/ui/src/app/metadata/configuration/effect/history.effect.ts deleted file mode 100644 index 0bda812ec..000000000 --- a/ui/src/app/metadata/configuration/effect/history.effect.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { switchMap, catchError, map } from 'rxjs/operators'; -import { of } from 'rxjs'; -import { LoadHistoryRequest, HistoryActionTypes, LoadHistorySuccess, LoadHistoryError, SetHistory } from '../action/history.action'; -import { MetadataHistoryService } from '../service/history.service'; - -@Injectable() -export class MetadataHistoryEffects { - - @Effect() - loadHistory$ = this.actions$.pipe( - ofType(HistoryActionTypes.LOAD_HISTORY_REQUEST), - switchMap(action => - this.historyService - .query(action.payload.id, action.payload.type) - .pipe( - map(history => new LoadHistorySuccess(history)), - catchError(error => of(new LoadHistoryError(error))) - ) - ) - ); - - @Effect() - loadHistorySuccess$ = this.actions$.pipe( - ofType(HistoryActionTypes.LOAD_HISTORY_SUCCESS), - map(action => new SetHistory(action.payload)) - ); - - constructor( - private historyService: MetadataHistoryService, - private actions$: Actions - ) { } -} diff --git a/ui/src/app/metadata/configuration/effect/restore.effect.ts b/ui/src/app/metadata/configuration/effect/restore.effect.ts deleted file mode 100644 index f15f21569..000000000 --- a/ui/src/app/metadata/configuration/effect/restore.effect.ts +++ /dev/null @@ -1,161 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Actions, Effect, ofType } from '@ngrx/effects'; -import { map, catchError, switchMap, withLatestFrom } from 'rxjs/operators'; - -import { - RestoreActionTypes, - RestoreVersionRequest, - RestoreVersionSuccess, - RestoreVersionError, - CancelRestore, - UpdateRestorationChangesRequest, - UpdateRestorationChangesSuccess, - SetSavingStatus -} from '../action/restore.action'; -import { MetadataHistoryService } from '../service/history.service'; -import { of } from 'rxjs'; -import { Router } from '@angular/router'; - -import { AddNotification } from '../../../notification/action/notification.action'; -import { Notification, NotificationType } from '../../../notification/model/notification'; -import { Store } from '@ngrx/store'; -import { - ConfigurationState, - getConfigurationModel, - getConfigurationModelId, - getConfigurationModelKind, - getConfigurationDefinition, - getRestorationModel -} from '../reducer'; -import { SetMetadata } from '../action/configuration.action'; -import { removeNulls } from '../../../shared/util'; -import { getModel } from '../../../wizard/reducer'; -import { ClearProviderSelection } from '../../provider/action/collection.action'; -import { ClearResolverSelection } from '../../resolver/action/collection.action'; - - -@Injectable() -export class RestoreEffects { - - @Effect() - restoreVersion$ = this.actions$.pipe( - ofType(RestoreActionTypes.RESTORE_VERSION_REQUEST), - withLatestFrom( - this.store.select(getConfigurationModelId), - this.store.select(getConfigurationModelKind), - this.store.select(getConfigurationModel), - this.store.select(getRestorationModel) - ), - switchMap(([action, id, kind, current, version]) => - this.historyService.updateVersion(id, kind, removeNulls({ - ...version, - version: current.version - })).pipe( - map(v => new RestoreVersionSuccess({ id, type: kind, model: v })), - catchError(err => of(new RestoreVersionError(err))) - ) - ) - ); - - @Effect() - restoreVersionSaving$ = this.actions$.pipe( - ofType(RestoreActionTypes.RESTORE_VERSION_REQUEST), - map(() => new SetSavingStatus(true)) - ); - - @Effect() - restoreVersionSaved$ = this.actions$.pipe( - ofType(RestoreActionTypes.RESTORE_VERSION_SUCCESS), - map(() => new SetSavingStatus(false)) - ); - - @Effect() - restoreVersionError$ = this.actions$.pipe( - ofType(RestoreActionTypes.RESTORE_VERSION_ERROR), - map(() => new SetSavingStatus(false)) - ); - - @Effect({ dispatch: false }) - restoreVersionCancel$ = this.actions$.pipe( - ofType(RestoreActionTypes.CANCEL_RESTORE), - withLatestFrom( - this.store.select(getConfigurationModelId), - this.store.select(getConfigurationModelKind) - ), - switchMap(([action, id, kind]) => - this.router.navigate(['/', 'metadata', kind, id, 'configuration', 'history']) - ) - ); - - @Effect() - restoreVersionSuccessNotification$ = this.actions$.pipe( - ofType(RestoreActionTypes.RESTORE_VERSION_SUCCESS), - map(action => action.payload), - map((data) => - new AddNotification(new Notification( - NotificationType.Success, - `Version Restored!`, - 5000 - )) - ) - ); - - @Effect({dispatch: false}) - restoreVersionSuccessRedirect$ = this.actions$.pipe( - ofType(RestoreActionTypes.RESTORE_VERSION_SUCCESS), - map(action => action.payload), - switchMap((data) => - this.router.navigate(['/metadata', data.type, data.id, 'configuration', 'options']) - ) - ); - - @Effect() - restoreVersionSuccessClear$ = this.actions$.pipe( - ofType(RestoreActionTypes.RESTORE_VERSION_SUCCESS), - map(action => action.payload), - map(({ id, type }) => - type === 'provider' ? new ClearProviderSelection() : new ClearResolverSelection() - ) - ); - - @Effect() - restoreVersionSuccessReload$ = this.actions$.pipe( - ofType(RestoreActionTypes.RESTORE_VERSION_SUCCESS), - map(action => action.payload), - map(({id, type}) => - new SetMetadata({ id, type }) - ) - ); - - @Effect() - updateRestorationChanges$ = this.actions$.pipe( - ofType(RestoreActionTypes.UPDATE_RESTORATION_REQUEST), - map(action => action.payload), - withLatestFrom( - this.store.select(getConfigurationDefinition), - this.store.select(getConfigurationModelKind), - this.store.select(getConfigurationModel) - ), - map(([changes, definition, kind, original]) => { - let parsed = definition.parser(changes); - if (kind === 'provider') { - parsed = { - ...parsed, - metadataFilters: [ - ...original.metadataFilters, - ...(parsed.metadataFilters || []) - ] - }; - } - return (parsed); - }), - map(changes => new UpdateRestorationChangesSuccess(changes)) - ); - - constructor( - private store: Store, - private historyService: MetadataHistoryService, - private actions$: Actions, - private router: Router - ) { } -} diff --git a/ui/src/app/metadata/configuration/effect/version.effect.ts b/ui/src/app/metadata/configuration/effect/version.effect.ts deleted file mode 100644 index e48a60cd1..000000000 --- a/ui/src/app/metadata/configuration/effect/version.effect.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Actions, Effect, ofType } from '@ngrx/effects'; -import { map, catchError, switchMap } from 'rxjs/operators'; - -import { - VersionActionTypes, - SelectVersionRequest, - SelectVersionError, - SelectVersionSuccess -} from '../action/version.action'; -import { MetadataHistoryService } from '../service/history.service'; -import { of } from 'rxjs'; - - -@Injectable() -export class VersionEffects { - - @Effect() - selectVersionFromId$ = this.actions$.pipe( - ofType(VersionActionTypes.SELECT_VERSION_REQUEST), - map(action => action.payload), - switchMap(({ type, id, version }) => this.historyService.getVersion(id, type, version).pipe( - map(v => new SelectVersionSuccess(v)), - catchError(err => of(new SelectVersionError(err))) - )) - ); - - constructor( - private historyService: MetadataHistoryService, - private actions$: Actions - ) { } -} diff --git a/ui/src/app/metadata/configuration/model/compare.ts b/ui/src/app/metadata/configuration/model/compare.ts deleted file mode 100644 index 28038806a..000000000 --- a/ui/src/app/metadata/configuration/model/compare.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Metadata } from '../../domain/domain.type'; -import { FilterVersion } from './version'; - -export interface FilterComparison { - modelId: string; - modelType: string; - models: FilterVersion[]; -} diff --git a/ui/src/app/metadata/configuration/model/history.ts b/ui/src/app/metadata/configuration/model/history.ts deleted file mode 100644 index 180502423..000000000 --- a/ui/src/app/metadata/configuration/model/history.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { MetadataVersion, FilterVersion } from './version'; - -export interface MetadataHistory { - versions: MetadataVersion[]; -} diff --git a/ui/src/app/metadata/configuration/model/metadata-configuration.ts b/ui/src/app/metadata/configuration/model/metadata-configuration.ts deleted file mode 100644 index 57316cdde..000000000 --- a/ui/src/app/metadata/configuration/model/metadata-configuration.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Section } from './section'; -import { FilterVersion } from './version'; - -export interface MetadataConfiguration { - sections: Section[]; - dates: String[]; -} - -export interface FilterConfiguration { - dates: string[]; - filters: FilterVersion[][]; -} diff --git a/ui/src/app/metadata/configuration/model/request.ts b/ui/src/app/metadata/configuration/model/request.ts deleted file mode 100644 index 0e4e16bec..000000000 --- a/ui/src/app/metadata/configuration/model/request.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface VersionRequest { - type: string; - id: string; - version: string; -} diff --git a/ui/src/app/metadata/configuration/model/schema.ts b/ui/src/app/metadata/configuration/model/schema.ts deleted file mode 100644 index 469650111..000000000 --- a/ui/src/app/metadata/configuration/model/schema.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface Schema { - [prop: string]: any; -} diff --git a/ui/src/app/metadata/configuration/model/section.ts b/ui/src/app/metadata/configuration/model/section.ts deleted file mode 100644 index 50c6a5492..000000000 --- a/ui/src/app/metadata/configuration/model/section.ts +++ /dev/null @@ -1,21 +0,0 @@ -export interface Section { - id: string; - index: number; - label: string; - pageNumber: number; - properties: SectionProperty[]; - differences?: boolean; -} - -export interface SectionProperty { - label: string; - type: string; - value: any[]; - differences?: boolean; - properties?: SectionProperty[]; - widget?: { - id: string; - data?: any[]; - [propertyName: string]: any; - }; -} diff --git a/ui/src/app/metadata/configuration/model/version.ts b/ui/src/app/metadata/configuration/model/version.ts deleted file mode 100644 index bba3c7ced..000000000 --- a/ui/src/app/metadata/configuration/model/version.ts +++ /dev/null @@ -1,12 +0,0 @@ -export interface MetadataVersion { - id: string; - date: string; - creator: string; -} - -export interface FilterVersion { - resourceId: string; - name: string; - type: string; - comparable: boolean; -} diff --git a/ui/src/app/metadata/configuration/reducer/compare.reducer.spec.ts b/ui/src/app/metadata/configuration/reducer/compare.reducer.spec.ts deleted file mode 100644 index 4423c6be9..000000000 --- a/ui/src/app/metadata/configuration/reducer/compare.reducer.spec.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { reducer } from './compare.reducer'; -import * as fromCompare from './compare.reducer'; -import { MetadataResolver } from '../../domain/model'; -import { SetMetadataVersions, ClearVersions } from '../action/compare.action'; - -describe('Comparison Reducer', () => { - const initialState: fromCompare.State = { ...fromCompare.initialState }; - const models: MetadataResolver[] = [{ - id: 'foo', - serviceProviderName: 'foo', - '@type': 'MetadataResolver', - createdBy: 'admin' - }]; - - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(undefined, {} as any); - - expect(result).toEqual(initialState); - }); - }); - - describe('set versions action', () => { - it('should add the models to the state', () => { - const action = new SetMetadataVersions(models); - const result = reducer(initialState, action); - expect(result.models).toEqual(models); - expect(result.loaded).toBe(true); - }); - }); - - describe('clear versions action', () => { - it('should remove the models from the state', () => { - const action = new ClearVersions(); - const result = reducer(initialState, action); - expect(result.models).toEqual([]); - expect(result.loaded).toBe(false); - }); - }); - - describe('selector functions', () => { - describe('getModel', () => { - it('should retrieve the model from state', () => { - expect(fromCompare.getVersionModels({ ...initialState, models })).toBe(models); - }); - }); - describe('getVersionModelsLoaded', () => { - it('should retrieve the loaded state', () => { - expect(fromCompare.getVersionModelsLoaded({ ...initialState, loaded: true })).toBe(true); - }); - }); - }); -}); diff --git a/ui/src/app/metadata/configuration/reducer/compare.reducer.ts b/ui/src/app/metadata/configuration/reducer/compare.reducer.ts deleted file mode 100644 index ea0ef1598..000000000 --- a/ui/src/app/metadata/configuration/reducer/compare.reducer.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { CompareActionTypes, CompareActionsUnion } from '../action/compare.action'; -import { Metadata } from '../../domain/domain.type'; - -export interface State { - models: Metadata[]; - loaded: boolean; - loading: boolean; - compareChangedOnly: boolean; - filter: string; -} - -export const initialState: State = { - models: [], - loaded: false, - loading: false, - compareChangedOnly: false, - filter: null -}; - -export function reducer(state = initialState, action: CompareActionsUnion): State { - switch (action.type) { - case CompareActionTypes.SET_VIEW_CHANGED: - return { - ...state, - compareChangedOnly: action.payload - }; - case CompareActionTypes.COMPARE_METADATA_REQUEST: - return { - ...state, - loading: true - }; - case CompareActionTypes.COMPARE_METADATA_ERROR: - case CompareActionTypes.COMPARE_METADATA_SUCCESS: - return { - ...state, - loading: false - }; - case CompareActionTypes.SET_VERSIONS: - return { - ...state, - models: action.payload, - loaded: true - }; - case CompareActionTypes.CLEAR_VERSIONS: - return { - ...initialState - }; - default: { - return state; - } - } -} - -export const getVersionModels = (state: State) => state.models; -export const getVersionModelsLoaded = (state: State) => state.loaded; -export const getComparisonLoading = (state: State) => state.loading; -export const getViewChangedOnly = (state: State) => state.compareChangedOnly; -export const getFilterId = (state: State) => state.filter; diff --git a/ui/src/app/metadata/configuration/reducer/configuration.reducer.spec.ts b/ui/src/app/metadata/configuration/reducer/configuration.reducer.spec.ts deleted file mode 100644 index 714da74b4..000000000 --- a/ui/src/app/metadata/configuration/reducer/configuration.reducer.spec.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { reducer } from './configuration.reducer'; -import * as fromConfig from './configuration.reducer'; -import * as actions from '../action/configuration.action'; -import { MetadataSourceEditor } from '../../domain/model/wizards/metadata-source-editor'; -import { SCHEMA as schema } from '../../../../testing/form-schema.stub'; -import { MetadataResolver } from '../../domain/model'; - -describe('Configuration Reducer', () => { - const initialState: fromConfig.State = { ...fromConfig.initialState }; - - const definition = new MetadataSourceEditor(); - const model: MetadataResolver = { - id: 'foo', - serviceProviderName: 'foo', - '@type': 'MetadataResolver', - createdBy: 'admin' - }; - const xml = ``; - - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(undefined, {} as any); - - expect(result).toEqual(initialState); - }); - }); - - describe('SET_DEFINITION action', () => { - it('should set the state definition', () => { - const action = new actions.SetConfigurationDefinition(definition); - const result = reducer(initialState, action); - - expect(result).toEqual({ ...initialState, definition }); - }); - }); - - describe('SET_SCHEMA action', () => { - it('should set the state schema', () => { - const action = new actions.SetConfigurationSchema(schema); - const result = reducer(initialState, action); - - expect(result).toEqual({ ...initialState, schema }); - }); - }); - - describe('SET_METADATA action', () => { - it('should set the state metadata model', () => { - const action = new actions.SetMetadata({ id: model.id, type: 'resolver' }); - const result = reducer(initialState, action); - - expect(result).toEqual({ ...initialState, modelId: model.id, modelType: 'resolver' }); - }); - }); - - describe('SET_XML action', () => { - it('should set the state metadata model', () => { - const action = new actions.SetXml(xml); - const result = reducer(initialState, action); - - expect(result).toEqual({ ...initialState, xml }); - }); - }); - - describe('CLEAR action', () => { - it('should clear the state and reset to initial state', () => { - const action = new actions.ClearConfiguration(); - const result = reducer({ - ...initialState, - modelType: 'resolver', - modelId: model.id, - definition, - schema - }, action); - - expect(result).toEqual(initialState); - }); - }); - - describe('selector functions', () => { - /* - export const getModel = (state: State) => state.model; - export const getDefinition = (state: State) => state.definition; - export const getSchema = (state: State) => state.schema; - export const getXml = (state: State) => state.xml; - */ - describe('getModel', () => { - it('should retrieve the model from state', () => { - expect(fromConfig.getModelKind({...initialState, modelType: 'resolver'})).toBe('resolver'); - }); - }); - describe('getDefinition', () => { - it('should retrieve the definition from state', () => { - expect(fromConfig.getDefinition({ ...initialState, definition })).toBe(definition); - }); - }); - describe('getSchema', () => { - it('should retrieve the schema from state', () => { - expect(fromConfig.getSchema({ ...initialState, schema })).toBe(schema); - }); - }); - describe('getXml', () => { - it('should retrieve the schema from state', () => { - expect(fromConfig.getXml({ ...initialState, xml })).toBe(xml); - }); - }); - }); -}); diff --git a/ui/src/app/metadata/configuration/reducer/configuration.reducer.ts b/ui/src/app/metadata/configuration/reducer/configuration.reducer.ts deleted file mode 100644 index d1dc13129..000000000 --- a/ui/src/app/metadata/configuration/reducer/configuration.reducer.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { ConfigurationActionTypes, ConfigurationActionsUnion } from '../action/configuration.action'; -import { Metadata } from '../../domain/domain.type'; -import { Wizard } from '../../../wizard/model'; -import { Schema } from '../model/schema'; - -export interface State { - modelType: string; - modelId: string; - schema: Schema; - definition: Wizard; - xml: string; - loading: boolean; -} - -export const initialState: State = { - modelType: null, - modelId: null, - schema: null, - definition: null, - xml: '', - loading: false -}; - -export function reducer(state = initialState, action: ConfigurationActionsUnion): State { - switch (action.type) { - case ConfigurationActionTypes.SET_SCHEMA: - return { - ...state, - schema: action.payload - }; - case ConfigurationActionTypes.SET_DEFINITION: - return { - ...state, - definition: action.payload - }; - case ConfigurationActionTypes.SET_METADATA: - return { - ...state, - modelType: action.payload.type, - modelId: action.payload.id - }; - case ConfigurationActionTypes.SET_XML: - return { - ...state, - xml: action.payload - }; - case ConfigurationActionTypes.CLEAR: - return { - ...initialState - }; - default: { - return state; - } - } -} - -export const getModelKind = (state: State) => state.modelType; -export const getModelId = (state: State) => state.modelId; -export const getDefinition = (state: State) => state.definition; -export const getSchema = (state: State) => state.schema; -export const getXml = (state: State) => state.xml; diff --git a/ui/src/app/metadata/configuration/reducer/filter.reducer.spec.ts b/ui/src/app/metadata/configuration/reducer/filter.reducer.spec.ts deleted file mode 100644 index ed9685cac..000000000 --- a/ui/src/app/metadata/configuration/reducer/filter.reducer.spec.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { reducer } from './filter.reducer'; -import * as fromFilterCompare from './filter.reducer'; -import { - SetFilterComparisonSchema, - ClearFilterComparison, - SetFilterComparisonDefinition, - CompareFilterVersions -} from '../action/filter.action'; -import { NameIDFilterConfiguration } from '../../filter/model/nameid-configuration.filter'; -import { FilterVersion } from '../model/version'; - -describe('Filter Comparison Reducer', () => { - const initialState: fromFilterCompare.State = { ...fromFilterCompare.initialState }; - - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(undefined, {} as any); - - expect(result).toEqual(initialState); - }); - }); - - describe('SET_SCHEMA action', () => { - it('should add the provided schema to the state', () => { - const schema = {type: 'object', properties: { foo: { type: 'string' } }}; - const action = new SetFilterComparisonSchema(schema); - const result = reducer(initialState, action); - expect(result.schema).toEqual(schema); - }); - }); - - describe('SET_DEFINITION action', () => { - it('should add the provided definition to the state', () => { - const definition = NameIDFilterConfiguration; - const action = new SetFilterComparisonDefinition(definition); - const result = reducer(initialState, action); - expect(result.definition).toEqual(definition); - }); - }); - - describe('COMPARE_FILTERS action', () => { - it('should add model information to the state', () => { - const request = { - modelId: 'foo', - modelType: 'EntityAttributesFilter', - models: [{}, {}] as FilterVersion[] - }; - const action = new CompareFilterVersions(request); - const result = reducer(initialState, action); - expect(result.modelId).toEqual(request.modelId); - expect(result.modelType).toEqual(request.modelType); - expect(result.models).toEqual(request.models); - }); - }); - - describe('CLEAR action', () => { - it('should reset to the initial state', () => { - const action = new ClearFilterComparison(); - const result = reducer(initialState, action); - expect(result).toEqual(initialState); - }); - }); - - describe('selector functions', () => { - describe('getModel', () => { - it('should retrieve the model from state', () => { - const models = [{}, {}] as FilterVersion[]; - expect(fromFilterCompare.getModelId({ ...initialState, modelId: 'foo' })).toBe('foo'); - expect(fromFilterCompare.getModelType({ ...initialState, modelType: 'foo' })).toBe('foo'); - expect(fromFilterCompare.getModels({ ...initialState, models })).toBe(models); - }); - }); - describe('getLoading', () => { - it('should retrieve the loading state', () => { - expect(fromFilterCompare.getLoading({ ...initialState, loading: true })).toBe(true); - }); - }); - - describe('getSchema', () => { - it('should retrieve the schema from state', () => { - const schema = {}; - expect(fromFilterCompare.getSchema({ ...initialState, schema })).toBe(schema); - }); - }); - - describe('getDefinition', () => { - it('should retrieve the definition from state', () => { - const definition = NameIDFilterConfiguration; - expect(fromFilterCompare.getDefinition({ ...initialState, definition })).toBe(NameIDFilterConfiguration); - }); - }); - }); -}); diff --git a/ui/src/app/metadata/configuration/reducer/filter.reducer.ts b/ui/src/app/metadata/configuration/reducer/filter.reducer.ts deleted file mode 100644 index 445038ab8..000000000 --- a/ui/src/app/metadata/configuration/reducer/filter.reducer.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { FilterCompareActionTypes, FilterCompareActionsUnion } from '../action/filter.action'; -import { Metadata } from '../../domain/domain.type'; -import { FormDefinition } from '../../../wizard/model'; -import { Schema } from '../model/schema'; -import { FilterVersion } from '../model/version'; - -export interface State { - models: FilterVersion[]; - modelType: string; - modelId: string; - schema: Schema; - definition: FormDefinition; - loading: boolean; -} - -export const initialState: State = { - models: null, - modelType: null, - modelId: null, - schema: null, - definition: null, - loading: false -}; - -export function reducer(state = initialState, action: FilterCompareActionsUnion): State { - switch (action.type) { - case FilterCompareActionTypes.SET_SCHEMA: - return { - ...state, - schema: action.payload - }; - case FilterCompareActionTypes.SET_DEFINITION: - return { - ...state, - definition: action.payload - }; - case FilterCompareActionTypes.COMPARE_FILTERS: - return { - ...state, - ...action.payload - }; - case FilterCompareActionTypes.CLEAR: - return { - ...initialState - }; - default: { - return state; - } - } -} - -export const getModels = (state: State) => state.models; -export const getModelType = (state: State) => state.modelType; -export const getModelId = (state: State) => state.modelId; -export const getDefinition = (state: State) => state.definition; -export const getSchema = (state: State) => state.schema; -export const getLoading = (state: State) => state.loading; diff --git a/ui/src/app/metadata/configuration/reducer/history.reducer.spec.ts b/ui/src/app/metadata/configuration/reducer/history.reducer.spec.ts deleted file mode 100644 index a3bc830e5..000000000 --- a/ui/src/app/metadata/configuration/reducer/history.reducer.spec.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { reducer } from './history.reducer'; -import * as fromHistory from './history.reducer'; -import * as actions from '../action/history.action'; -import { MetadataHistory } from '../model/history'; - -describe('History Reducer', () => { - - const baseState = fromHistory.initialState; - - const history: MetadataHistory = { - versions: [ - { - id: '1', - date: new Date().toLocaleDateString(), - creator: 'foo' - }, - { - id: '2', - date: new Date().toDateString(), - creator: 'foo' - } - ] - }; - - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(undefined, {} as any); - - expect(result).toEqual(fromHistory.initialState); - }); - }); - - describe('SET_HISTORY action', () => { - it('should set the state metadata model', () => { - const action = new actions.SetHistory(history); - const result = reducer(fromHistory.initialState, action); - - expect(Object.keys(result.entities)).toEqual(['1', '2']); - }); - }); - - describe('SELECT_VERSION action', () => { - it('should set the state metadata model', () => { - const action = new actions.SelectVersion('1'); - const result = reducer(baseState, action); - - expect(result).toEqual({ ...baseState, selectedVersionId: '1' }); - }); - }); - - describe('CLEAR action', () => { - it('should clear the state and reset to initial state', () => { - const action = new actions.ClearHistory(); - const result = reducer({ - ...baseState, - ...history - }, action); - - expect(result).toEqual(baseState); - }); - }); - - describe('selector functions', () => { - describe('getSelectedId', () => { - it('should return the selected version id', () => { - expect(fromHistory.getSelectedVersionId({ ...baseState, selectedVersionId: '1' })).toBe('1'); - }); - }); - }); -}); diff --git a/ui/src/app/metadata/configuration/reducer/history.reducer.ts b/ui/src/app/metadata/configuration/reducer/history.reducer.ts deleted file mode 100644 index 6fcc154f7..000000000 --- a/ui/src/app/metadata/configuration/reducer/history.reducer.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { EntityState, EntityAdapter, createEntityAdapter } from '@ngrx/entity'; -import { HistoryActionTypes, HistoryActionsUnion } from '../action/history.action'; -import { MetadataVersion } from '../model/version'; - -export interface HistoryState extends EntityState { - selectedVersionId: string; - loading: boolean; -} - -export function sortByDate(a: MetadataVersion, b: MetadataVersion): number { - return a.date.localeCompare(b.date); -} - -export const adapter: EntityAdapter = createEntityAdapter({ - sortComparer: sortByDate, - selectId: (model: MetadataVersion) => model.id -}); - -export const initialState: HistoryState = adapter.getInitialState({ - selectedVersionId: null, - loading: false -}); - -export function reducer(state = initialState, action: HistoryActionsUnion): HistoryState { - switch (action.type) { - case HistoryActionTypes.LOAD_HISTORY_REQUEST: - return { - ...state, - loading: true - }; - case HistoryActionTypes.LOAD_HISTORY_ERROR: - case HistoryActionTypes.LOAD_HISTORY_SUCCESS: - return { - ...state, - loading: false - }; - case HistoryActionTypes.SET_HISTORY: - return adapter.addAll(action.payload.versions, { - ...state, - selectedVersionId: state.selectedVersionId - }); - case HistoryActionTypes.SELECT_VERSION: - return { - ...state, - selectedVersionId: action.payload - }; - case HistoryActionTypes.CLEAR_HISTORY: - return adapter.removeAll({ - ...initialState - }); - default: { - return state; - } - } -} - -export const getSelectedVersionId = (state: HistoryState) => state.selectedVersionId; -export const { - selectIds: selectVersionIds, - selectEntities: selectVersionEntities, - selectAll: selectAllVersions, - selectTotal: selectVersionTotal -} = adapter.getSelectors(); - -export const getHistoryLoading = (state: HistoryState) => state.loading; diff --git a/ui/src/app/metadata/configuration/reducer/index.spec.ts b/ui/src/app/metadata/configuration/reducer/index.spec.ts deleted file mode 100644 index d9dff5a83..000000000 --- a/ui/src/app/metadata/configuration/reducer/index.spec.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { - getConfigurationModelNameFn, - getConfigurationModelEnabledFn, - getConfigurationModelTypeFn, - getSelectedVersionNumberFn, - getSelectedIsCurrentFn -} from './index'; - -import { Metadata } from '../../domain/domain.type'; - -describe('Configuration Reducer', () => { - - describe('getConfigurationModelNameFn function', () => { - it('should return the name attribute', () => { - expect(getConfigurationModelNameFn({ serviceProviderName: 'foo' } as Metadata)).toBe('foo'); - expect(getConfigurationModelNameFn({ name: 'bar' } as Metadata)).toBe('bar'); - expect(getConfigurationModelNameFn(null)).toBe(''); - }); - }); - - describe('getConfigurationModelEnabledFn function', () => { - it('should return the enabled attribute', () => { - expect(getConfigurationModelEnabledFn({ serviceEnabled: true } as Metadata)).toBe(true); - expect(getConfigurationModelEnabledFn({ enabled: true } as Metadata)).toBe(true); - expect(getConfigurationModelEnabledFn(null)).toBe(false); - }); - }); - - describe('getConfigurationModelTypeFn function ', () => { - it('should return provider type if the object has an @type property', () => { - const md = { '@type': 'FilebackedHttpMetadataResolver' } as Metadata; - expect(getConfigurationModelTypeFn(md)).toBe('FilebackedHttpMetadataResolver'); - }); - it('should return resolver if no type is detected', () => { - const md = { serviceEnabled: true } as Metadata; - expect(getConfigurationModelTypeFn(md)).toBe('resolver'); - }); - }); - - describe('getSelectedVersionNumberFn function ', () => { - it('should return the selected version by id', () => { - const versions = [ { id: 'foo' }, { id: 'bar' } ]; - const id = 'foo'; - expect(getSelectedVersionNumberFn(versions, id)).toBe(1); - }); - }); - - describe('getSelectedIsCurrentFn function ', () => { - it('should return a boolean of whether the selected version is the most current version', () => { - const versions = [{ id: 'foo' }, { id: 'bar' }]; - const id = 'foo'; - expect(getSelectedIsCurrentFn(versions[0], versions)).toBe(true); - expect(getSelectedIsCurrentFn(versions[1], versions)).toBe(false); - }); - }); -}); diff --git a/ui/src/app/metadata/configuration/reducer/index.ts b/ui/src/app/metadata/configuration/reducer/index.ts deleted file mode 100644 index 07224ddfc..000000000 --- a/ui/src/app/metadata/configuration/reducer/index.ts +++ /dev/null @@ -1,323 +0,0 @@ -import { createSelector, createFeatureSelector } from '@ngrx/store'; - -import * as fromRoot from '../../../app.reducer'; -import * as fromConfiguration from './configuration.reducer'; -import * as fromHistory from './history.reducer'; -import * as fromCompare from './compare.reducer'; -import * as fromVersion from './version.reducer'; -import * as fromRestore from './restore.reducer'; -import * as fromFilter from './filter.reducer'; - -import { getConfigurationSectionsFn, getLimitedPropertiesFn } from './utilities'; -import { getModel } from '../../../wizard/reducer'; -import { getInCollectionFn } from '../../domain/domain.util'; -import { Metadata } from '../../domain/domain.type'; - -import * as fromResolver from '../../resolver/reducer'; -import * as fromProvider from '../../provider/reducer'; - -export interface ConfigurationState { - configuration: fromConfiguration.State; - history: fromHistory.HistoryState; - compare: fromCompare.State; - version: fromVersion.State; - restore: fromRestore.RestoreState; - filter: fromFilter.State; -} - -export const reducers = { - configuration: fromConfiguration.reducer, - history: fromHistory.reducer, - compare: fromCompare.reducer, - version: fromVersion.reducer, - restore: fromRestore.reducer, - filter: fromFilter.reducer -}; - -export interface State extends fromRoot.State { - 'metadata-configuration': ConfigurationState; -} - -export const getState = createFeatureSelector('metadata-configuration'); - -export const getConfigurationStateFn = (state: ConfigurationState) => state.configuration; -export const getHistoryStateFn = (state: ConfigurationState) => state.history; -export const getCompareStateFn = (state: ConfigurationState) => state.compare; -export const getVersionStateFn = (state: ConfigurationState) => state.version; -export const getRestoreStateFn = (state: ConfigurationState) => state.restore; -export const getFilterStateFn = (state: ConfigurationState) => state.filter; - -export const getConfigurationState = createSelector(getState, getConfigurationStateFn); -export const getConfigurationModelKind = createSelector(getConfigurationState, fromConfiguration.getModelKind); -export const getConfigurationModelId = createSelector(getConfigurationState, fromConfiguration.getModelId); - -export const getConfigurationDefinition = createSelector(getConfigurationState, fromConfiguration.getDefinition); -export const getSchema = createSelector(getConfigurationState, fromConfiguration.getSchema); -export const getConfigurationXml = createSelector(getConfigurationState, fromConfiguration.getXml); - -export const processSchemaFn = (definition, schema) => { - return definition && schema ? - definition.schemaPreprocessor ? - definition.schemaPreprocessor(schema) : schema - : schema; -}; - -export const getConfigurationSchema = createSelector(getConfigurationDefinition, getSchema, processSchemaFn); -export const getConfigurationModelEnabledFn = - (config: Metadata) => config ? ('serviceEnabled' in config) ? config.serviceEnabled : config.enabled : false; - -export const getConfigurationModelNameFn = - (config: Metadata) => config ? ('serviceProviderName' in config) ? config.serviceProviderName : config.name : ''; - -export const getConfigurationModelTypeFn = - (config: Metadata) => config ? ('@type' in config) ? config['@type'] : 'resolver' : null; - -export const filterPluginTypes = ['RequiredValidUntil', 'SignatureValidation', 'EntityRoleWhiteList']; -export const isAdditionalFilter = (type) => filterPluginTypes.indexOf(type) === -1; - -export const getVersionModelFiltersFn = - (model, kind) => kind === 'provider' ? - model.metadataFilters ? model.metadataFilters.filter(filter => isAdditionalFilter(filter['@type'])) : - [] : null; - -export const getVersionModelFilterPluginsFn = (model, kind) => { - const filters = kind === 'provider' ? - model.metadataFilters ? model.metadataFilters.filter(filter => filterPluginTypes.indexOf(filter['@type']) > -1) : - [] : null; - return filters; -}; - -// Version History - -export const getHistoryState = createSelector(getState, getHistoryStateFn); - -export const getHistoryLoading = createSelector(getHistoryState, fromHistory.getHistoryLoading); -export const getVersionEntities = createSelector(getHistoryState, fromHistory.selectVersionEntities); -export const getSelectedVersionId = createSelector(getHistoryState, fromHistory.getSelectedVersionId); -export const getVersionIds = createSelector(getHistoryState, fromHistory.selectVersionIds); -export const getVersionCollection = createSelector(getHistoryState, getVersionIds, fromHistory.selectAllVersions); -export const getSelectedVersion = createSelector(getVersionEntities, getSelectedVersionId, getInCollectionFn); -export const getSelectedVersionNumberFn = (versions, selectedId) => versions.indexOf(versions.find(v => v.id === selectedId)) + 1; -export const getSelectedVersionNumber = createSelector( - getVersionCollection, - getSelectedVersionId, - getSelectedVersionNumberFn -); - -export const getSelectedIsCurrentFn = (selected, collection) => { - return selected ? collection[0].id === selected.id : false; -}; - -export const getSelectedIsCurrent = createSelector( - getSelectedVersion, - getVersionCollection, - getSelectedIsCurrentFn -); - - -// Version Comparison - -export const getCompareState = createSelector(getState, getCompareStateFn); -export const getComparisonLoading = createSelector(getCompareState, fromCompare.getComparisonLoading); -export const getComparisonModels = createSelector(getCompareState, fromCompare.getVersionModels); -export const getComparisonModelsLoaded = createSelector(getCompareState, fromCompare.getVersionModelsLoaded); -export const getComparisonFilterId = createSelector(getCompareState, fromCompare.getFilterId); - -export const getComparisonModelsFilteredFn = (models) => models.map((model) => { - return ({ - ...model, - metadataFilters: getVersionModelFilterPluginsFn( - model, - model.hasOwnProperty('@type') ? model.hasOwnProperty('metadataFilters') ? 'provider' : 'filter' : 'resolver' - ) - }); -}); - -export const getComparisonModelsFiltered = createSelector(getComparisonModels, getComparisonModelsFilteredFn); - -export const getComparisonConfigurations = createSelector( - getComparisonModelsFiltered, - getConfigurationDefinition, - getConfigurationSchema, - getConfigurationSectionsFn -); - -export const getComparisonConfigurationCount = createSelector(getComparisonConfigurations, (config) => config ? config.dates.length : 0); - -export const getViewChangedOnly = createSelector(getCompareState, fromCompare.getViewChangedOnly); - -export const getLimitedConfigurationsFn = (configurations, limited) => { - return configurations ? ({ - ...configurations, - sections: limited ? configurations.sections : - configurations.sections.map(s => ({ - ...s, - properties: getLimitedPropertiesFn(s.properties), - })) - }) : configurations; -}; - -export const getLimitedComparisonConfigurations = createSelector( - getComparisonConfigurations, - getViewChangedOnly, - getLimitedConfigurationsFn -); - -export const getComparisonFilterListFn = (models) => models.map(m => getVersionModelFiltersFn(m, 'provider')); -export const getComparisonFilterList = createSelector(getComparisonModels, getComparisonFilterListFn); - -export const getComparisonDatesFn = (config) => config.map(m => m ? m.modifiedDate : null); -export const getComparisonDates = createSelector(getComparisonModels, getComparisonDatesFn); - -export const getComparisonFilterOrderedFn = (list) => - list.map(models => - models.map(filter => - ({ - ...filter, - comparable: list - .reduce((acc, v) => acc.concat(v), []) - .map(v => v.resourceId) - .some((id, index, coll) => { - return coll.indexOf(filter.resourceId) !== coll.lastIndexOf(filter.resourceId); - }) - }) -)); - -export const getComparisonFilterOrdered = createSelector(getComparisonFilterList, getComparisonFilterOrderedFn); - -export const getComparisonFilterConfiguration = createSelector( - getComparisonFilterOrdered, - getComparisonDates, - (filters, dates) => { - const rows = filters.reduce((num, version) => version.length > num ? version.length : num, 0); - const range = [...Array(rows).keys()]; - return { - dates, - filters: range.reduce((collection, index) => { - const val = filters.map(version => version[index]); - collection[index] = val; - return collection; - }, []) - }; - } -); - -export const getComparisonSelectedFilters = createSelector( - getComparisonModels, - getComparisonDates, - getComparisonFilterId, - (models, dates, id) => ({ - dates, - sections: [] - }) -); - -// Version Restoration - -export const getRestoreState = createSelector(getState, getRestoreStateFn); -export const getVersionState = createSelector(getState, getVersionStateFn); -export const getVersionLoading = createSelector(getVersionState, fromVersion.isVersionLoading); - -export const getVersionModel = createSelector(getVersionState, fromVersion.getVersionModel); -export const getVersionModels = createSelector(getVersionModel, (model) => model ? [model] : null); -export const getVersionConfigurationSections = createSelector( - getVersionModels, - getConfigurationDefinition, - getConfigurationSchema, - getConfigurationSectionsFn -); - -export const getVersionModelFilters = createSelector( - getVersionModel, - getConfigurationModelKind, - getVersionModelFiltersFn -); - -export const getRestorationIsValid = createSelector(getRestoreState, fromRestore.isRestorationValid); -export const getRestorationIsSaved = createSelector(getRestoreState, fromRestore.isRestorationSaved); -export const getRestorationChanges = createSelector(getRestoreState, fromRestore.getChanges); -export const getRestorationIsSaving = createSelector(getRestoreState, fromRestore.isRestorationSaving); -export const getRestorationFormStatus = createSelector(getRestoreState, fromRestore.getFormStatus); -export const getInvalidRestorationForms = createSelector(getRestoreState, fromRestore.getInvalidRestorationForms); - -export const getFormattedModel = createSelector( - getVersionModel, - getConfigurationDefinition, - (model, definition) => definition ? definition.formatter(model) : null -); - -export const getFormattedChanges = createSelector( - getRestorationChanges, - getConfigurationDefinition, - (model, definition) => definition ? definition.formatter(model) : null -); - -export const getFormattedModelWithChanges = createSelector( - getVersionModel, - getRestorationChanges, - getConfigurationDefinition, - (model, changes, definition) => definition ? definition.formatter({ - ...model, - ...changes - }) : null -); - -export const getRestorationModel = createSelector( - getVersionModel, - getRestorationChanges, - getModel, - (model, changes, empty) => ({ - ...model, - ...empty, - ...changes - }) -); - -// Filter Comparison State - -export const getFilterState = createSelector(getState, getFilterStateFn); -export const getFilterComparisonDefinition = createSelector(getFilterState, fromFilter.getDefinition); -export const getFilterComparisonSchema = createSelector(getFilterState, fromFilter.getSchema); -export const getFilterComparisonModels = createSelector(getFilterState, fromFilter.getModels); -export const getFilterComparisonConfigurations = createSelector( - getFilterComparisonModels, - getFilterComparisonDefinition, - getFilterComparisonSchema, - getConfigurationSectionsFn -); - -export const getLimitedFilterComparisonConfiguration = createSelector( - getFilterComparisonConfigurations, - getViewChangedOnly, - getLimitedConfigurationsFn -); - -// Mixed states - -export const getConfigurationModelFn = (kind, version, provider, resolver) => { - return (kind === 'provider') ? provider : resolver; -}; - -export const getConfigurationModel = createSelector( - getConfigurationModelKind, - getSelectedVersionId, - fromProvider.getSelectedProvider, - fromResolver.getSelectedResolver, - getConfigurationModelFn -); -export const getConfigurationModelList = createSelector(getConfigurationModel, (model) => [model]); - -export const getConfigurationSections = createSelector( - getConfigurationModelList, - getConfigurationDefinition, - getConfigurationSchema, - getConfigurationSectionsFn -); - -export const getConfigurationModelEnabled = createSelector(getConfigurationModel, getConfigurationModelEnabledFn); -export const getConfigurationModelName = createSelector(getConfigurationModel, getConfigurationModelNameFn); -export const getConfigurationModelType = createSelector(getConfigurationModel, getConfigurationModelTypeFn); - -export const getConfigurationHasXml = createSelector(getConfigurationXml, xml => !!xml); -export const getConfigurationFilters = createSelector(getConfigurationModel, model => model.metadataFilters); -export const getConfigurationVersionDate = createSelector(getVersionModel, version => version && version.modifiedDate); diff --git a/ui/src/app/metadata/configuration/reducer/restore.reducer.spec.ts b/ui/src/app/metadata/configuration/reducer/restore.reducer.spec.ts deleted file mode 100644 index 97795549b..000000000 --- a/ui/src/app/metadata/configuration/reducer/restore.reducer.spec.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { reducer } from './restore.reducer'; -import * as fromRestore from './restore.reducer'; -import { - RestoreActionTypes, - RestoreActionsUnion, - UpdateRestorationChangesSuccess, - SetSavingStatus, - UpdateRestoreFormStatus -} from '../action/restore.action'; -import { Metadata } from '../../domain/domain.type'; - -describe('Restore Reducer', () => { - - const baseState = fromRestore.initialState; - - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(undefined, {} as any); - - expect(result).toEqual(fromRestore.initialState); - }); - }); - - describe(`${RestoreActionTypes.UPDATE_RESTORATION_SUCCESS} action`, () => { - it('should set the state metadata model', () => { - const serviceEnabled = true; - const action = new UpdateRestorationChangesSuccess({ serviceEnabled }); - const result = reducer(fromRestore.initialState, action); - - expect(result.changes).toEqual({serviceEnabled} as Metadata); - }); - }); - - describe(`${RestoreActionTypes.SET_SAVING_STATUS} action`, () => { - it('should set the state saving status', () => { - const action = new SetSavingStatus(true); - const result = reducer(fromRestore.initialState, action); - - expect(result.saving).toBe(true); - }); - }); - - describe(`${RestoreActionTypes.UPDATE_STATUS} action`, () => { - it('should set the state saving status', () => { - const action = new UpdateRestoreFormStatus({foo: 'INVALID'}); - const result = reducer(fromRestore.initialState, action); - - expect(result.status.foo).toBe('INVALID'); - }); - }); - - describe('selector function', () => { - describe('getChanges', () => { - it('should return the selected version id', () => { - expect(fromRestore.getChanges({ ...baseState, changes: { serviceEnabled: false } })).toEqual({ serviceEnabled: false }); - }); - }); - - describe('isRestorationSaved', () => { - it('should return false if there are outstanding changes', () => { - expect(fromRestore.isRestorationSaved({ ...baseState, changes: { name: 'too' } })).toBe(false); - }); - - it('should return true if there are no outstanding changes', () => { - expect(fromRestore.isRestorationSaved({ ...baseState, changes: {} })).toBe(true); - }); - }); - - describe('getFormStatus', () => { - it('should return the current form status', () => { - expect(fromRestore.getFormStatus({ ...baseState, status: { common: 'INVALID' } })).toEqual({ common: 'INVALID' }); - }); - }); - - describe('isRestorationSaving', () => { - it('should return the saving status', () => { - expect(fromRestore.isRestorationSaving({ ...baseState })).toBe(false); - expect(fromRestore.isRestorationSaving({ ...baseState, saving: true })).toBe(true); - }); - }); - - describe('isRestorationValid', () => { - it('should return false if any forms have an invalid status', () => { - expect(fromRestore.isRestorationValid({ ...baseState, status: { common: 'INVALID' } })).toBe(false); - }); - - it('should return true if all forms have a valid status', () => { - expect(fromRestore.isRestorationValid({ ...baseState, status: { common: 'VALID' } })).toBe(true); - }); - }); - - describe('getInvalidRestorationForms', () => { - it('should return the form names that are invalid', () => { - expect(fromRestore.getInvalidRestorationForms({ ...baseState, status: { common: 'INVALID' } })).toEqual(['common']); - }); - }); - }); -}); diff --git a/ui/src/app/metadata/configuration/reducer/restore.reducer.ts b/ui/src/app/metadata/configuration/reducer/restore.reducer.ts deleted file mode 100644 index e0c58c2b7..000000000 --- a/ui/src/app/metadata/configuration/reducer/restore.reducer.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { Metadata } from '../../domain/domain.type'; -import { RestoreActionTypes, RestoreActionsUnion } from '../action/restore.action'; - -export interface RestoreState { - saving: boolean; - status: { [key: string]: string }; - changes: Partial; -} - -export const initialState: RestoreState = { - saving: false, - status: {}, - changes: {} as Metadata -}; - -export function reducer(state = initialState, action: RestoreActionsUnion): RestoreState { - switch (action.type) { - case RestoreActionTypes.UPDATE_RESTORATION_SUCCESS: - return { - ...state, - changes: { - ...state.changes, - ...action.payload - } - }; - case RestoreActionTypes.SET_SAVING_STATUS: - return { - ...state, - saving: action.payload - }; - case RestoreActionTypes.UPDATE_STATUS: { - return { - ...state, - status: { - ...state.status, - ...action.payload - } - }; - } - default: { - return state; - } - } -} - -export const isRestorationSaved = (state: RestoreState) => !Object.keys(state.changes).length; -export const getChanges = (state: RestoreState) => state.changes; -export const isRestorationSaving = (state: RestoreState) => state.saving; -export const getFormStatus = (state: RestoreState) => state.status; - -export const isRestorationValid = (state: RestoreState) => - !Object.keys(state.status).some(key => state.status[key] === ('INVALID')); -export const getInvalidRestorationForms = (state: RestoreState) => - Object.keys(state.status).filter(key => state.status[key] === 'INVALID'); diff --git a/ui/src/app/metadata/configuration/reducer/utilities.spec.ts b/ui/src/app/metadata/configuration/reducer/utilities.spec.ts deleted file mode 100644 index 0d8234bb5..000000000 --- a/ui/src/app/metadata/configuration/reducer/utilities.spec.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { - getConfigurationSectionsFn, - getLimitedPropertiesFn, - assignValueToProperties -} from './utilities'; - -import { SCHEMA as schema } from '../../../../testing/form-schema.stub'; -import { MockMetadataWizard } from '../../../../testing/mockMetadataWizard'; - -describe('config reducer utilities', () => { - - const model = { - name: 'foo', - serviceEnabled: true, - foo: { - bar: 'bar', - baz: 'baz' - }, - list: [ - 'super', - 'cool' - ] - }; - - const props = [ - { - id: 'name', - items: null, - name: 'label.metadata-provider-name-dashboard-display-only', - properties: [], - type: 'string', - value: null, - widget: { id: 'string', help: 'message.must-be-unique' } - }, - { - id: 'serviceEnabled', - items: null, - name: 'serviceEnabled', - properties: [], - type: 'string', - value: null, - widget: { id: 'select', disabled: true } - }, - { - id: 'foo', - items: null, - name: 'foo', - type: 'object', - properties: [ - { - id: 'bar', - name: 'bar', - type: 'string', - properties: [] - }, - { - id: 'baz', - name: 'baz', - type: 'string', - properties: [] - } - ] - }, - { - id: 'list', - name: 'list', - type: 'array', - items: { - type: 'string' - }, - widget: { - id: 'datalist', - data: [ - { key: 'super', label: 'super' }, - { key: 'cool', label: 'cool' }, - { key: 'notcool', label: 'notcool' } - ] - } - } - ]; - - const definition = MockMetadataWizard; - - describe('assignValueToProperties function', () => { - it('should assign appropriate values to the given schema properties', () => { - const assigned = assignValueToProperties([model], props, definition); - expect(assigned[0].value).toEqual(['foo']); - expect(assigned[1].value).toEqual([true]); - }); - - it('should assign differences when passed multiple models', () => { - const assigned = assignValueToProperties([model, { - ...model, - name: 'bar', - list: [ - 'super', - 'notcool' - ] - }], props, definition); - expect(assigned[0].differences).toBe(true); - }); - }); - - describe('getLimitedPropertiesFn function', () => { - it('should filter properties without differences', () => { - const assigned = assignValueToProperties([model, { - ...model, - name: 'bar' - }], props, definition); - expect(getLimitedPropertiesFn(assigned).length).toBe(1); - }); - }); - - describe('getConfigurationSectionsFn', () => { - it('should parse the schema, definition, and model into a MetadataConfiguration', () => { - const config = getConfigurationSectionsFn([model], definition, schema); - expect(config.sections).toBeDefined(); - }); - }); -}); diff --git a/ui/src/app/metadata/configuration/reducer/utilities.ts b/ui/src/app/metadata/configuration/reducer/utilities.ts deleted file mode 100644 index 1cba47fbd..000000000 --- a/ui/src/app/metadata/configuration/reducer/utilities.ts +++ /dev/null @@ -1,138 +0,0 @@ -import { MetadataConfiguration } from '../model/metadata-configuration'; -import { WizardStep } from '../../../wizard/model'; -import * as utils from '../../domain/utility/configuration'; -import { getSplitSchema } from '../../../wizard/reducer'; -import { SectionProperty } from '../model/section'; - -function omit(key, obj) { - if (!obj) { - return obj; - } - const { [key]: omitted, ...rest } = obj; - return rest; -} - -export const rollupDifferences = (prop) => { - let updates = { - ...prop - }; - - if (prop.properties) { - updates = { - ...updates, - properties: [ - ...prop.properties.map(p => rollupDifferences(p)) - ] - }; - } - - prop.differences = prop.properties.some(p => p.differences); - - return updates; -}; - -export const getConfigurationSectionsFn = (models, definition, schema): MetadataConfiguration => { - return !definition || !schema || !models ? null : - ({ - dates: models.map(m => m ? m.modifiedDate : null), - sections: definition.steps - .filter(step => step.id !== 'summary') - .map( - (step: WizardStep, num: number) => { - return ({ - id: step.id, - pageNumber: num + 1, - index: step.index, - label: step.label, - properties: utils.getStepProperties( - getSplitSchema(schema, step), - definition.formatter({}), - schema.definitions || {} - ) - }); - } - ) - .map((section: any) => { - return { - ...section, - properties: assignValueToProperties(models, section.properties, definition) - }; - }) - .map((section: any) => ({ - ...section, - differences: section.properties.some(prop => prop.differences) - })) - }); -}; - -const getDifferences = (models, prop) => { - return models.some((model, index, array) => { - if (!array) { - return false; - } - const prop1 = omit('modifiedDate', model[prop.id]); - const prop2 = omit('modifiedDate', array[0][prop.id]); - return JSON.stringify(prop1) !== JSON.stringify(prop2); - }); -}; - -export const assignValueToProperties = (models, properties, definition: any): any[] => { - return properties.map(prop => { - const differences = getDifferences(models, prop); - - const widget = prop.type === 'array' && prop.widget && prop.widget.data ? ({ - ...prop.widget, - data: prop.widget.data.map(item => ({ - ...item, - differences: models - .map((model) => { - const value = model[prop.id]; - return value ? value.indexOf(item.key) > -1 : false; - }) - .reduce((current, val) => current !== val ? true : false, false) - })) - }) : null; - - switch (prop.type) { - case 'object': - return { - ...prop, - properties: assignValueToProperties( - models.map(model => definition.formatter(model)[prop.id] || {}), - prop.properties, - definition - ), - differences: getDifferences(models, prop) - }; - default: - return { - ...prop, - differences, - value: models.map(model => { - return model[prop.id]; - }), - widget - }; - } - }); -}; - -export const getLimitedPropertiesFn = (properties: SectionProperty[]) => { - return ([ - ...properties - .filter(p => p.differences) - .map(p => { - const parsed = { ...p }; - if (p.widget && p.widget.data) { - parsed.widget = { - ...p.widget, - data: p.widget.data.filter(item => item.differences) - }; - } - if (p.properties) { - parsed.properties = getLimitedPropertiesFn(p.properties); - } - return parsed; - }) - ]); -}; diff --git a/ui/src/app/metadata/configuration/reducer/version.reducer.spec.ts b/ui/src/app/metadata/configuration/reducer/version.reducer.spec.ts deleted file mode 100644 index a564df384..000000000 --- a/ui/src/app/metadata/configuration/reducer/version.reducer.spec.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { - reducer, - getVersionModel, - getVersionModelLoaded, - getSelectedMetadataId, - getSelectedVersionId, - getSelectedVersionType -} from './version.reducer'; -import * as fromVersion from './version.reducer'; -import { - VersionActionTypes, - SelectVersionRequest, - ClearVersion, - SelectVersionSuccess -} from '../action/version.action'; -import { Metadata } from '../../domain/domain.type'; -import { VersionRequest } from '../model/request'; - -describe('Restore Reducer', () => { - - let baseState; - - const req: VersionRequest = { - type: 'provider', - version: 'foo', - id: 'bar' - }; - - const model: Metadata = { - id: 'bar', - name: 'foo', - '@type': 'MetadataProvider', - type: 'provider', - resourceId: 'foo', - createdBy: 'bar' - }; - - beforeEach(() => { - baseState = { ...fromVersion.initialState }; - }); - - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(undefined, {} as any); - - expect(result).toEqual(baseState); - }); - }); - - describe(`${VersionActionTypes.SELECT_VERSION_REQUEST} action`, () => { - it('should set the needed metadata properties', () => { - const action = new SelectVersionRequest(req); - const result = reducer(baseState, action); - - expect(result.selectedMetadataId).toEqual(req.id); - }); - }); - - describe(`${VersionActionTypes.SELECT_VERSION_SUCCESS} action`, () => { - it('should set the needed metadata properties', () => { - const action = new SelectVersionSuccess(model as Metadata); - const result = reducer(baseState, action); - - expect(result).toEqual({ ...baseState, model, loaded: true }); - }); - }); - - describe(`${VersionActionTypes.CLEAR_VERSION} action`, () => { - it('should set the needed metadata properties', () => { - const action = new ClearVersion(); - const result = reducer(baseState, action); - - expect(result).toEqual(baseState); - }); - }); - - describe('selector function', () => { - describe('getSelectedMetadataId', () => { - it('should return the selected version id', () => { - expect(getVersionModel({ ...baseState, model })).toEqual(model); - }); - }); - - describe('getSelectedMetadataVersion', () => { - it('should return the selected version id', () => { - expect(getVersionModelLoaded({ ...baseState, loaded: true })).toBe(true); - }); - }); - - describe('getSelectedMetadataId', () => { - it('should return the selected resource id', () => { - expect(getSelectedMetadataId({ ...baseState, selectedMetadataId: req.id})).toEqual(req.id); - }); - }); - - describe('getSelectedMetadataType', () => { - it('should return the selected version type', () => { - expect(getSelectedVersionType({ ...baseState, selectedVersionType: req.type })).toEqual(req.type); - }); - }); - - describe('getSelectedMetadataType', () => { - it('should return the selected version id', () => { - expect(getSelectedVersionId({ ...baseState, selectedVersionId: req.version })).toEqual(req.version); - }); - }); - }); -}); diff --git a/ui/src/app/metadata/configuration/reducer/version.reducer.ts b/ui/src/app/metadata/configuration/reducer/version.reducer.ts deleted file mode 100644 index caaf1f085..000000000 --- a/ui/src/app/metadata/configuration/reducer/version.reducer.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { VersionActionTypes, VersionActionsUnion } from '../action/version.action'; -import { Metadata } from '../../domain/domain.type'; - -export interface State { - model: Metadata; - selectedVersionId: string; - selectedVersionType: string; - selectedMetadataId: string; - loaded: boolean; - loading: boolean; -} - -export const initialState: State = { - model: null, - selectedVersionId: null, - selectedMetadataId: null, - selectedVersionType: null, - loaded: false, - loading: false -}; - -export function reducer(state = initialState, action: VersionActionsUnion): State { - switch (action.type) { - case VersionActionTypes.SELECT_VERSION_REQUEST: - return { - ...state, - selectedMetadataId: action.payload.id, - selectedVersionId: action.payload.version, - selectedVersionType: action.payload.type, - loading: true - }; - case VersionActionTypes.SELECT_VERSION_SUCCESS: - return { - ...state, - model: action.payload, - loaded: true, - loading: false - }; - case VersionActionTypes.SELECT_VERSION_ERROR: - return { - ...state, - model: null, - loaded: false, - loading: false - }; - case VersionActionTypes.CLEAR_VERSION: - return { - ...initialState - }; - default: { - return state; - } - } -} - -export const getVersionModel = (state: State) => state.model; -export const getVersionModelLoaded = (state: State) => state.loaded; -export const isVersionLoading = (state: State) => state.loading; - -export const getSelectedMetadataId = (state: State) => state.selectedMetadataId; -export const getSelectedVersionId = (state: State) => state.selectedVersionId; -export const getSelectedVersionType = (state: State) => state.selectedVersionType; diff --git a/ui/src/app/metadata/configuration/service/configuration.service.spec.ts b/ui/src/app/metadata/configuration/service/configuration.service.spec.ts deleted file mode 100644 index e02d9bd80..000000000 --- a/ui/src/app/metadata/configuration/service/configuration.service.spec.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { TestBed, inject, waitForAsync } from '@angular/core/testing'; -import { HttpClientModule, HttpRequest } from '@angular/common/http'; -import { HttpTestingController, HttpClientTestingModule } from '@angular/common/http/testing'; -import { MetadataConfigurationService } from './configuration.service'; -import { FileBackedHttpMetadataProviderEditor } from '../../provider/model'; -import { MetadataSourceEditor } from '../../domain/model/wizards/metadata-source-editor'; -import { ResolverService } from '../../domain/service/resolver.service'; -import { of } from 'rxjs'; -import { MetadataProviderService } from '../../domain/service/provider.service'; -import { Metadata } from '../../domain/domain.type'; -import { SCHEMA } from '../../../../testing/form-schema.stub'; -import { getConfigurationSectionsFn } from '../reducer/utilities'; - -describe(`Configuration Service`, () => { - - let resolverService: any; - let providerService: any; - - let mockService = { - find: () => of([]) - }; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - HttpClientModule, - HttpClientTestingModule - ], - providers: [ - MetadataConfigurationService, - { - provide: ResolverService, - useValue: mockService - }, - { - provide: MetadataProviderService, - useValue: mockService - } - ] - }); - - resolverService = TestBed.get(ResolverService); - providerService = TestBed.get(MetadataProviderService); - - }); - - describe('find method', () => { - it(`should call the resolver service when type is resolver`, waitForAsync(inject([MetadataConfigurationService, HttpTestingController], - (service: MetadataConfigurationService, backend: HttpTestingController) => { - spyOn(resolverService, 'find').and.callThrough(); - const type = 'resolver'; - const id = 'foo'; - service.find(id, type).subscribe(); - expect(resolverService.find).toHaveBeenCalledWith(id); - } - ))); - it(`should call the provider service when type is resolver`, waitForAsync(inject([MetadataConfigurationService, HttpTestingController], - (service: MetadataConfigurationService, backend: HttpTestingController) => { - spyOn(providerService, 'find').and.callThrough(); - const type = 'provider'; - const id = 'foo'; - service.find(id, type).subscribe(); - expect(providerService.find).toHaveBeenCalledWith(id); - } - ))); - it(`should throw an error when a type is not found`, waitForAsync(inject([MetadataConfigurationService, HttpTestingController], - (service: MetadataConfigurationService, backend: HttpTestingController) => { - spyOn(providerService, 'find').and.callThrough(); - const type = 'bar'; - const id = 'foo'; - service.find(id, type).subscribe(null, (err) => { - expect(err).toEqual(new Error('Type not supported')); - }); - } - ))); - }); - - describe('loadSchema method', () => { - it(`should send an expected GET request`, waitForAsync(inject([MetadataConfigurationService, HttpTestingController], - (service: MetadataConfigurationService, backend: HttpTestingController) => { - const path = '/foo.json'; - service.loadSchema(path).subscribe(); - backend.expectOne((req: HttpRequest) => { - return req.url === `${path}` - && req.method === 'GET'; - }, `GET schema by path`); - } - ))); - }); - - describe('getDefinition method', () => { - it(`should retrieve the editor definition by model type`, waitForAsync(inject([MetadataConfigurationService, HttpTestingController], - (service: MetadataConfigurationService, backend: HttpTestingController) => { - const def = service.getDefinition('FileBackedHttpMetadataResolver'); - expect(def).toBe(FileBackedHttpMetadataProviderEditor); - } - ))); - - it(`should instantiate an editor for resolvers`, waitForAsync(inject([MetadataConfigurationService], - (service: MetadataConfigurationService) => { - const def = service.getDefinition('foo'); - expect(def instanceof MetadataSourceEditor).toBe(true); - } - ))); - }); - - describe('getMetadataConfiguration method', () => { - it('should return the parsed configuration', waitForAsync(inject([MetadataConfigurationService], - (service: MetadataConfigurationService) => { - const model = {} as Metadata; - const definition = {steps: []}; - const expected = getConfigurationSectionsFn([model], definition, SCHEMA); - expect(service.getMetadataConfiguration(model, definition, SCHEMA)).toEqual(expected); - } - ))); - }); -}); diff --git a/ui/src/app/metadata/configuration/service/configuration.service.ts b/ui/src/app/metadata/configuration/service/configuration.service.ts deleted file mode 100644 index df8a3dba0..000000000 --- a/ui/src/app/metadata/configuration/service/configuration.service.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { HttpClient } from '@angular/common/http'; -import { Injectable } from '@angular/core'; -import { Observable, of, throwError } from 'rxjs'; -import { Metadata } from '../../domain/domain.type'; -import { Wizard } from '../../../wizard/model'; -import { MetadataSourceEditor } from '../../domain/model/wizards/metadata-source-editor'; -import { MetadataProviderEditorTypes } from '../../provider/model'; -import { Schema } from '../model/schema'; -import { TYPES } from '../configuration.values'; -import { ResolverService } from '../../domain/service/resolver.service'; -import { MetadataProviderService } from '../../domain/service/provider.service'; -import { MetadataFilterEditorTypes } from '../../filter/model'; -import { getConfigurationSectionsFn } from '../reducer/utilities'; - -@Injectable() -export class MetadataConfigurationService { - - constructor( - private resolverService: ResolverService, - private providerService: MetadataProviderService, - private http: HttpClient - ) {} - - find(id: string, type: string): Observable { - switch (type) { - case TYPES.resolver: - return this.resolverService.find(id); - case TYPES.provider: - return this.providerService.find(id); - default: - return throwError(new Error('Type not supported')); - } - } - - getDefinition(type: string): Wizard { - return MetadataProviderEditorTypes.find(def => def.type === type) || - MetadataFilterEditorTypes.find(def => def.type === type) || - new MetadataSourceEditor(); - } - - loadSchema(path: string): Observable { - return this.http.get(path); - } - - getMetadataConfiguration(model, definition, schema) { - return getConfigurationSectionsFn([model], definition, schema); - } -} - diff --git a/ui/src/app/metadata/configuration/service/history.service.spec.ts b/ui/src/app/metadata/configuration/service/history.service.spec.ts deleted file mode 100644 index 447be26be..000000000 --- a/ui/src/app/metadata/configuration/service/history.service.spec.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { TestBed, inject, waitForAsync } from '@angular/core/testing'; -import { HttpClientModule, HttpRequest } from '@angular/common/http'; -import { HttpTestingController, HttpClientTestingModule } from '@angular/common/http/testing'; -import { MetadataHistoryService } from './history.service'; -import { of } from 'rxjs'; -import { PATHS } from '../configuration.values'; -import { Metadata } from '../../domain/domain.type'; - -describe(`Attributes Service`, () => { - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - HttpClientModule, - HttpClientTestingModule - ], - providers: [ - MetadataHistoryService - ] - }); - }); - - describe('query method', () => { - it(`should return a MetadataHistory`, waitForAsync(inject([MetadataHistoryService, HttpTestingController], - (service: MetadataHistoryService) => { - service.query('foo', 'resolver').subscribe(history => { - expect(history).toBeDefined(); - }); - } - ))); - }); - - describe('getVersions method', () => { - it(`should join a list of observables`, waitForAsync(inject([MetadataHistoryService, HttpTestingController], - (service: MetadataHistoryService) => { - spyOn(service, 'getVersion').and.returnValue(of()); - service.getVersions('foo', ['abc', 'def'], 'resolver').subscribe(history => { - expect(service.getVersion).toHaveBeenCalledTimes(2); - }); - } - ))); - }); - - describe('getVersion method', () => { - it(`should get the primary version of the resource`, waitForAsync(inject([MetadataHistoryService, HttpTestingController], - (service: MetadataHistoryService, backend: HttpTestingController) => { - const resourceId = 'foo'; - const type = 'resource'; - service.getVersion(resourceId, type).subscribe(); - backend.expectOne((req: HttpRequest) => { - return req.url === `${service.base}/${PATHS[type]}/${resourceId}` - && req.method === 'GET'; - }, `GET schema by path`); - } - ))); - it(`should get the provided version of the resource`, waitForAsync(inject([MetadataHistoryService, HttpTestingController], - (service: MetadataHistoryService, backend: HttpTestingController) => { - const resourceId = 'foo'; - const type = 'resource'; - const versionId = '1'; - service.getVersion(resourceId, type, versionId).subscribe(); - backend.expectOne((req: HttpRequest) => { - return req.url === `${service.base}/${PATHS[type]}/${resourceId}/${service.path}/${versionId}` - && req.method === 'GET'; - }, `GET schema by path`); - } - ))); - }); - - describe('updateVersion method', () => { - it(`should send a put request`, waitForAsync(inject([MetadataHistoryService, HttpTestingController], - (service: MetadataHistoryService, backend: HttpTestingController) => { - const resourceId = 'foo'; - const type = 'resource'; - const versionId = '1'; - service.updateVersion(resourceId, type, {} as Metadata).subscribe(); - backend.expectOne((req: HttpRequest) => { - return req.url === `${service.base}/${PATHS[type]}/${resourceId}` - && req.method === 'PUT'; - }, `PUT schema by path`); - } - ))); - }); -}); diff --git a/ui/src/app/metadata/configuration/service/history.service.ts b/ui/src/app/metadata/configuration/service/history.service.ts deleted file mode 100644 index 9e6a3d3f3..000000000 --- a/ui/src/app/metadata/configuration/service/history.service.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; -import { Observable, forkJoin } from 'rxjs'; -import { MetadataHistory } from '../model/history'; - -import { PATHS } from '../../configuration/configuration.values'; -import { MetadataVersion } from '../model/version'; -import { map } from 'rxjs/operators'; -import { Metadata } from '../../domain/domain.type'; -import API_BASE_PATH from '../../../app.constant'; - -@Injectable() -export class MetadataHistoryService { - - readonly base = API_BASE_PATH; - readonly path = `Versions`; - - constructor( - private http: HttpClient - ) { } - - query(resourceId: string, type: string): Observable { - return this.http.get(`${this.base}/${PATHS[type]}/${resourceId}/${this.path}`).pipe( - map(resp => ({ - versions: resp - })) - ); - } - - getVersions(resourceId: string, versions: string[], type: string): Observable { - return forkJoin(versions.map( - v => this.getVersion(resourceId, type, v) - )); - } - - getVersion(resourceId: string, type: string, versionId: string = null): Observable { - const api = versionId ? - `${this.base}/${PATHS[type]}/${resourceId}/${this.path}/${versionId}` - : - `${this.base}/${PATHS[type]}/${resourceId}`; - return this.http.get(api); - } - - updateVersion(resourceId: string, type: string, model: Metadata): Observable { - return this.http.put(`${this.base}/${PATHS[type]}/${resourceId}`, model); - } -} diff --git a/ui/src/app/metadata/configuration/service/index-resolver.service.ts b/ui/src/app/metadata/configuration/service/index-resolver.service.ts deleted file mode 100644 index 4bbc5e07e..000000000 --- a/ui/src/app/metadata/configuration/service/index-resolver.service.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Resolve, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; -import { Store } from '@ngrx/store'; -import { WizardState } from '../../../wizard/reducer'; -import { SetIndex } from '../../../wizard/action/wizard.action'; - -@Injectable() -export class IndexResolver implements Resolve { - constructor(private store: Store) { } - - resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { - this.store.dispatch(new SetIndex(route.params.index)); - } -} diff --git a/ui/src/app/metadata/contention/ContentionContext.js b/ui/src/app/metadata/contention/ContentionContext.js new file mode 100644 index 000000000..1224ce929 --- /dev/null +++ b/ui/src/app/metadata/contention/ContentionContext.js @@ -0,0 +1,157 @@ +import React from "react"; + +import { updatedDiff } from 'deep-object-diff'; +import { removeNull } from '../../core/utility/remove_null'; + +import {ContentionModal} from './component/ContentionModal'; + +const ContentionContext = React.createContext(); + +const { Provider, Consumer } = ContentionContext; + +const initialState = { + theirs: null, + ours: null, + base: null, + ourChanges: null, + theirChanges: null, + resolution: null, + reject: null, + resolve: null, + show: false +}; + +export const ContentionActions = { + OPEN_CONTENTION_MODAL: 'open contention', + END_CONTENTION: 'end contention' +}; + +const keys = [ + 'version', + 'modifiedDate', + 'createdDate', + 'createdBy', + 'modifiedBy', + 'audId', + 'resourceId', + 'current', + '@type' +]; + +const filterKeys = (key => (keys.indexOf(key) === -1)); + + +const getContention = (base, ours, theirs) => { + + let theirDiff = updatedDiff(base, theirs); + let ourDiff = updatedDiff(base, removeNull(ours)); + let ourKeys = Object.keys(ourDiff).filter(filterKeys); + let theirKeys = Object.keys(theirDiff).filter(filterKeys); + + const ourChanges = ourKeys.map(key => getChangeItem(key, ours)); + const theirChanges = theirKeys.map(key => getChangeItem(key, theirs, ourKeys)); + const resolution = { ...base, ...ours, version: theirs.version } + + return { + ourChanges, + theirChanges, + resolution + }; +} + +const getChangeItem = (key, collection, compare = []) => { + return { + label: key, + value: collection[key], + conflict: compare.some(o => o === key) + }; +} + + +export const openContentionModalAction = (base, theirs, ours, resolve, reject) => { + + const { ourChanges, theirChanges, resolution } = getContention(base, ours, theirs); + + return { + type: ContentionActions.OPEN_CONTENTION_MODAL, + payload: { + base, + theirs, + ours, + theirChanges, + ourChanges, + resolution, + reject, + resolve + } + } +} + +export const resolveContentionAction = () => { + return { + type: ContentionActions.END_CONTENTION, + } +} + +function reducer(state, action) { + switch (action.type) { + case ContentionActions.OPEN_CONTENTION_MODAL: + return { + ...action.payload, + show: true + }; + case ContentionActions.END_CONTENTION: + return { + ...initialState, + show: false + }; + default: + throw new Error(); + } +} + +/*eslint-disable react-hooks/exhaustive-deps*/ +function Contention({ children }) { + const [state, dispatch] = React.useReducer(reducer, initialState); + + const { show, theirs, theirChanges, ourChanges, resolution, reject, resolve } = state; + + const onReject = () => { + reject(theirs); + dispatch(resolveContentionAction()); + } + + const onResolve = () => { + resolve(resolution); + dispatch(resolveContentionAction()); + } + + const contextValue = React.useMemo(() => ({ state, dispatch }), [state, dispatch]); + + return ( + + onReject()} + onUseOurs={() => onResolve(resolution)} + backdrop="static" + keyboard={false} /> + {children} + + ); +} + +function useContentionDispatcher() { + const { dispatch } = React.useContext(ContentionContext); + return dispatch; +} + +export { + Contention, + ContentionContext, + useContentionDispatcher, + Provider as ContentionProvider, + Consumer as ContentionConsumer +}; \ No newline at end of file diff --git a/ui/src/app/metadata/contention/component/ChangeItem.js b/ui/src/app/metadata/contention/component/ChangeItem.js new file mode 100644 index 000000000..7c107beb4 --- /dev/null +++ b/ui/src/app/metadata/contention/component/ChangeItem.js @@ -0,0 +1,131 @@ +import React from 'react'; +import Translate from '../../../i18n/components/translate'; + +export const ValueTypes = { + array: 'array', + object: 'object', + string: 'string', + number: 'number', + symbol: 'symbol', + boolean: 'boolean', + function: 'function', + undefined: 'undefined' +} + + +function getType(value) { + return Array.isArray(value) ? 'array' : typeof value; +} + +function getValue(val, type) { + switch (type) { + case 'object': { + return Object.keys(val).map(k => ({ label: k, value: val[k] })); + } + case 'array': { + return parseArray(val); + } + default: { + return val; + } + } +} + +function parseArray(list) { + switch (getType(list[0])) { + case 'string': { + return { + type: 'string', + values: list + }; + } + default: { + return { + type: 'object', + headings: list.reduce((arr, o) => { + return Object.keys(o).reduce((a, k) => { + if (a.indexOf(k) === -1) { a.push(k); } + return a; + }, arr); + }, []), + values: list + }; + } + } +} + +export function ChangeItem ({item}) { + + const isList = Array.isArray(item.value); + + const type = getType(item.value); + const display = getValue(item.value, type); + + return ( + +
+
{item.label}
+ {item.conflict && + + + Conflict + + } +
+ { type === ValueTypes.array ? + + {display.type === ValueTypes.object && + + + + {display.headings.map((heading, idx) => + + )} + + + + {display.values.map((obj, oidx) => ( + + {display.headings.map((key, kidx) => + + )} + + ))} + + + } + { display.type === ValueTypes.string && + + {display.values.map((val, vidx) => + + + + )} + + + } + + + +
+ {heading} +
{ obj[key] }
{val}
+ : + type === ValueTypes.object ? +
+ {display.map((item, iidx) => + +
{item.label}
+
{ item.value }
+
+ )} +
+ : + + {!isList &&

} +
+ } +
+ + ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/contention/component/ContentionModal.js b/ui/src/app/metadata/contention/component/ContentionModal.js new file mode 100644 index 000000000..50c0ec991 --- /dev/null +++ b/ui/src/app/metadata/contention/component/ContentionModal.js @@ -0,0 +1,108 @@ +import React from 'react'; + +import Modal from 'react-bootstrap/Modal'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons'; +import Button from 'react-bootstrap/Button'; + +import Translate from '../../../i18n/components/translate'; +import { useTranslator } from '../../../i18n/hooks'; +import { ChangeItem } from './ChangeItem'; +import Alert from 'react-bootstrap/Alert'; + +export function ContentionModal ({ theirs = [], ours = [], onUseTheirs, onUseOurs, ...props }) { + + const translator = useTranslator(); + + const resolutionObj = {}; + const rejectionObj = {}; + + return ( + + +

Data Version Contention

+
+ + {/*
+
+
{JSON.stringify(theirs, null, 4)}
+
+
+
{JSON.stringify(ours, null, 4)}
+
+
*/} + +
+ + {theirs && theirs.length > 0 ? +

+ A newer version of this metadata source has been saved. Below are a list of changes. You can use your changes or their changes. +

+ : +

+ There was a problem saving due to a mismatched version. +

+ } +
+ {theirs && theirs.length > 0 && +
+
+
+
+ My Changes +
+
+ {ours && ours.map((item, idx) => +
+ +
+ )} + {ours && ours.length === 0 && + + You haven't made any changes. + + } +
+
+
+
+
+
+ Their Changes +
+
+ {theirs.map((item, idx) => +
+ +
+ )} +
+
+
+
+ } +
+ {theirs && theirs.length < 1 ? + + + + : + ours && ours.length < 1 ? + + + + : + + + + + } +
+ ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/copy/CopySource.js b/ui/src/app/metadata/copy/CopySource.js new file mode 100644 index 000000000..65e90a5e5 --- /dev/null +++ b/ui/src/app/metadata/copy/CopySource.js @@ -0,0 +1,206 @@ +import React from 'react'; +import { useForm } from 'react-hook-form'; +import Check from 'react-bootstrap/FormCheck'; +import Button from 'react-bootstrap/Button'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { faArrowCircleRight, faAsterisk, faCheck, faTimes } from '@fortawesome/free-solid-svg-icons'; + +import { Translate } from '../../i18n/components/translate'; +import { EntityTypeahead } from './EntityTypeahead'; +import kebabCase from 'lodash/kebabCase'; + +const sections = [ + { i18nKey: 'organizationInformation', property: 'organization' }, + { i18nKey: 'contacts', property: 'contacts' }, + { i18nKey: 'uiMduiInfo', property: 'mdui' }, + { i18nKey: 'spSsoDescriptorInfo', property: 'serviceProviderSsoDescriptor' }, + { i18nKey: 'logoutEndpoints', property: 'logoutEndpoints' }, + { i18nKey: 'securityDescriptorInfo', property: 'securityInfo' }, + { i18nKey: 'assertionConsumerServices', property: 'assertionConsumerServices' }, + { i18nKey: 'relyingPartyOverrides', property: 'relyingPartyOverrides' }, + { i18nKey: 'attributeRelease', property: 'attributeRelease' } +]; + +export function CopySource({ copy, onNext }) { + + const [selected, setSelected] = React.useState(copy.properties); + const onSelect = (item, checked) => { + let s = [...selected]; + if (checked) { + s = [...s, item.property]; + } else { + s = s.filter(i => i === item.property); + } + setSelected(s); + }; + const onSelectAll = () => { + setSelected(sections.map(s => s.property)); + }; + const onUnselectAll = () => { + setSelected([]); + }; + + const { register, handleSubmit, control, formState, setValue, getValues } = useForm({ + mode: 'onChange', + reValidateMode: 'onBlur', + defaultValues: { + ...copy + }, + resolver: undefined, + context: undefined, + criteriaMode: "firstError", + shouldFocusError: true, + shouldUnregister: false, + }); + + const { errors, isValid } = formState; + + React.useEffect(() => { + setValue('properties', selected); + }, [selected, setValue]); + + return ( + <> +
+
+
    +
  • +

    + 1 + 1. Name and EntityId +

    +
  • +
  • + +
  • +
+
+
+
+
+
+
+
+ + + {errors?.target?.type === 'required' && + + Entity ID to copy is Required + + } +
+
+ + + {errors?.serviceProviderName?.type === 'required' && + Service Resolver Name is required + } +
+
+ + + {errors?.entityId && + + {errors.entityId.type === 'required' && + Entity ID is required + } + {errors.entityId.type === 'unique' && + Entity ID must be unique + } + + } +
+
+
+
+
+ + + + + + + + + {sections.map((item, i) => + + + + + )} + + + + + + + + + +
Sections to Copy?Yes
+ onSelect(item, checked)} + checked={selected.indexOf(item.property) > -1} + /> +
Check All Attributes + +
Clear All Attributes + +
+
+ +
+ + ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/copy/EntityTypeahead.js b/ui/src/app/metadata/copy/EntityTypeahead.js new file mode 100644 index 000000000..be74fd1b3 --- /dev/null +++ b/ui/src/app/metadata/copy/EntityTypeahead.js @@ -0,0 +1,28 @@ +import React from 'react'; +import { Typeahead } from 'react-bootstrap-typeahead'; +import { useController } from 'react-hook-form'; +import { useMetadataSources } from '../hooks/api'; + +export function EntityTypeahead ({control, name}) { + const { data = [] } = useMetadataSources({}, []); + const entities = React.useMemo(() => data.map(d => d.entityId), [data]); + + const { + field: { value, onChange, ...inputProps } + } = useController({ + name, + control, + rules: { required: true }, + defaultValue: "", + }); + + return ( + onChange(selected ? data.find(e => e.entityId === selected[0]) : '')} + defaultInputValue={value ? value.entityId : ''} + options={entities} + id="copySourceTypeahead" + /> + ) +} \ No newline at end of file diff --git a/ui/src/app/metadata/copy/SaveCopy.js b/ui/src/app/metadata/copy/SaveCopy.js new file mode 100644 index 000000000..0c48515e4 --- /dev/null +++ b/ui/src/app/metadata/copy/SaveCopy.js @@ -0,0 +1,120 @@ +import React from 'react'; +import Check from 'react-bootstrap/FormCheck'; +import Button from 'react-bootstrap/Button'; +import { faArrowCircleLeft, faCheck, faSave, faSpinner } from '@fortawesome/free-solid-svg-icons'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { useForm } from 'react-hook-form'; + +import { MetadataDefinitionContext, MetadataSchemaContext } from '../hoc/MetadataSchema'; +import { useMetadataConfiguration } from '../hooks/configuration'; +import { removeNull } from '../../core/utility/remove_null'; + +import { MetadataConfiguration } from '../component/MetadataConfiguration'; +import Translate from '../../i18n/components/translate'; + +import { InfoIcon } from '../../form/component/InfoIcon'; + + +export function useCopiedModel (copy) { + const { properties, target, serviceProviderName, entityId } = copy; + const copied = removeNull(properties.reduce((c, section) => ({ ...c, ...{ [section]: target[section] } }), {})); + const model = { + serviceProviderName, + entityId, + ...copied + }; + return model; +} + +export function useCopiedConfiguration(model, schema, definition) { + return useMetadataConfiguration([model], schema, definition); +} + +export function SaveCopy ({ copy, saving, onSave, onBack }) { + const definition = React.useContext(MetadataDefinitionContext); + const schema = React.useContext(MetadataSchemaContext); + + const model = useCopiedModel(copy); + const configuration = useCopiedConfiguration(model, schema, definition); + + const { register, handleSubmit } = useForm({ + mode: 'onChange', + reValidateMode: 'onBlur', + defaultValues: { + serviceEnabled: false + }, + resolver: undefined, + context: undefined, + criteriaMode: "firstError", + shouldFocusError: true, + shouldUnregister: false, + }); + + const onFinish = (data) => { + onSave({ + ...model, + ...data + }) + }; + + return ( + <> +
+
+
    +
  • + +
  • +
  • +

    + + + + Finished! +

    +
  • +
  • + +
  • +
+
+
+
+
+
+
+
+ + + +
+
+
+
+
+ + + + ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/domain/action/entity.action.ts b/ui/src/app/metadata/domain/action/entity.action.ts deleted file mode 100644 index c3f47e1ab..000000000 --- a/ui/src/app/metadata/domain/action/entity.action.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Action } from '@ngrx/store'; -import { MetadataEntity } from '../../domain/model'; - -export const PREVIEW_ENTITY = '[Domain] Preview Entity'; - -export class PreviewEntity implements Action { - readonly type = PREVIEW_ENTITY; - - constructor(public payload: { - id: string, - entity: MetadataEntity - }) { } -} - -export type Actions = - | PreviewEntity; diff --git a/ui/src/app/metadata/domain/attribute/CustomAttributeDefinition.js b/ui/src/app/metadata/domain/attribute/CustomAttributeDefinition.js new file mode 100644 index 000000000..d04cfab6e --- /dev/null +++ b/ui/src/app/metadata/domain/attribute/CustomAttributeDefinition.js @@ -0,0 +1,120 @@ +import { defaultsDeep } from "lodash"; + +export const CustomAttributeDefinition = { + label: 'Metadata Attribute', + type: '@MetadataAttribute', + steps: [], + schema: `/assets/schema/attribute/attribute.schema.json`, + + uiSchema: { + layout: { + groups: [ + { + size: 6, + classNames: '', + fields: [ + 'name', + 'attributeType', + 'helpText' + ] + }, + { + size: 6, + classNames: 'bg-light border rounded p-4', + fields: [ + 'defaultValue', + 'defaultValueBoolean', + 'defaultValueString', + 'customAttrListDefinitions' + ] + } + ] + }, + defaultValueBoolean: { + 'ui:widget': 'radio' + }, + customAttrListDefinitions: { + 'ui:field': 'StringListWithDefaultField', + 'ui:title': 'label.entity-attribute-list-options', + items: { + default: { + 'ui:widget': 'checkbox' + } + } + } + }, + + parser: (data) => { + if (!data) { + return data; + } + const { attributeType } = data; + let parsed = { ...data }; + if (attributeType === 'SELECTION_LIST') { + parsed = { + ...parsed, + defaultValue: data.customAttrListDefinitions.find(d => d.default)?.value, + customAttrListDefinitions: data.customAttrListDefinitions.map(d => d.value) + } + } + + if (attributeType === 'BOOLEAN') { + parsed = { + ...parsed, + defaultValue: data.defaultValueBoolean + } + } + + if (attributeType === 'STRING') { + parsed = { + ...parsed, + defaultValue: data.defaultValueString + } + } + + return parsed; + }, + + formatter: (changes) => { + if (!changes) { + return changes; + } + let formatted = { ...changes }; + const { attributeType } = changes; + + if (attributeType === 'SELECTION_LIST') { + formatted = { + ...formatted, + customAttrListDefinitions: formatted.customAttrListDefinitions.map(d => ({ + value: d, + default: d === changes.defaultValue + })) + } + } + + if (attributeType === 'BOOLEAN') { + formatted = { + ...formatted, + defaultValueBoolean: formatted.defaultValue === 'true' ? true : false + } + } + + if (attributeType === 'STRING') { + formatted = { + ...formatted, + defaultValueString: formatted.defaultValue + } + } + + return formatted; + } +} + +export const CustomAttributeEditor = { + ...CustomAttributeDefinition, + uiSchema: defaultsDeep({ + attributeType: { + 'ui:disabled': true + } + }, CustomAttributeDefinition.uiSchema) +}; \ No newline at end of file diff --git a/ui/src/app/metadata/domain/component/editor-nav.component.html b/ui/src/app/metadata/domain/component/editor-nav.component.html deleted file mode 100644 index 7307e79fb..000000000 --- a/ui/src/app/metadata/domain/component/editor-nav.component.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - -
- -
-
diff --git a/ui/src/app/metadata/domain/component/editor-nav.component.spec.ts b/ui/src/app/metadata/domain/component/editor-nav.component.spec.ts deleted file mode 100644 index 65e8f7865..000000000 --- a/ui/src/app/metadata/domain/component/editor-nav.component.spec.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; - -import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; - -import { SchemaFormModule, WidgetRegistry, DefaultWidgetRegistry } from 'ngx-schema-form'; -import * as fromWizard from '../../../wizard/reducer'; -import { EditorNavComponent, NAV_FORMATS } from './editor-nav.component'; -import { ValidFormIconComponent } from '../../../shared/component/valid-form-icon.component'; -import { WizardStep } from '../../../wizard/model'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(EditorNavComponent, {static: true}) - public componentUnderTest: EditorNavComponent; - - public format = NAV_FORMATS; -} - -describe('Editor Nav Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: EditorNavComponent; - let store: Store; - - let step: WizardStep = { - id: 'common', - label: 'Common Attributes', - index: 2, - initialValues: [] - }; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - RouterTestingModule, - SchemaFormModule.forRoot(), - StoreModule.forRoot({ - wizard: combineReducers(fromWizard.reducers) - }), - MockI18nModule - ], - declarations: [ - EditorNavComponent, - ValidFormIconComponent, - TestHostComponent - ], - providers: [ - { provide: WidgetRegistry, useClass: DefaultWidgetRegistry } - ] - }).compileComponents(); - - store = TestBed.get(Store); - spyOn(store, 'dispatch'); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should instantiate the component', waitForAsync(() => { - expect(app).toBeTruthy(); - })); - - describe('getFilterId', () => { - it('should return a string based on provided step', () => { - expect(app.getFilterId(step)).toEqual(step.id); - }); - - it('should return "Filter List" when step is null', () => { - expect(app.getFilterId(null)).toEqual('filters'); - }); - }); - - describe('getFilterLabel', () => { - it('should return a string based on provided step', () => { - expect(app.getFilterLabel(step)).toEqual(step.label); - }); - it('should return "Filter List" when step is null', () => { - expect(app.getFilterLabel(null)).toEqual('Filter List'); - }); - }); -}); diff --git a/ui/src/app/metadata/domain/component/editor-nav.component.ts b/ui/src/app/metadata/domain/component/editor-nav.component.ts deleted file mode 100644 index 7cf57ed1b..000000000 --- a/ui/src/app/metadata/domain/component/editor-nav.component.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { Component, Input, Output, EventEmitter } from '@angular/core'; -import { Store } from '@ngrx/store'; - -import { Observable } from 'rxjs'; -import { skipWhile, map } from 'rxjs/operators'; - -import { WizardStep } from '../../../wizard/model'; -import * as fromWizard from '../../../wizard/reducer'; - -export enum NAV_FORMATS { - DROPDOWN = 'NAV_DROPDOWN', - TABS = 'NAV_TABS' -} - -@Component({ - selector: 'editor-nav', - templateUrl: './editor-nav.component.html', - styleUrls: [] -}) - -export class EditorNavComponent { - @Input() format: string; - @Input() status: string[] = []; - @Input() path: string = 'edit'; - - @Output() onPageSelect: EventEmitter = new EventEmitter(); - - formats = NAV_FORMATS; - - currentPage$: Observable; - currentLabel$: Observable; - current$: Observable; - - index$: Observable; - routes$: Observable<{ path: string, label: string }[]>; - - getFilterId = p => p ? p.id : 'filters'; - getFilterLabel = p => p ? p.label : 'Filter List'; - - constructor( - private store: Store - ) { - this.index$ = this.store.select(fromWizard.getWizardIndex).pipe(skipWhile(i => !i)); - this.routes$ = this.store.select(fromWizard.getRoutes); - this.current$ = this.store.select(fromWizard.getCurrent); - this.currentPage$ = this.current$.pipe(map(this.getFilterId)); - this.currentLabel$ = this.current$.pipe(map(this.getFilterLabel)); - } -} - diff --git a/ui/src/app/metadata/domain/component/preview-dialog.component.html b/ui/src/app/metadata/domain/component/preview-dialog.component.html deleted file mode 100644 index 5a0571f94..000000000 --- a/ui/src/app/metadata/domain/component/preview-dialog.component.html +++ /dev/null @@ -1,16 +0,0 @@ - - - \ No newline at end of file diff --git a/ui/src/app/metadata/domain/component/preview-dialog.component.spec.ts b/ui/src/app/metadata/domain/component/preview-dialog.component.spec.ts deleted file mode 100644 index 819d93c7b..000000000 --- a/ui/src/app/metadata/domain/component/preview-dialog.component.spec.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { ViewChild, Component } from '@angular/core'; -import { Observable, of } from 'rxjs'; -import { PreviewDialogComponent } from './preview-dialog.component'; -import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; -import { NgbActiveModalStub } from '../../../../testing/modal.stub'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; - -@Component({ - template: `` -}) -class TestHostComponent { - @ViewChild(PreviewDialogComponent, {static: true}) - public formUnderTest: PreviewDialogComponent; -} - - -describe('Advanced Info Form Component', () => { - let fixture: ComponentFixture; - let instance: TestHostComponent; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - { provide: NgbActiveModal, useClass: NgbActiveModalStub } - ], - imports: [ - NoopAnimationsModule, - ReactiveFormsModule, - MockI18nModule - ], - declarations: [ - PreviewDialogComponent, - TestHostComponent - ], - }); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should compile', () => { - expect(fixture).toBeDefined(); - }); -}); diff --git a/ui/src/app/metadata/domain/component/preview-dialog.component.ts b/ui/src/app/metadata/domain/component/preview-dialog.component.ts deleted file mode 100644 index 9d08d4ea7..000000000 --- a/ui/src/app/metadata/domain/component/preview-dialog.component.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Component, Input } from '@angular/core'; -import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; -import * as FileSaver from 'file-saver'; -import { Subscription } from 'rxjs'; -import { MetadataEntity } from '../../domain/model'; - -@Component({ - selector: 'preview-dialog', - templateUrl: './preview-dialog.component.html' -}) -export class PreviewDialogComponent { - @Input() entity: MetadataEntity; - @Input() xml: string; - - sub: Subscription; - - constructor( - public activeModal: NgbActiveModal - ) {} - - preview(xml): void { - const blob = new Blob([xml], { type: 'text/xml;charset=utf-8' }); - FileSaver.saveAs(blob, `${ this.entity.name }.xml`); - } -} diff --git a/ui/src/app/metadata/domain/component/summary-property.component.html b/ui/src/app/metadata/domain/component/summary-property.component.html deleted file mode 100644 index d1f76106c..000000000 --- a/ui/src/app/metadata/domain/component/summary-property.component.html +++ /dev/null @@ -1,88 +0,0 @@ -
- - - - {{ property.name }} - {{ (property.value || !property.value) ? property.value : '-' }} - - - - - {{ property.name }} - - -

- - - - - - - - - - - -
- -
- {{ value[prop] }} -
-
- - -

-
    -
  • - {{ item }} -
  • -
-
- -

-
    -
  • - {{ item }} -
  • -
-
- - - - - - - - - - - - - - - - -
NameTrueFalse
{{ attr.label }} - - - -
-
-
-
- - - {{ property.name }} - - - - - -
-
diff --git a/ui/src/app/metadata/domain/component/summary-property.component.spec.ts b/ui/src/app/metadata/domain/component/summary-property.component.spec.ts deleted file mode 100644 index 307faa61b..000000000 --- a/ui/src/app/metadata/domain/component/summary-property.component.spec.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; - -import { NgbDropdownModule, NgbPopoverModule } from '@ng-bootstrap/ng-bootstrap'; - -import { SummaryPropertyComponent } from './summary-property.component'; -import { SchemaFormModule, WidgetRegistry, DefaultWidgetRegistry } from 'ngx-schema-form'; -import { Property } from '../model/property'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { AttributesService } from '../service/attributes.service'; -import { of } from 'rxjs'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(SummaryPropertyComponent, {static: true}) - public componentUnderTest: SummaryPropertyComponent; - - private _property; - - get property(): Property { - return this._property; - } - - set property(prop: Property) { - this._property = prop; - } -} - -describe('Summary Property Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: SummaryPropertyComponent; - let service: AttributesService; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - NgbPopoverModule, - RouterTestingModule, - SchemaFormModule.forRoot(), - MockI18nModule - ], - declarations: [ - SummaryPropertyComponent, - TestHostComponent - ], - providers: [ - { provide: WidgetRegistry, useClass: DefaultWidgetRegistry }, - { provide: AttributesService, useValue: { - query: (path: string) => of([]) - } } - ] - }).compileComponents(); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - service = TestBed.get(AttributesService); - fixture.detectChanges(); - })); - - it('should instantiate the component', waitForAsync(() => { - expect(app).toBeTruthy(); - })); - - describe('attribute list getter', () => { - it('should return the data from the property schema', waitForAsync(() => { - let list = [{ key: 'foo', label: 'foo' }]; - app.property = { - type: 'array', - name: 'foo', - value: ['foo', 'bar'], - items: null, - properties: null, - widget: { - id: 'foo', - data: list - } - }; - - app.attributeList$.subscribe(l => { - expect(l).toEqual(list); - }); - })); - - it('should return fetch data from the supplied path', waitForAsync(() => { - let list = [{key: 'foo', label: 'foo'}]; - spyOn(service, 'query').and.returnValue(of(list)); - app.property = { - type: 'array', - name: 'foo', - value: ['foo', 'bar'], - items: null, - properties: null, - widget: { - id: 'foo', - dataUrl: 'foo' - } - }; - - app.attributeList$.subscribe(l => { - expect(l).toEqual(list); - }); - })); - - it('should return an empty array if no data is found', waitForAsync(() => { - let list = []; - spyOn(service, 'query').and.returnValue(of(list)); - app.property = { - type: 'array', - name: 'foo', - value: ['foo', 'bar'], - items: null, - properties: null - }; - - app.attributeList$.subscribe(l => { - expect(l).toEqual(list); - }); - })); - }); -}); diff --git a/ui/src/app/metadata/domain/component/summary-property.component.ts b/ui/src/app/metadata/domain/component/summary-property.component.ts deleted file mode 100644 index 6b8b408a8..000000000 --- a/ui/src/app/metadata/domain/component/summary-property.component.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { Component, Input } from '@angular/core'; -import { Property } from '../model/property'; -import { Observable, of } from 'rxjs'; -import { AttributesService } from '../service/attributes.service'; - -@Component({ - selector: 'summary-property', - templateUrl: './summary-property.component.html', - styleUrls: [] -}) - -export class SummaryPropertyComponent { - @Input() property: Property; - - constructor( - private attrService: AttributesService - ) {} - - getKeys(schema): string[] { - return Object.keys(schema.properties); - } - - getItemType(items: Property): string { - return items.widget ? items.widget.id : 'default'; - } - - get attributeList$(): Observable<{key: string, label: string}[]> { - if (this.property.widget && this.property.widget.hasOwnProperty('data')) { - return of(this.property.widget.data); - } - if (this.property.widget && this.property.widget.hasOwnProperty('dataUrl')) { - return this.attrService.query(this.property.widget.dataUrl); - } - return of([]); - } -} - diff --git a/ui/src/app/metadata/domain/component/unsaved-entity.dialog.html b/ui/src/app/metadata/domain/component/unsaved-entity.dialog.html deleted file mode 100644 index a00c04202..000000000 --- a/ui/src/app/metadata/domain/component/unsaved-entity.dialog.html +++ /dev/null @@ -1,32 +0,0 @@ - -
- - - -
-
\ No newline at end of file diff --git a/ui/src/app/metadata/domain/component/unsaved-entity.dialog.spec.ts b/ui/src/app/metadata/domain/component/unsaved-entity.dialog.spec.ts deleted file mode 100644 index 1a771f05c..000000000 --- a/ui/src/app/metadata/domain/component/unsaved-entity.dialog.spec.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; -import { UnsavedEntityComponent } from './unsaved-entity.dialog'; -import { NgbActiveModalStub } from '../../../../testing/modal.stub'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(UnsavedEntityComponent, {static: true}) - public componentUnderTest: UnsavedEntityComponent; -} - -describe('Unsaved Provider Dialog Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let cmp: UnsavedEntityComponent; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - MockI18nModule - ], - declarations: [ - UnsavedEntityComponent, - TestHostComponent - ], - providers: [ - { provide: NgbActiveModal, useClass: NgbActiveModalStub } - ] - }).compileComponents(); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - cmp = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should instantiate the component', waitForAsync(() => { - expect(cmp).toBeTruthy(); - })); -}); diff --git a/ui/src/app/metadata/domain/component/unsaved-entity.dialog.ts b/ui/src/app/metadata/domain/component/unsaved-entity.dialog.ts deleted file mode 100644 index 0df8d8715..000000000 --- a/ui/src/app/metadata/domain/component/unsaved-entity.dialog.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Component, Input } from '@angular/core'; - -import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; -import { Subject } from 'rxjs'; - -@Component({ - selector: 'unsaved-entity', - templateUrl: './unsaved-entity.dialog.html' -}) -export class UnsavedEntityComponent { - readonly subject: Subject = new Subject(); - - @Input() message; - - constructor( - public activeModal: NgbActiveModal - ) { } - - close(): void { - this.activeModal.close(); - } - - dismiss(): void { - this.activeModal.dismiss(); - } -} diff --git a/ui/src/app/metadata/domain/data.js b/ui/src/app/metadata/domain/data.js new file mode 100644 index 000000000..45412d300 --- /dev/null +++ b/ui/src/app/metadata/domain/data.js @@ -0,0 +1,12 @@ +export const DurationOptions = [ + "PT0S", + "PT30S", + "PT1M", + "PT10M", + "PT30M", + "PT1H", + "PT4H", + "PT8H", + "PT12H", + "PT24H" +]; \ No newline at end of file diff --git a/ui/src/app/metadata/domain/domain.module.ts b/ui/src/app/metadata/domain/domain.module.ts deleted file mode 100644 index c3679435e..000000000 --- a/ui/src/app/metadata/domain/domain.module.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { NgModule, ModuleWithProviders } from '@angular/core'; -import { EffectsModule } from '@ngrx/effects'; -import { CommonModule } from '@angular/common'; -import { NgbPopoverModule, NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; - -import { ResolverService } from './service/resolver.service'; -import { ListValuesService } from './service/list-values.service'; -import { ProviderStatusEmitter, ProviderValueEmitter } from './service/provider-change-emitter.service'; -import { EntityIdService } from './service/entity-id.service'; -import { EntityDraftService } from './service/draft.service'; - -import { MetadataProviderService } from './service/provider.service'; -import { EntityEffects } from './effect/entity.effect'; -import { PreviewDialogComponent } from './component/preview-dialog.component'; -import { MetadataFilterService } from './service/filter.service'; -import { AttributesService } from './service/attributes.service'; -import { I18nModule } from '../../i18n/i18n.module'; -import { SummaryPropertyComponent } from './component/summary-property.component'; - -import { UnsavedEntityComponent } from './component/unsaved-entity.dialog'; -import { EditorNavComponent } from './component/editor-nav.component'; -import { RouterModule } from '@angular/router'; -import { SharedModule } from '../../shared/shared.module'; - -export const COMPONENTS = [ - PreviewDialogComponent, - UnsavedEntityComponent, - SummaryPropertyComponent, - EditorNavComponent -]; - -export const DECLARATIONS = [ - ...COMPONENTS -]; - -@NgModule({ - declarations: DECLARATIONS, - entryComponents: COMPONENTS, - imports: [ - CommonModule, - I18nModule, - NgbPopoverModule, - RouterModule, - NgbDropdownModule, - SharedModule - ], - exports: DECLARATIONS, - providers: [] -}) -export class DomainModule { - static forRoot(): ModuleWithProviders { - return { - ngModule: RootDomainModule, - providers: [ - ResolverService, - EntityIdService, - EntityDraftService, - ListValuesService, - ProviderStatusEmitter, - ProviderValueEmitter, - MetadataProviderService, - MetadataFilterService, - AttributesService - ] - }; - } -} - -@NgModule({ - imports: [ - DomainModule, - EffectsModule.forFeature([ - EntityEffects - ]) - ], -}) -export class RootDomainModule { } diff --git a/ui/src/app/metadata/domain/domain.type.ts b/ui/src/app/metadata/domain/domain.type.ts deleted file mode 100644 index e62766ed8..000000000 --- a/ui/src/app/metadata/domain/domain.type.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { - MetadataProvider, - MetadataResolver, - MetadataFilter -} from './model'; - -import { - EntityAttributesFilterEntity, - FileBackedHttpMetadataResolver -} from './entity'; -import { - FileBackedHttpMetadataProvider -} from './model/providers'; - -export type Filter = - | EntityAttributesFilterEntity; - -export type Resolver = - | FileBackedHttpMetadataResolver; - -export type Provider = - | FileBackedHttpMetadataProvider; - -export type Entity = - | Filter - | Resolver - | Provider; - -export type Metadata = - | MetadataProvider - | MetadataResolver - | MetadataFilter; - -export enum MetadataTypes { - FILTER = '[Type] Metadata Filter', - PROVIDER = '[Type] Metadata Provider', - RESOLVER = '[Type] Metadata Resolver' -} diff --git a/ui/src/app/metadata/domain/domain.util.spec.ts b/ui/src/app/metadata/domain/domain.util.spec.ts deleted file mode 100644 index d8b749098..000000000 --- a/ui/src/app/metadata/domain/domain.util.spec.ts +++ /dev/null @@ -1,56 +0,0 @@ -import * as util from './domain.util'; -import { MetadataProvider } from './model'; - -describe('Domain Utility methods', () => { - - describe('combineAllFn', () => { - it('should return true when the selected id is found', () => { - expect(util.combineAllFn(['foo'], ['bar'])).toEqual(['bar', 'foo']); - }); - }); - - describe('doesExistFn', () => { - it('should return true when the selected id is found', () => { - expect(util.doesExistFn(['foo', 'bar'], 'foo')).toBe(true); - }); - it('should return false when the selected id is not found', () => { - expect(util.doesExistFn(['foo'], 'bar')).toBe(false); - }); - }); - - describe('getInCollectionFn', () => { - const entities = { foo: {}, bar: {} }; - it('should return the entity with the given id', () => { - expect(util.getInCollectionFn(entities, 'foo')).toBe(entities.foo); - }); - it('should return null when provided a null id', () => { - expect(util.getInCollectionFn(entities, null)).toBeNull(); - }); - }); - - describe('getEntityIdsFn', () => { - const entities = [{ entityId: 'foo' }, { entityId: 'bar' }]; - it('should return a list of ids', () => { - expect(util.getEntityIdsFn(entities)).toEqual(['foo', 'bar']); - }); - }); - - describe('mergeProviderOrderFn', () => { - const providers = [ - { id: 'foo', name: 'foo', '@type': 'foo', enabled: true, xmlId: 'id', sortKey: 1, metadataFilters: [] }, - { id: 'bar', name: 'bar', '@type': 'bar', enabled: false, xmlId: 'id2', sortKey: 2, metadataFilters: [] }, - { id: 'baz', name: 'baz', '@type': 'baz', enabled: false, xmlId: 'id3', sortKey: 3, metadataFilters: [] } - ]; - it('1 should sort the list accordingly', () => { - let order = ['bar', 'foo', 'baz'], - ordered = util.mergeOrderFn([...providers], order); - expect(ordered.indexOf(providers[0])).toBe(1); - }); - - it('2 should sort the list accordingly', () => { - let order = ['foo', 'bar', 'baz'], - ordered = util.mergeOrderFn(providers, order); - expect(ordered.indexOf(providers[0])).toBe(0); - }); - }); -}); diff --git a/ui/src/app/metadata/domain/domain.util.ts b/ui/src/app/metadata/domain/domain.util.ts deleted file mode 100644 index 2aeeac247..000000000 --- a/ui/src/app/metadata/domain/domain.util.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Metadata } from './domain.type'; - -/* - * Utility functions -*/ - -export const combineAllFn = (d, p) => [...p, ...d]; -export const doesExistFn = (ids, selected) => ids.indexOf(selected) > -1; -export const getInCollectionFn = (entities, selectedId) => { - return selectedId && entities[selectedId]; -}; -export const getEntityIdsFn = list => list.map(entity => entity.entityId); - -export const getId = (entity: Metadata): string => { - return entity.resourceId ? entity.resourceId : entity.id; -}; - -export const mergeOrderFn = (entities: Metadata[], order: string[]): Metadata[] => { - const ordered = [...entities.sort( - (a: Metadata, b: Metadata) => { - const aIndex = order.indexOf(getId(a)); - const bIndex = order.indexOf(getId(b)); - return aIndex > bIndex ? 1 : bIndex > aIndex ? -1 : 0; - } - )]; - return ordered; -}; diff --git a/ui/src/app/metadata/domain/effect/entity.effect.spec.ts b/ui/src/app/metadata/domain/effect/entity.effect.spec.ts deleted file mode 100644 index 1a8c18a0d..000000000 --- a/ui/src/app/metadata/domain/effect/entity.effect.spec.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { TestBed, tick, fakeAsync } from '@angular/core/testing'; -import { Actions } from '@ngrx/effects'; -import { of } from 'rxjs'; - -import { TestActions, getActions } from '../../../../testing/effect.util'; -import { EntityEffects } from './entity.effect'; -import { EntityIdService } from '../service/entity-id.service'; -import { ResolverService } from '../service/resolver.service'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { NgbModalStub } from '../../../../testing/modal.stub'; -import { EntityAttributesFilterEntity, FileBackedHttpMetadataResolver } from '../entity'; - -import * as fromRoot from '../../../app.reducer'; -import { StoreModule } from '@ngrx/store'; - -describe('Entity Effects', () => { - let effects: EntityEffects; - let providerService: any; - let idService: any; - let modal: any; - let actions$: TestActions; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - EntityEffects, - { - provide: NgbModal, - useClass: NgbModalStub - }, - { - provide: ResolverService, - useValue: { preview: () => {} }, - }, - { - provide: EntityIdService, - useValue: { preview: () => { } }, - }, - { provide: Actions, useFactory: getActions } - ], - imports: [ - StoreModule.forRoot(fromRoot.reducers) - ] - }); - - effects = TestBed.get(EntityEffects); - providerService = TestBed.get(ResolverService); - idService = TestBed.get(EntityIdService); - modal = TestBed.get(NgbModal); - actions$ = TestBed.get(Actions); - }); - - describe('openModal', () => { - it('should open a modal window for a filter', fakeAsync(() => { - spyOn(modal, 'open').and.returnValue({componentInstance: {}}); - spyOn(idService, 'preview').and.returnValue(of('')); - effects.openModal({ id: 'foo', entity: new EntityAttributesFilterEntity()}); - expect(idService.preview).toHaveBeenCalled(); - tick(10); - expect(modal.open).toHaveBeenCalled(); - })); - - it('should open a modal window for a provider', fakeAsync(() => { - spyOn(modal, 'open').and.returnValue({ componentInstance: {} }); - spyOn(providerService, 'preview').and.returnValue(of('')); - effects.openModal({id: 'foo', entity: new FileBackedHttpMetadataResolver()}); - expect(providerService.preview).toHaveBeenCalled(); - tick(10); - expect(modal.open).toHaveBeenCalled(); - })); - }); -}); diff --git a/ui/src/app/metadata/domain/effect/entity.effect.ts b/ui/src/app/metadata/domain/effect/entity.effect.ts deleted file mode 100644 index ec722591f..000000000 --- a/ui/src/app/metadata/domain/effect/entity.effect.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { Store } from '@ngrx/store'; - -import { Observable } from 'rxjs'; -import { map, tap } from 'rxjs/operators'; - -import { ResolverService } from '../service/resolver.service'; -import { PreviewDialogComponent } from '../component/preview-dialog.component'; -import { MetadataEntity } from '../model'; -import { MetadataTypes } from '../domain.type'; -import { EntityIdService } from '../service/entity-id.service'; -import * as entityActions from '../action/entity.action'; - -import * as fromRoot from '../../../app.reducer'; - -import { AddNotification } from '../../../notification/action/notification.action'; -import { Notification, NotificationType } from '../../../notification/model/notification'; - -@Injectable() -export class EntityEffects { - - @Effect({ dispatch: false }) - previewEntityXml$ = this.actions$.pipe( - ofType(entityActions.PREVIEW_ENTITY), - map(action => action.payload), - tap(prev => this.openModal(prev)) - ); - - constructor( - private actions$: Actions, - private modalService: NgbModal, - private providerService: ResolverService, - private entityService: EntityIdService, - private store: Store - ) { } - - openModal(prev: { id: string, entity: MetadataEntity }): void { - let { id, entity } = prev, - request: Observable = entity.kind === MetadataTypes.FILTER ? - this.entityService.preview(id) : this.providerService.preview(id); - request.subscribe( - xml => { - let modal = this.modalService.open(PreviewDialogComponent, { - size: 'lg', - windowClass: 'modal-xl' - }); - modal.componentInstance.entity = entity; - modal.componentInstance.xml = xml; - }, - err => { - this.store.dispatch(new AddNotification(new Notification( - NotificationType.Danger, - `Unable to preview entity.`, - 8000 - ))); - } - ); - } -} /* istanbul ignore next */ diff --git a/ui/src/app/metadata/domain/entity/filter/entity-attributes-filter.spec.ts b/ui/src/app/metadata/domain/entity/filter/entity-attributes-filter.spec.ts deleted file mode 100644 index bb544cf0d..000000000 --- a/ui/src/app/metadata/domain/entity/filter/entity-attributes-filter.spec.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { EntityAttributesFilterEntity } from './entity-attributes-filter'; - -describe('EntityAttributesFilter Entity', () => { - let entity: EntityAttributesFilterEntity; - beforeEach(() => { - entity = new EntityAttributesFilterEntity({ - resourceId: 'foo', - filterEnabled: false - }); - }); - - it('should be an instance', () => { - expect(entity).toBeDefined(); - expect(entity.resourceId).toBe('foo'); - expect(entity.enabled).toBe(entity.filterEnabled); - expect(entity.id).toBe(entity.resourceId); - expect(entity.getId()).toBe(entity.resourceId); - expect(entity.getDisplayId()).toBe(entity.resourceId); - expect(entity.isDraft()).toBe(false); - }); -}); diff --git a/ui/src/app/metadata/domain/entity/filter/entity-attributes-filter.ts b/ui/src/app/metadata/domain/entity/filter/entity-attributes-filter.ts deleted file mode 100644 index f536a5b38..000000000 --- a/ui/src/app/metadata/domain/entity/filter/entity-attributes-filter.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { MetadataFilter, MetadataEntity, RelyingPartyOverrides } from '../../model'; -import { MetadataTypes } from '../../domain.type'; -import { FilterTarget } from '../../model'; - -export class EntityAttributesFilterEntity implements MetadataFilter, MetadataEntity { - createdDate?: string; - modifiedDate?: string; - version: string; - resourceId: string; - createdBy: string; - - name = ''; - filterEnabled = false; - audId: string; - type: string; - - relyingPartyOverrides = { - nameIdFormats: [] as string[], - authenticationMethods: [] as string[] - } as RelyingPartyOverrides; - - attributeRelease = [] as string[]; - - entityAttributesFilterTarget: FilterTarget = { - type: 'ENTITY', - value: [''] - }; - - constructor(obj?: Partial) { - Object.assign(this, { ...obj }); - } - - getId(): string { - return this.resourceId; - } - - getDisplayId(): string { - return this.resourceId; - } - - isDraft(): boolean { - return false; - } - - getCreationDate(): Date { - return new Date(this.createdDate); - } - - get id(): string { - return this.resourceId; - } - - set id(id: string) { - this.resourceId = id; - } - - get enabled(): boolean { - return this.filterEnabled; - } - - get kind(): string { - return MetadataTypes.FILTER; - } - - get entityId(): string { - return this.entityAttributesFilterTarget.value[0]; - } - - set entityId(val: string) { - this.entityAttributesFilterTarget.value[0] = val; - } - - serialize(): any { - return { - attributeRelease: this.attributeRelease, - relyingPartyOverrides: this.relyingPartyOverrides, - entityAttributesFilterTarget: this.entityAttributesFilterTarget, - filterEnabled: this.filterEnabled, - name: this.name, - '@type': 'EntityAttributes' - }; - } -} diff --git a/ui/src/app/metadata/domain/entity/filter/nameid-format-filter.spec.ts b/ui/src/app/metadata/domain/entity/filter/nameid-format-filter.spec.ts deleted file mode 100644 index ba39ffbe2..000000000 --- a/ui/src/app/metadata/domain/entity/filter/nameid-format-filter.spec.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { NameIDFormatFilterEntity } from './nameid-format-filter'; - -describe('NameIDFormatFilterEntity Entity', () => { - let entity: NameIDFormatFilterEntity; - beforeEach(() => { - entity = new NameIDFormatFilterEntity({ - resourceId: 'foo', - filterEnabled: false - }); - }); - - it('should be an instance', () => { - expect(entity).toBeDefined(); - expect(entity.resourceId).toBe('foo'); - expect(entity.enabled).toBe(entity.filterEnabled); - expect(entity.id).toBe(entity.resourceId); - expect(entity.getId()).toBe(entity.resourceId); - expect(entity.getDisplayId()).toBe(entity.resourceId); - expect(entity.isDraft()).toBe(false); - }); -}); diff --git a/ui/src/app/metadata/domain/entity/filter/nameid-format-filter.ts b/ui/src/app/metadata/domain/entity/filter/nameid-format-filter.ts deleted file mode 100644 index 3d745f725..000000000 --- a/ui/src/app/metadata/domain/entity/filter/nameid-format-filter.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { MetadataFilter, MetadataEntity } from '../../model'; -import { MetadataTypes } from '../../domain.type'; -import { FilterTarget } from '../../model'; - -export class NameIDFormatFilterEntity implements MetadataFilter, MetadataEntity { - createdDate?: string; - modifiedDate?: string; - version: string; - resourceId: string; - createdBy: string; - - name = ''; - filterEnabled = false; - audId: string; - type: string; - - nameIdFormatFilterTarget: FilterTarget = { - type: 'ENTITY', - value: [''] - }; - - constructor(obj?: Partial) { - Object.assign(this, { ...obj }); - } - - getId(): string { - return this.resourceId; - } - - getDisplayId(): string { - return this.resourceId; - } - - isDraft(): boolean { - return false; - } - - getCreationDate(): Date { - return new Date(this.createdDate); - } - - get id(): string { - return this.resourceId; - } - - set id(id: string) { - this.resourceId = id; - } - - get enabled(): boolean { - return this.filterEnabled; - } - - get kind(): string { - return MetadataTypes.FILTER; - } - - serialize(): any { - return { - nameIdFormatFilterTarget: this.nameIdFormatFilterTarget, - filterEnabled: this.filterEnabled, - name: this.name, - '@type': 'EntityAttributes' - }; - } -} diff --git a/ui/src/app/metadata/domain/entity/index.ts b/ui/src/app/metadata/domain/entity/index.ts deleted file mode 100644 index 648255369..000000000 --- a/ui/src/app/metadata/domain/entity/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './filter/entity-attributes-filter'; -export * from './resolver/file-backed-http-metadata-resolver'; diff --git a/ui/src/app/metadata/domain/entity/resolver/file-backed-http-metadata-resolver.spec.ts b/ui/src/app/metadata/domain/entity/resolver/file-backed-http-metadata-resolver.spec.ts deleted file mode 100644 index 627a22571..000000000 --- a/ui/src/app/metadata/domain/entity/resolver/file-backed-http-metadata-resolver.spec.ts +++ /dev/null @@ -1,134 +0,0 @@ -import { FileBackedHttpMetadataResolver } from './file-backed-http-metadata-resolver'; -import { MetadataResolver } from '../../model'; - -describe('Resolver construct', () => { - - const config = { - id: 'foo', - entityId: 'string', - serviceProviderName: 'string', - organization: { - 'name': 'string', - 'displayName': 'string', - 'url': 'string' - }, - contacts: [ - { - 'name': 'string', - 'type': 'string', - 'emailAddress': 'string' - } - ], - mdui: { - 'displayName': 'string', - 'informationUrl': 'string', - 'privacyStatementUrl': 'string', - 'logoUrl': 'string', - 'logoHeight': 100, - 'logoWidth': 100, - 'description': 'string' - }, - securityInfo: { - 'x509CertificateAvailable': true, - 'authenticationRequestsSigned': true, - 'wantAssertionsSigned': true, - 'x509Certificates': [ - { - 'name': 'string', - 'type': 'string', - 'value': 'string' - } - ] - }, - assertionConsumerServices: [ - { - 'binding': 'string', - 'locationUrl': 'string', - 'makeDefault': true - } - ], - serviceProviderSsoDescriptor: { - 'protocolSupportEnum': 'string', - 'nameIdFormats': [ - 'string' - ] - }, - - logoutEndpoints: [ - { - 'url': 'string', - 'bindingType': 'string' - } - ], - serviceEnabled: true, - createdDate: 'December 17, 1995 03:24:00', - modifiedDate: 'December 17, 1995 03:24:00', - relyingPartyOverrides: { - 'signAssertion': true, - 'dontSignResponse': true, - 'turnOffEncryption': true, - 'useSha': true, - 'ignoreAuthenticationMethod': true, - 'omitNotBefore': true, - 'responderId': 'string', - 'nameIdFormats': [ - 'string' - ], - 'authenticationMethods': [ - 'string' - ] - }, - attributeRelease: [ - 'eduPersonPrincipalName', - 'uid', - 'mail' - ] - }; - - it('should populate its own values', () => { - const entity = new FileBackedHttpMetadataResolver(config); - Object.keys(config).forEach(key => { - expect(entity[key]).toEqual(config[key]); - }); - }); - - describe('isDraft method', () => { - it('should return false if no createDate defined', () => { - const entity = new FileBackedHttpMetadataResolver(config); - expect(entity.isDraft()).toBe(false); - }); - - it('should return false if no createDate defined', () => { - const { createdDate, ...rest } = config; - const entity = new FileBackedHttpMetadataResolver(rest as MetadataResolver); - expect(entity.isDraft()).toBe(true); - }); - }); - - describe('getCreationDate method', () => { - it('should return false if no createDate defined', () => { - const entity = new FileBackedHttpMetadataResolver(config); - expect(entity.getCreationDate()).toBeDefined(); - }); - - it('should return false if no createDate defined', () => { - const { createdDate, ...rest } = config; - const entity = new FileBackedHttpMetadataResolver(rest as MetadataResolver); - expect(entity.getCreationDate()).toBeNull(); - }); - }); - - describe('enabled getter', () => { - it('should return the serviceEnabled attribute', () => { - const entity = new FileBackedHttpMetadataResolver(config); - expect(entity.enabled).toBe(config.serviceEnabled); - }); - }); - - describe('serialize method', () => { - it('should return itself', () => { - const entity = new FileBackedHttpMetadataResolver(config); - expect(entity.serialize()).toBe(entity); - }); - }); -}); diff --git a/ui/src/app/metadata/domain/entity/resolver/file-backed-http-metadata-resolver.ts b/ui/src/app/metadata/domain/entity/resolver/file-backed-http-metadata-resolver.ts deleted file mode 100644 index 81a2a2ca7..000000000 --- a/ui/src/app/metadata/domain/entity/resolver/file-backed-http-metadata-resolver.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { - Organization, - Contact, - MDUI, - LogoutEndpoint, - SecurityInfo, - Certificate, - SsoService, - IdpSsoDescriptor, - RelyingPartyOverrides, - MetadataResolver -} from '../../model'; -import { MetadataTypes } from '../../domain.type'; -import { MetadataEntity } from '../../model/metadata-entity'; - -export class FileBackedHttpMetadataResolver implements MetadataResolver, MetadataEntity { - id = ''; - createdDate?: string; - modifiedDate?: string; - version: string; - createdBy: string; - - entityId = ''; - serviceProviderName = ''; - organization = {} as Organization; - contacts = [] as Contact[]; - mdui = {} as MDUI; - - securityInfo = { - x509CertificateAvailable: false, - authenticationRequestsSigned: false, - wantAssertionsSigned: false, - x509Certificates: [] as Certificate[] - } as SecurityInfo; - - assertionConsumerServices = [] as SsoService[]; - serviceProviderSsoDescriptor = { - nameIdFormats: [] - } as IdpSsoDescriptor; - - logoutEndpoints: LogoutEndpoint[] = []; - - serviceEnabled = false; - - relyingPartyOverrides = { - nameIdFormats: [] as string[], - authenticationMethods: [] as string[] - } as RelyingPartyOverrides; - - attributeRelease = [] as string[]; - - [property: string]: unknown; - - constructor(descriptor?: Partial) { - Object.assign(this, descriptor); - } - - getId(): string { - return this.id; - } - - getDisplayId(): string { - return this.entityId; - } - - isDraft(): boolean { - return this.createdDate ? false : true; - } - - getCreationDate(): Date { - return this.createdDate ? new Date(this.createdDate) : null; - } - - get name(): string { - return this.serviceProviderName; - } - - get enabled(): boolean { - return this.serviceEnabled; - } - - get kind(): string { - return MetadataTypes.RESOLVER; - } - - serialize(): any { - return this; - } -} diff --git a/ui/src/app/metadata/domain/filter/BaseFilterDefinition.js b/ui/src/app/metadata/domain/filter/BaseFilterDefinition.js new file mode 100644 index 000000000..16d2cf7fc --- /dev/null +++ b/ui/src/app/metadata/domain/filter/BaseFilterDefinition.js @@ -0,0 +1,13 @@ +export const BaseFilterDefinition = { + parser: (changes) => changes, + formatter: (changes) => changes, + display: (changes) => changes, + uiSchema: { + '@type': { + 'ui:widget': 'hidden' + }, + 'resourceId': { + 'ui:widget': 'hidden' + } + } +}; diff --git a/ui/src/app/metadata/domain/filter/EntityAttributesFilterDefinition.js b/ui/src/app/metadata/domain/filter/EntityAttributesFilterDefinition.js new file mode 100644 index 000000000..727df9f8f --- /dev/null +++ b/ui/src/app/metadata/domain/filter/EntityAttributesFilterDefinition.js @@ -0,0 +1,118 @@ +import API_BASE_PATH from "../../../App.constant"; +import {BaseFilterDefinition} from './BaseFilterDefinition'; +import {removeNull} from '../../../core/utility/remove_null'; +import { isValidRegex } from '../../../core/utility/is_valid_regex'; +import defaultsDeep from "lodash/defaultsDeep"; + +export const EntityAttributesFilterWizard = { + ...BaseFilterDefinition, + label: 'EntityAttributes', + type: 'EntityAttributes', + schema: `${API_BASE_PATH}/ui/EntityAttributesFilters`, + uiSchema: defaultsDeep({ + entityAttributesFilterTarget: { + 'ui:field': 'FilterTargetField', + api: '' + }, + attributeRelease: { + 'ui:widget': 'AttributeReleaseWidget' + }, + relyingPartyOverrides: { + nameIdFormats: { + "ui:options": { + orderable: false + }, + items: { + 'ui:widget': 'OptionWidget' + } + }, + authenticationMethods: { + "ui:options": { + orderable: false + }, + items: { + 'ui:widget': 'OptionWidget' + } + } + } + }, BaseFilterDefinition.uiSchema), + validator: (data = [], current = { resourceId: null }) => { + + const filters = current ? data.filter(s => s.resourceId !== current.resourceId) : data; + const names = filters.map(s => s.name); + + return (formData, errors) => { + if (names.indexOf(formData.name) > -1) { + errors.name.addError('message.name-unique'); + } + + if (formData?.entityAttributesFilterTarget?.entityAttributesFilterTargetType === 'REGEX') { + const { entityAttributesFilterTarget: {value} } = formData; + const isValid = isValidRegex(value[0]); + if (!isValid) { + errors.entityAttributesFilterTarget.value.addError('message.invalid-regex-pattern'); + } + } + return errors; + } + }, + warnings: (data) => { + let warnings = {}; + if (!data?.relyingPartyOverrides?.signAssertion && data?.relyingPartyOverrides?.dontSignResponse) { + warnings = { + ...warnings, + 'options': [ + ...(warnings.hasOwnProperty('options') ? warnings['options'] : []), + 'message.invalid-signing' + ] + }; + } + return warnings; + }, + parser: (changes) => { + return { + ...changes, + relyingPartyOverrides: removeNull(changes) + }; + }, + formatter: (changes) => ({ + ...changes, + '@type': EntityAttributesFilterWizard.type + }) +}; + + +export const EntityAttributesFilterEditor= { + ...EntityAttributesFilterWizard, + steps: [ + { + id: 'common', + label: 'label.target', + index: 1, + fields: [ + 'name', + '@type', + 'resourceId', + 'filterEnabled', + 'entityAttributesFilterTarget' + ] + }, + { + id: 'options', + label: 'label.options', + index: 2, + initialValues: [], + fields: [ + 'relyingPartyOverrides' + ] + }, + { + id: 'attributes', + label: 'label.attributes', + index: 3, + fields: [ + 'attributeRelease' + ] + } + ] +}; \ No newline at end of file diff --git a/ui/src/app/metadata/domain/filter/NameIdFilterDefinition.js b/ui/src/app/metadata/domain/filter/NameIdFilterDefinition.js new file mode 100644 index 000000000..ff16383e9 --- /dev/null +++ b/ui/src/app/metadata/domain/filter/NameIdFilterDefinition.js @@ -0,0 +1,79 @@ +import defaultsDeep from "lodash/defaultsDeep"; +import API_BASE_PATH from "../../../App.constant"; +import { BaseFilterDefinition } from "./BaseFilterDefinition"; + +import { isValidRegex } from '../../../core/utility/is_valid_regex'; + +export const NameIDFilterWizard = { + ...BaseFilterDefinition, + uiSchema: defaultsDeep({ + nameIdFormatFilterTarget: { + 'ui:field': 'FilterTargetField', + api: '' + }, + formats: { + "ui:options": { + orderable: false + }, + items: { + 'ui:widget': 'OptionWidget' + } + } + }, BaseFilterDefinition.uiSchema), + label: 'NameIDFormat', + type: 'NameIDFormat', + schema: `${API_BASE_PATH}/ui/NameIdFormatFilter`, + steps: [], + validator: (data = [], current = { resourceId: null }) => { + + const filters = current ? data.filter(s => s.resourceId !== current.resourceId) : data; + const names = filters.map(s => s.entityId); + + return (formData, errors) => { + if (names.indexOf(formData.name) > -1) { + errors.name.addError('message.name-unique'); + } + + if (formData?.nameIdFormatFilterTarget?.nameIdFormatFilterTargetType === 'REGEX') { + const { nameIdFormatFilterTarget: { value } } = formData; + const isValid = isValidRegex(value[0]); + if (!isValid) { + errors.nameIdFormatFilterTarget.value.addError('message.invalid-regex-pattern'); + } + } + return errors; + } + }, + formatter: (changes) => ({ + ...changes, + '@type': NameIDFilterWizard.type + }) +}; + +export const NameIDFilterEditor = { + ...NameIDFilterWizard, + steps: [ + { + id: 'common', + label: 'label.target', + index: 1, + fields: [ + 'name', + 'filterEnabled', + '@type', + 'resourceId', + 'nameIdFormatFilterTarget' + ] + }, + { + id: 'options', + label: 'label.options', + index: 2, + initialValues: [], + fields: [ + 'removeExistingFormats', + 'formats' + ] + } + ] +}; \ No newline at end of file diff --git a/ui/src/app/metadata/domain/filter/component/MetadataFilterConfigurationList.js b/ui/src/app/metadata/domain/filter/component/MetadataFilterConfigurationList.js new file mode 100644 index 000000000..521055c12 --- /dev/null +++ b/ui/src/app/metadata/domain/filter/component/MetadataFilterConfigurationList.js @@ -0,0 +1,44 @@ +import React from 'react'; + +import { Ordered } from '../../../../dashboard/component/Ordered'; +import { Translate } from '../../../../i18n/components/translate'; +import { MetadataFiltersContext } from './MetadataFilters'; + +import { MetadataFilterConfigurationListItem } from './MetadataFilterConfigurationListItem'; + +export function MetadataFilterConfigurationList ({provider, onDelete, editable = true}) { + const filters = React.useContext(MetadataFiltersContext); + + return ( + + {(ordered, first, last, onOrderUp, onOrderDown) => + <> + {ordered.length > 0 && +
    + {ordered.map((filter, i) => +
  • + onDelete(filter.resourceId)} + /> +
  • + )} +
+ } + { filters && filters.length < 1 && +
+

No Filters

+

No filters have been added to this Metadata Provider

+
+ } + + } +
+ ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/domain/filter/component/MetadataFilterConfigurationListItem.js b/ui/src/app/metadata/domain/filter/component/MetadataFilterConfigurationListItem.js new file mode 100644 index 000000000..4601db323 --- /dev/null +++ b/ui/src/app/metadata/domain/filter/component/MetadataFilterConfigurationListItem.js @@ -0,0 +1,86 @@ +import React from 'react'; + +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { faArrowCircleDown, faArrowCircleUp, faChevronUp, faEdit, faTrash } from '@fortawesome/free-solid-svg-icons'; +import Button from 'react-bootstrap/Button'; + +import { Translate } from '../../../../i18n/components/translate'; +import { Link } from 'react-router-dom'; +import { getDefinition } from '../../../domain/index'; +import { MetadataConfiguration } from '../../../component/MetadataConfiguration'; +import { useMetadataConfiguration } from '../../../hooks/configuration'; +import useFetch from 'use-http'; + +export function MetadataFilterConfigurationListItem ({ filter, isLast, isFirst, onOrderUp, onOrderDown, editable, onRemove, index }) { + const [open, setOpen] = React.useState(false); + + const definition = React.useMemo(() => getDefinition(filter['@type'], ), [filter]); + + const { get, response } = useFetch(''); + + const [schema, setSchema] = React.useState(); + + async function loadSchema(d) { + const source = await get(`/${d.schema}`) + if (response.ok) { + setSchema(source); + } + } + + /*eslint-disable react-hooks/exhaustive-deps*/ + React.useEffect(() => { loadSchema(definition) }, [definition]); + + const configuration = useMetadataConfiguration([filter], schema, definition); + + return (<> +
+ { index + 1 } + {editable && +
+ + +
+ } + + { filter['@type'] } + + + + + +
+ {open && +
+
+ {editable && +
+
+ +   + Edit + + +
+
+ } + {configuration && + } + +
+ } + ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/domain/filter/component/MetadataFilterEditorList.js b/ui/src/app/metadata/domain/filter/component/MetadataFilterEditorList.js new file mode 100644 index 000000000..f5b23aa23 --- /dev/null +++ b/ui/src/app/metadata/domain/filter/component/MetadataFilterEditorList.js @@ -0,0 +1,77 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; +import Check from 'react-bootstrap/FormCheck'; +import Button from 'react-bootstrap/Button'; + +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { faArrowCircleDown, faArrowCircleUp, faEdit, faTrash } from '@fortawesome/free-solid-svg-icons'; + +import { Ordered } from '../../../../dashboard/component/Ordered'; +import { Translate } from '../../../../i18n/components/translate'; + +export function MetadataFilterEditorList ({provider, filters, onDelete, onUpdate, loading}) { + + return ( + + {(ordered, first, last, onOrderUp, onOrderDown) => + + + + + + + + + + + + + + {ordered.map((filter, i) => + + + + + + + + + + )} + +
Filter NameFilter TypeEnabled?EditDelete
+
+ + +
+
{i + 1}{filter.name}{filter['@type']} +
+ Toggle this switch element} + checked={filter.filterEnabled} + disabled={loading} + onChange={() => onUpdate({ ...filter, filterEnabled: !filter.filterEnabled })} /> + {filter.disabled && } +
+
+ + + Edit + + + +
+ } +
+ ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/domain/filter/component/MetadataFilterVersionContext.js b/ui/src/app/metadata/domain/filter/component/MetadataFilterVersionContext.js new file mode 100644 index 000000000..e3e1c2557 --- /dev/null +++ b/ui/src/app/metadata/domain/filter/component/MetadataFilterVersionContext.js @@ -0,0 +1,78 @@ +import React from 'react'; +import { MetadataFilterTypes } from '../index'; + +export const isAdditionalFilter = (type) => MetadataFilterTypes.indexOf(type) > -1; + +export const getVersionModelFilterPluginsFn = (model, kind) => { + const filters = kind === 'provider' ? + model.metadataFilters ? model.metadataFilters.filter(filter => MetadataFilterTypes.indexOf(filter['@type']) === -1) : + [] : null; + return filters; +}; + +export const getComparisonModelsFilteredFn = (models) => models.map((model) => { + return ({ + ...model, + metadataFilters: getVersionModelFilterPluginsFn( + model, + model.hasOwnProperty('@type') ? model.hasOwnProperty('metadataFilters') ? 'provider' : 'filter' : 'resolver' + ) + }); +}); + +export const getVersionModelFiltersFn = + (model, kind) => kind === 'provider' ? + model.metadataFilters ? model.metadataFilters.filter(filter => isAdditionalFilter(filter['@type'])) : + [] : null; + +export const getComparisonFilterOrderedFn = (list) => + list.map(models => + models.map(filter => + ({ + ...filter, + comparable: list + .reduce((acc, v) => acc.concat(v), []) + .map(v => v.resourceId) + .some((id, index, coll) => { + return coll.indexOf(filter.resourceId) !== coll.lastIndexOf(filter.resourceId); + }) + }) + )); + +export const getComparisonFilterListFn = (models) => models.map(m => getVersionModelFiltersFn(m, 'provider')); + +export const getComparisonFilterConfiguration = (filters, dates) => { + const rows = filters.reduce((num, version) => version.length > num ? version.length : num, 0); + const range = [...Array(rows).keys()]; + return { + dates, + filters: range.reduce((collection, index) => { + const val = filters.map(version => version[index]); + collection[index] = val; + return collection; + }, []) + }; +} + +export function useComparisonFilterList(models) { + return React.useMemo(() => getComparisonFilterListFn(models), [models]); +} + +export function useOrderedComparisonFilterList (models) { + const data = useComparisonFilterList(models); + + return React.useMemo(() => getComparisonFilterOrderedFn(data), [data]); +} + +export function useComparisonFilterConfiguration (models, dates) { + const filters = useOrderedComparisonFilterList(models); + + return React.useMemo(() => getComparisonFilterConfiguration(filters, dates), [filters, dates]); +} + + +export function MetadataFilterVersionContext ({ models, dates, children }) { + const config = useComparisonFilterConfiguration(models, dates); + + return (<>{children(config)}); +} \ No newline at end of file diff --git a/ui/src/app/metadata/domain/filter/component/MetadataFilterVersionList.js b/ui/src/app/metadata/domain/filter/component/MetadataFilterVersionList.js new file mode 100644 index 000000000..0d47525a3 --- /dev/null +++ b/ui/src/app/metadata/domain/filter/component/MetadataFilterVersionList.js @@ -0,0 +1,74 @@ +import React from 'react'; +import { faArrowLeft } from '@fortawesome/free-solid-svg-icons'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import Button from 'react-bootstrap/Button'; +import FormattedDate from '../../../../core/components/FormattedDate'; +import Translate from '../../../../i18n/components/translate'; +import { usePropertyWidth } from '../../../component/properties/hooks'; +import { MetadataFilterVersionListItem } from './MetadataFilterVersionListItem'; + +export function MetadataFilterVersionList ({ configuration, limited, columns }) { + + const width = usePropertyWidth(columns); + + const [comparing, setComparing] = React.useState(false); + const [selected, setSelected] = React.useState(null); + + const resetFilterComparison = () => { + setComparing(false); + setSelected(null); + } + + return ( + + { configuration && configuration.dates.length > 0 && + + {!comparing ?
+ + + + {configuration.dates.map((d, didx) => + + + + ) } +
:
} + {configuration.filters.map((version, i) => + setSelected(id)} /> + ) } + { configuration && + + {configuration.filters.length < 1 ? +
+

No Filters

+

No filters have been added to this Metadata Provider

+
+ : +
+ {comparing ? + + : + + } +
+ } +
+ } +
+ } +
+ ); +} diff --git a/ui/src/app/metadata/domain/filter/component/MetadataFilterVersionListItem.js b/ui/src/app/metadata/domain/filter/component/MetadataFilterVersionListItem.js new file mode 100644 index 000000000..a1590a7a0 --- /dev/null +++ b/ui/src/app/metadata/domain/filter/component/MetadataFilterVersionListItem.js @@ -0,0 +1,71 @@ +import React from 'react'; +import { faCheckSquare, faSquare } from '@fortawesome/free-regular-svg-icons'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import Button from 'react-bootstrap/Button'; +import { MetadataConfiguration } from '../../../component/MetadataConfiguration'; +import { getDefinition } from '../../../domain/index'; +import { useMetadataConfiguration } from '../../../hooks/configuration'; +import useFetch from 'use-http'; + +export function MetadataFilterVersionListItem ({ filters, width, selected, index, comparing, limited, onSelect }) { + + const filter = filters.find(f => f.hasOwnProperty('@type')); + const type = filter['@type']; + + const definition = React.useMemo(() => getDefinition(type), [type]); + + const { get, response } = useFetch(``); + + const [schema, setSchema] = React.useState(); + + async function loadSchema(d) { + const source = await get(`/${d.schema}`) + if (response.ok) { + setSchema(source); + } + } + + /*eslint-disable react-hooks/exhaustive-deps*/ + React.useEffect(() => { loadSchema(definition) }, [definition]); + + const config = useMetadataConfiguration([...filters.filter(f => !!f)], schema, definition, limited); + + return ( + + {!comparing && +
+
+ {index + 1} +
+ {filters.map((filter, n) => + + +
+ {filter ? +
+
+

{filter.name}

+

{filter['@type']}

+
+ {filter.comparable && + + } +
+ : +
-
+ } +
+ +
+ )} +
+ } + {comparing === filter.resourceId && + + } +
+ ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/domain/filter/component/MetadataFilters.js b/ui/src/app/metadata/domain/filter/component/MetadataFilters.js new file mode 100644 index 000000000..13a22b53c --- /dev/null +++ b/ui/src/app/metadata/domain/filter/component/MetadataFilters.js @@ -0,0 +1,58 @@ +import React from 'react'; +import { useMetadataFilters } from '../../../hooks/api'; +import { DeleteConfirmation } from '../../../component/DeleteConfirmation'; + +export const MetadataFiltersContext = React.createContext(); + +export function MetadataFilters ({ providerId, types = [], filters, children }) { + + const { put, del, get, response, loading } = useMetadataFilters(providerId, { + cachePolicy: 'no-cache' + }); + + const [filterData, setFilterData] = React.useState([]); + + async function loadFilters(id) { + const list = await get(``); + if (response.ok) { + setFilterData(list.filter(f => types.length > 1 ? types.indexOf(f['@type']) > -1 : true)); + } + } + + async function updateFilter(filter) { + await put(`/${filter.resourceId}`, filter); + if (response.ok) { + loadFilters(providerId); + } + } + + async function deleteFilter(filterId) { + await del(`/${filterId}`); + if (response.ok) { + loadFilters(); + } + } + + const onDelete = (id) => deleteFilter(id); + const onUpdate = (f) => updateFilter(f); + + /*eslint-disable react-hooks/exhaustive-deps*/ + React.useEffect(() => { + if (!filters) { + loadFilters(providerId); + } else { + setFilterData(filterData); + } + }, [providerId]); + + + return ( + + {(block) => + + {children(filterData, onUpdate, (id) => block(() => onDelete(id)), loading)} + + } + + ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/domain/filter/index.js b/ui/src/app/metadata/domain/filter/index.js new file mode 100644 index 000000000..ee7e2a399 --- /dev/null +++ b/ui/src/app/metadata/domain/filter/index.js @@ -0,0 +1,16 @@ +import { EntityAttributesFilterEditor } from './EntityAttributesFilterDefinition'; +import { NameIDFilterEditor } from './NameIdFilterDefinition'; + +export const MetadataFilterWizardTypes = { + EntityAttributes: EntityAttributesFilterEditor, + NameIDFormat: NameIDFilterEditor +}; + +export const MetadataFilterEditorTypes = [ + EntityAttributesFilterEditor, + NameIDFilterEditor +]; + +export const MetadataFilterTypes = [ + ...MetadataFilterEditorTypes.map((t) => t.type) +]; \ No newline at end of file diff --git a/ui/src/app/metadata/domain/index.js b/ui/src/app/metadata/domain/index.js new file mode 100644 index 000000000..29ba6f98d --- /dev/null +++ b/ui/src/app/metadata/domain/index.js @@ -0,0 +1,46 @@ +import { CustomAttributeDefinition } from './attribute/CustomAttributeDefinition'; +import { MetadataFilterEditorTypes } from './filter'; +import { MetadataProviderEditorTypes, MetadataProviderWizardTypes } from './provider'; +import { DynamicHttpMetadataProviderEditor } from './provider/DynamicHttpMetadataProviderDefinition'; +import { FileBackedHttpMetadataProviderEditor } from './provider/FileBackedHttpMetadataProviderDefinition'; +import { LocalDynamicMetadataProviderEditor } from './provider/LocalDynamicMetadataProviderDefinition'; +import { SourceEditor, SourceWizard } from "./source/SourceDefinition"; + +export const editors = { + source: SourceEditor +}; + +export const wizards = { + source: SourceWizard +}; + +export const ProviderEditorTypes = [ + ...MetadataProviderEditorTypes +]; +export const ProviderWizardTypes = [ + ...MetadataProviderWizardTypes +]; +export const FilterEditorTypes = [ + ...MetadataFilterEditorTypes +]; + +export const AttributeEditorTypes = [ + CustomAttributeDefinition +]; + +export const FilterableProviders = [ + FileBackedHttpMetadataProviderEditor.type, + DynamicHttpMetadataProviderEditor.type, + LocalDynamicMetadataProviderEditor.type +]; + +export const getWizard = (type) => + ProviderWizardTypes.find(def => def.type === type) || + FilterEditorTypes.find(def => def.type === type) || + SourceWizard; + +export const getDefinition = (type) => + typeof type === 'string' ? + ProviderEditorTypes.find(def => def.type === type) || + FilterEditorTypes.find(def => def.type === type) || + SourceEditor : type; \ No newline at end of file diff --git a/ui/src/app/metadata/domain/index.test.js b/ui/src/app/metadata/domain/index.test.js new file mode 100644 index 000000000..38438a14f --- /dev/null +++ b/ui/src/app/metadata/domain/index.test.js @@ -0,0 +1,12 @@ +import { NameIDFilterEditor } from './filter/NameIdFilterDefinition'; +import { getDefinition } from './index'; +import { FileSystemMetadataProviderEditor } from './provider/FileSystemMetadataProviderDefinition'; +import { SourceEditor } from './source/SourceDefinition'; + +describe('getDefinitions method', () => { + it('should retrieve the definition', () => { + expect(getDefinition('source')).toBe(SourceEditor); + expect(getDefinition('NameIDFormat')).toBe(NameIDFilterEditor); + expect(getDefinition('FilesystemMetadataResolver')).toBe(FileSystemMetadataProviderEditor); + }); +}); \ No newline at end of file diff --git a/ui/src/app/metadata/domain/model/index.ts b/ui/src/app/metadata/domain/model/index.ts deleted file mode 100644 index cd00d92fe..000000000 --- a/ui/src/app/metadata/domain/model/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -export * from './metadata-base'; -export * from './metadata-entity'; -export * from './metadata-filter'; -export * from './metadata-provider'; -export * from './metadata-resolver'; -export * from './properties/certificate'; -export * from './properties/contact'; -export * from './properties/filter-target'; -export * from './properties/logout-endpoint'; -export * from './properties/mdui'; -export * from './properties/organization'; -export * from './properties/relying-party-overrides'; -export * from './properties/security-info'; -export * from './properties/sso-descriptor'; -export * from './properties/sso-service'; diff --git a/ui/src/app/metadata/domain/model/metadata-base.ts b/ui/src/app/metadata/domain/model/metadata-base.ts deleted file mode 100644 index e8847a6ee..000000000 --- a/ui/src/app/metadata/domain/model/metadata-base.ts +++ /dev/null @@ -1,7 +0,0 @@ -export interface MetadataBase { - id?: string; - createdDate?: string; - createdBy: string; - modifiedDate?: string; - version?: string; -} diff --git a/ui/src/app/metadata/domain/model/metadata-entity.ts b/ui/src/app/metadata/domain/model/metadata-entity.ts deleted file mode 100644 index 699502c8f..000000000 --- a/ui/src/app/metadata/domain/model/metadata-entity.ts +++ /dev/null @@ -1,14 +0,0 @@ -export interface MetadataEntity { - name: string; - enabled: boolean; - kind: string; - - createdBy: string; - - getId(): string; - getDisplayId(): string; - isDraft(): boolean; - getCreationDate(): Date; - - serialize(): any; -} diff --git a/ui/src/app/metadata/domain/model/metadata-filter.ts b/ui/src/app/metadata/domain/model/metadata-filter.ts deleted file mode 100644 index 46e53c4fb..000000000 --- a/ui/src/app/metadata/domain/model/metadata-filter.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { MetadataBase } from './metadata-base'; - -export interface MetadataFilter extends MetadataBase { - name: string; - filterEnabled?: boolean; - type: string; - resourceId: string | null; - - [key: string]: any; -} diff --git a/ui/src/app/metadata/domain/model/metadata-provider.ts b/ui/src/app/metadata/domain/model/metadata-provider.ts deleted file mode 100644 index e0b0a09a2..000000000 --- a/ui/src/app/metadata/domain/model/metadata-provider.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { - MetadataBase, -} from '../model'; -import { MetadataFilter } from './metadata-filter'; - -export interface MetadataProvider extends MetadataBase { - name: string; - '@type': string; - enabled: boolean; - resourceId: string; - xmlId: string; - sortKey: number; - metadataFilters: MetadataFilter[]; - reloadableMetadataResolverAttributes?: any; -} diff --git a/ui/src/app/metadata/domain/model/metadata-resolver.ts b/ui/src/app/metadata/domain/model/metadata-resolver.ts deleted file mode 100644 index e97c08d07..000000000 --- a/ui/src/app/metadata/domain/model/metadata-resolver.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { - MetadataBase, - Organization, - Contact, - MDUI, - SecurityInfo, - SsoService, - IdpSsoDescriptor, - LogoutEndpoint, - RelyingPartyOverrides -} from '../model'; - -export interface MetadataResolver extends MetadataBase { - id: string; - resourceId?: string; - entityId?: string; - serviceProviderName: string; - organization?: Organization; - contacts?: Contact[]; - mdui?: MDUI; - securityInfo?: SecurityInfo; - assertionConsumerServices?: SsoService[]; - serviceProviderSsoDescriptor?: IdpSsoDescriptor; - logoutEndpoints?: LogoutEndpoint[]; - serviceEnabled?: boolean; - relyingPartyOverrides?: RelyingPartyOverrides; - attributeRelease?: string[]; - - [property: string]: unknown; -} diff --git a/ui/src/app/metadata/domain/model/properties/certificate.ts b/ui/src/app/metadata/domain/model/properties/certificate.ts deleted file mode 100644 index bb8ad9088..000000000 --- a/ui/src/app/metadata/domain/model/properties/certificate.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface Certificate { - name: string; - type: string; - value: string; -} diff --git a/ui/src/app/metadata/domain/model/properties/contact.ts b/ui/src/app/metadata/domain/model/properties/contact.ts deleted file mode 100644 index 52d1fe905..000000000 --- a/ui/src/app/metadata/domain/model/properties/contact.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface Contact { - type: string; - name: string; - emailAddress: string; -} diff --git a/ui/src/app/metadata/domain/model/properties/filter-target.ts b/ui/src/app/metadata/domain/model/properties/filter-target.ts deleted file mode 100644 index d1e7ad9ca..000000000 --- a/ui/src/app/metadata/domain/model/properties/filter-target.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface FilterTarget { - type: string; - value: string[]; -} diff --git a/ui/src/app/metadata/domain/model/properties/logout-endpoint.ts b/ui/src/app/metadata/domain/model/properties/logout-endpoint.ts deleted file mode 100644 index 31354277a..000000000 --- a/ui/src/app/metadata/domain/model/properties/logout-endpoint.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface LogoutEndpoint { - url: string; - bindingType: string; -} diff --git a/ui/src/app/metadata/domain/model/properties/mdui.ts b/ui/src/app/metadata/domain/model/properties/mdui.ts deleted file mode 100644 index 6e309f3f1..000000000 --- a/ui/src/app/metadata/domain/model/properties/mdui.ts +++ /dev/null @@ -1,9 +0,0 @@ -export interface MDUI { - displayName?: string; - informationUrl?: string; - privacyStatementUrl?: string; - logoUrl?: string; - logoHeight?: number; - logoWidth?: number; - description?: string; -} diff --git a/ui/src/app/metadata/domain/model/properties/organization.ts b/ui/src/app/metadata/domain/model/properties/organization.ts deleted file mode 100644 index dd2e5116e..000000000 --- a/ui/src/app/metadata/domain/model/properties/organization.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface Organization { - name?: string; - displayName?: string; - url?: string; -} diff --git a/ui/src/app/metadata/domain/model/properties/release-attribute.ts b/ui/src/app/metadata/domain/model/properties/release-attribute.ts deleted file mode 100644 index 7edc37b6a..000000000 --- a/ui/src/app/metadata/domain/model/properties/release-attribute.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface ReleaseAttribute { - key: string; - label: string; -} diff --git a/ui/src/app/metadata/domain/model/properties/relying-party-overrides.ts b/ui/src/app/metadata/domain/model/properties/relying-party-overrides.ts deleted file mode 100644 index b720992ab..000000000 --- a/ui/src/app/metadata/domain/model/properties/relying-party-overrides.ts +++ /dev/null @@ -1,11 +0,0 @@ -export interface RelyingPartyOverrides { - signAssertion?: boolean; - dontSignResponse?: boolean; - turnOffEncryption?: boolean; - useSha?: boolean; - ignoreAuthenticationMethod?: boolean; - omitNotBefore?: boolean; - responderId?: string; - nameIdFormats: string[]; - authenticationMethods: string[]; -} diff --git a/ui/src/app/metadata/domain/model/properties/security-info.ts b/ui/src/app/metadata/domain/model/properties/security-info.ts deleted file mode 100644 index efa79867b..000000000 --- a/ui/src/app/metadata/domain/model/properties/security-info.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Certificate } from './certificate'; - -export interface SecurityInfo { - x509CertificateAvailable?: boolean; - authenticationRequestsSigned?: boolean; - wantAssertionsSigned?: boolean; - x509Certificates: Certificate[]; -} diff --git a/ui/src/app/metadata/domain/model/properties/sso-descriptor.ts b/ui/src/app/metadata/domain/model/properties/sso-descriptor.ts deleted file mode 100644 index 3b742e946..000000000 --- a/ui/src/app/metadata/domain/model/properties/sso-descriptor.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface IdpSsoDescriptor { - protocolSupportEnum: string; - nameIdFormats: string[]; -} diff --git a/ui/src/app/metadata/domain/model/properties/sso-service.ts b/ui/src/app/metadata/domain/model/properties/sso-service.ts deleted file mode 100644 index 2aa770b26..000000000 --- a/ui/src/app/metadata/domain/model/properties/sso-service.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface SsoService { - binding: string; - locationUrl: string; - makeDefault: boolean; -} diff --git a/ui/src/app/metadata/domain/model/property.ts b/ui/src/app/metadata/domain/model/property.ts deleted file mode 100644 index 51a4bf06e..000000000 --- a/ui/src/app/metadata/domain/model/property.ts +++ /dev/null @@ -1,16 +0,0 @@ -export interface Property { - title?: string; - type: string; - name: string; - value: any[]; - items: Property; - properties: Property[]; - differences?: boolean; - widget?: { - id: string; - data?: {key: string, label: string}[]; - dataUrl?: string; - differences?: string; - [propertyName: string]: any; - }; -} diff --git a/ui/src/app/metadata/domain/model/providers/base-metadata-provider.ts b/ui/src/app/metadata/domain/model/providers/base-metadata-provider.ts deleted file mode 100644 index 02d9ef01d..000000000 --- a/ui/src/app/metadata/domain/model/providers/base-metadata-provider.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { MetadataProvider } from '../metadata-provider'; - -export interface BaseMetadataProvider extends MetadataProvider { - metadataFilters: any[]; -} diff --git a/ui/src/app/metadata/domain/model/providers/dynamic-http-metadata-provider.ts b/ui/src/app/metadata/domain/model/providers/dynamic-http-metadata-provider.ts deleted file mode 100644 index 5d3201836..000000000 --- a/ui/src/app/metadata/domain/model/providers/dynamic-http-metadata-provider.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { BaseMetadataProvider } from './base-metadata-provider'; - -export interface DynamicHttpMetadataProvider extends BaseMetadataProvider { - id: string; - metadataURL: string; - dynamicMetadataResolverAttributes: DynamicMetadataResolverAttributes; - httpMetadataResolverAttributes: HttpMetadataResolverAttributes; - maxConnectionsTotal: number; - maxConnectionsPerRoute: number; - supportedContentTypes: string[]; -} - -export interface DynamicMetadataResolverAttributes { - refreshDelayFactor: number; - minCacheDuration: string; - maxCacheDuration: string; - maxIdleEntityData: string; - removeIdleEntityData: boolean; - cleanupTaskInterval: string; - - persistentCacheManagerRef: string; - persistentCacheManagerDirectory: string; - persistentCacheKeyGeneratorRef: string; - initializeFromPersistentCacheInBackground: boolean; - backgroundInitializationFromCacheDelay: string; - initializationFromCachePredicateRef: string; -} - -export interface HttpMetadataResolverAttributes { - httpClientRef; - connectionRequestTimeout: string; - connectionTimeout: string; - socketTimeout: string; - disregardTLSCertificate: boolean; - tlsTrustEngineRef: string; - httpClientSecurityParametersRef: string; - proxyHost: string; - proxyPort: string; - proxyUser: string; - proxyPassword: string; - httpCaching: HttpCachingType; - httpCacheDirectory: string; - httpMaxCacheEntries: number; - httpMaxCacheEntrySize: number; -} - -export enum HttpCachingType { - NONE = 'none', - FILE = 'file', - MEMORY = 'memory' -} diff --git a/ui/src/app/metadata/domain/model/providers/file-backed-http-metadata-provider.ts b/ui/src/app/metadata/domain/model/providers/file-backed-http-metadata-provider.ts deleted file mode 100644 index 1d1e39291..000000000 --- a/ui/src/app/metadata/domain/model/providers/file-backed-http-metadata-provider.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { BaseMetadataProvider } from './base-metadata-provider'; - -export interface FileBackedHttpMetadataProvider extends BaseMetadataProvider { - id: string; - metadataURL: string; - reloadableMetadataResolverAttributes: any; -} diff --git a/ui/src/app/metadata/domain/model/providers/file-system-metadata-provider.ts b/ui/src/app/metadata/domain/model/providers/file-system-metadata-provider.ts deleted file mode 100644 index e884151c1..000000000 --- a/ui/src/app/metadata/domain/model/providers/file-system-metadata-provider.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { BaseMetadataProvider } from './base-metadata-provider'; - -export interface FileSystemMetadataProvider extends BaseMetadataProvider { - id: string; - metadataFile: string; - reloadableMetadataResolverAttributes: any; -} diff --git a/ui/src/app/metadata/domain/model/providers/index.ts b/ui/src/app/metadata/domain/model/providers/index.ts deleted file mode 100644 index 6bce32434..000000000 --- a/ui/src/app/metadata/domain/model/providers/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './file-backed-http-metadata-provider'; -export * from './base-metadata-provider'; diff --git a/ui/src/app/metadata/domain/model/providers/local-dynamic-metadata-provider.ts b/ui/src/app/metadata/domain/model/providers/local-dynamic-metadata-provider.ts deleted file mode 100644 index b56f9237b..000000000 --- a/ui/src/app/metadata/domain/model/providers/local-dynamic-metadata-provider.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { BaseMetadataProvider } from './base-metadata-provider'; - -export interface LocalDynamicMetadataProvider extends BaseMetadataProvider { - id: string; - sourceDirectory: string; - reloadableMetadataResolverAttributes: any; -} diff --git a/ui/src/app/metadata/domain/model/wizards/metadata-source-base.spec.ts b/ui/src/app/metadata/domain/model/wizards/metadata-source-base.spec.ts deleted file mode 100644 index 4bcca0481..000000000 --- a/ui/src/app/metadata/domain/model/wizards/metadata-source-base.spec.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { MetadataSourceBase } from './metadata-source-base'; -import { MetadataResolver } from '../metadata-resolver'; - -describe('Metadata Source Base class', () => { - - let base = new MetadataSourceBase(); - const parser = base.parser; - const formatter = base.formatter; - const getValidators = base.getValidators; - - describe('parser', () => { - it('should return the provided object', () => { - let model = { - serviceProviderName: 'foo', - id: 'FileBackedHttpMetadataProvider' - }; - expect( - parser(model) - ).toEqual( - model - ); - }); - }); - - describe('formatter', () => { - it('should return the model', () => { - let model = { - serviceProviderName: 'foo', - id: 'FileBackedHttpMetadataProvider' - }; - expect( - formatter(model) - ).toEqual( - model - ); - }); - }); - - describe('getValidators method', () => { - it('should return a list of validators for the ngx-schema-form', () => { - expect(Object.keys(getValidators([]))).toEqual([ - '/', - '/entityId', - '/relyingPartyOverrides', - '/serviceProviderSsoDescriptor' - ]); - }); - - describe('root validator', () => { - it('should check for child errors', () => { - const validators = getValidators([]); - const validator = validators['/']; - const getPropertySpy = jasmine.createSpy('getProperty'); - const relyingPartyOverrides = { foo: 'bar', baz: 'foo' }; - const value = { relyingPartyOverrides }; - const error = { - code: 'INVALID_SIGNING', - path: `#/relyingPartyOverrides`, - message: 'message.invalid-signing', - params: [relyingPartyOverrides], - invalidate: false - }; - spyOn(validators, '/relyingPartyOverrides').and.returnValue(error); - - const validated = validator(value, null, { getProperty: getPropertySpy }); - - expect(validated).toBeUndefined(); - }); - }); - - describe('relying party validator', () => { - it('should check for child errors', () => { - const validators = getValidators([]); - const validator = validators['/relyingPartyOverrides']; - const relyingPartyOverrides = { signAssertion: false, dontSignResponse: true }; - const error = { - code: 'INVALID_SIGNING', - path: `#/relyingPartyOverrides`, - message: 'message.invalid-signing', - params: [relyingPartyOverrides], - invalidate: false - }; - - const validated = validator(relyingPartyOverrides, {path: '/relyingPartyOverrides'}); - - expect(validated).toEqual(error); - }); - - it('should return null if no error detected', () => { - const validators = getValidators([]); - const validator = validators['/relyingPartyOverrides']; - - expect(validator({ signAssertion: true, dontSignResponse: true }, { path: '/relyingPartyOverrides' })).toEqual(null); - expect(validator({ signAssertion: true, dontSignResponse: false }, { path: '/relyingPartyOverrides' })).toEqual(null); - expect(validator({ signAssertion: false, dontSignResponse: false }, { path: '/relyingPartyOverrides' })).toEqual(null); - }); - }); - }); -}); diff --git a/ui/src/app/metadata/domain/model/wizards/metadata-source-base.ts b/ui/src/app/metadata/domain/model/wizards/metadata-source-base.ts deleted file mode 100644 index 6cfd285c8..000000000 --- a/ui/src/app/metadata/domain/model/wizards/metadata-source-base.ts +++ /dev/null @@ -1,126 +0,0 @@ -import { Wizard, WizardStep } from '../../../../wizard/model'; -import { MetadataResolver } from '../metadata-resolver'; -import { FormProperty } from 'ngx-schema-form/lib/model/formproperty'; -import { ArrayProperty } from 'ngx-schema-form/lib/model/arrayproperty'; -import { ObjectProperty } from 'ngx-schema-form/lib/model/objectproperty'; -import { getAllOtherIds } from '../../../resolver/reducer'; - -/*istanbul ignore next */ -export class MetadataSourceBase implements Wizard { - label = 'Metadata Source'; - type = '@MetadataProvider'; - steps: WizardStep[] = []; - schema = ''; - - validatorParams = [getAllOtherIds]; - - bindings = { - '/securityInfo/x509CertificateAvailable': [ - { - 'input': (event, property: FormProperty) => { - let available = !property.value, - parent = property.parent, - certs = parent.getProperty('x509Certificates'); - if (available && !certs.value.length) { - certs.setValue([ - { - name: '', - type: 'both', - value: '' - } - ], true); - } - - if (!available && certs.value.length > 0) { - certs.setValue([], true); - } - } - } - ], - '/assertionConsumerServices/*/makeDefault': [ - { - 'input': (event, property: FormProperty) => { - let parent = property.parent.parent as ArrayProperty; - let props = parent.properties as ObjectProperty[]; - props.forEach(prop => { - if (prop !== property) { - prop.setValue({ - ...prop.value, - makeDefault: false - }, false); - } - }); - } - } - ] - }; - - parser(changes: Partial, schema?: any): any { - if (!schema || !schema.properties) { - return changes; - } - if (schema.properties.hasOwnProperty('organization') && !changes.organization) { - changes.organization = {}; - } - return changes; - } - - formatter(changes: Partial, schema?: any): any { - return changes; - } - - getValidators(entityIdList: string[]): { [key: string]: any } { - const validators = { - '/': (value, property, form_current) => { - let errors; - // iterate all customer - Object.keys(value).forEach((key) => { - const item = value[key]; - const validatorKey = `/${key}`; - const validator = validators.hasOwnProperty(validatorKey) ? validators[validatorKey] : null; - const error = validator ? validator(item, form_current.getProperty(key), form_current) : null; - if (error && error.invalidate) { - errors = errors || []; - errors.push(error); - } - }); - return errors; - }, - '/entityId': (value, property, form) => { - const err = entityIdList.indexOf(value) > -1 ? { - code: 'INVALID_ID', - path: `#${property.path}`, - message: 'message.id-unique', - params: [value], - invalidate: true - } : null; - return err; - }, - '/relyingPartyOverrides': (value, property, form) => { - if (!value.signAssertion && value.dontSignResponse) { - return { - code: 'INVALID_SIGNING', - path: `#${property.path}`, - message: 'message.invalid-signing', - params: [value], - invalidate: false - }; - } - return null; - }, - '/serviceProviderSsoDescriptor': (value, property, form) => { - if (value.nameIdFormats && value.nameIdFormats.length && !value.protocolSupportEnum) { - return { - code: 'PROTOCOL_SUPPORT_ENUM_REQUIRED', - path: `#${property.path}`, - message: 'message.protocol-support-required', - params: [value], - invalidate: true - }; - } - return null; - } - }; - return validators; - } -} diff --git a/ui/src/app/metadata/domain/model/wizards/metadata-source-editor.ts b/ui/src/app/metadata/domain/model/wizards/metadata-source-editor.ts deleted file mode 100644 index 65e2569c0..000000000 --- a/ui/src/app/metadata/domain/model/wizards/metadata-source-editor.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { Wizard, WizardStep } from '../../../../wizard/model'; -import { MetadataResolver } from '../metadata-resolver'; -import { MetadataSourceBase } from './metadata-source-base'; -import API_BASE_PATH from '../../../../app.constant'; -import { Injectable } from "@angular/core"; - -@Injectable() -export class MetadataSourceEditor extends MetadataSourceBase implements Wizard { - schema = `${API_BASE_PATH}/ui/MetadataSources`; - steps: WizardStep[] = [ - { - index: 1, - id: 'common', - label: 'label.sp-org-info', - fields: [ - 'serviceProviderName', - 'entityId', - 'serviceEnabled', - 'organization', - 'contacts' - ], - fieldsets: [ - { - type: 'group', - fields: [ - 'serviceProviderName', - 'entityId', - 'serviceEnabled', - 'organization' - ] - }, - { - type: 'group', - fields: [ - 'contacts' - ] - } - ] - }, - { - index: 3, - id: 'metadata-ui', - label: 'label.metadata-ui', - fields: [ - 'mdui' - ] - }, - { - index: 4, - id: 'descriptor-info', - label: 'label.descriptor-info', - fields: [ - 'serviceProviderSsoDescriptor' - ] - }, - { - index: 5, - id: 'logout-endpoints', - label: 'label.logout-endpoints', - fields: [ - 'logoutEndpoints' - ], - fieldsets: [ - { - type: 'group', - fields: [ - 'logoutEndpoints' - ] - } - ] - }, - { - index: 6, - id: 'key-info', - label: 'label.key-info', - fields: [ - 'securityInfo' - ] - }, - { - index: 7, - id: 'assertion', - label: 'label.assertion', - fields: [ - 'assertionConsumerServices' - ], - fieldsets: [ - { - type: 'group', - fields: [ - 'assertionConsumerServices' - ] - } - ] - }, - { - index: 8, - id: 'relying-party', - label: 'label.relying-party', - fields: [ - 'relyingPartyOverrides' - ], - fieldsets: [ - { - type: 'group', - fields: [ - 'relyingPartyOverrides' - ] - } - ] - }, - { - index: 9, - id: 'attribute', - label: 'label.attribute-release', - fields: [ - 'attributeRelease' - ], - fieldsets: [ - { - type: 'group', - fields: [ - 'attributeRelease' - ] - } - ] - } - ]; -} diff --git a/ui/src/app/metadata/domain/model/wizards/metadata-source-wizard.ts b/ui/src/app/metadata/domain/model/wizards/metadata-source-wizard.ts deleted file mode 100644 index edf1209b0..000000000 --- a/ui/src/app/metadata/domain/model/wizards/metadata-source-wizard.ts +++ /dev/null @@ -1,152 +0,0 @@ -import { Wizard, WizardStep } from '../../../../wizard/model'; -import { MetadataResolver } from '../metadata-resolver'; -import { MetadataSourceBase } from './metadata-source-base'; -import API_BASE_PATH from '../../../../app.constant'; -import { Injectable } from "@angular/core"; - -@Injectable() -export class MetadataSourceWizard extends MetadataSourceBase implements Wizard { - schema = `${API_BASE_PATH}/ui/MetadataSources`; - steps: WizardStep[] = [ - { - index: 1, - id: 'common', - label: 'label.name-and-entity-id', - fields: [ - 'serviceProviderName', - 'entityId' - ], - fieldsets: [ - { - type: 'section', - class: ['col-6'], - fields: [ - 'serviceProviderName', - 'entityId' - ] - } - ] - }, - { - index: 2, - id: 'org-info', - label: 'label.org-info', - fields: [ - 'organization', - 'contacts' - ], - fieldsets: [ - { - type: 'group', - fields: [ - 'organization' - ] - }, - { - type: 'group', - fields: [ - 'contacts' - ] - } - ] - }, - { - index: 3, - id: 'metadata-ui', - label: 'label.metadata-ui', - fields: [ - 'mdui' - ] - }, - { - index: 4, - id: 'descriptor-info', - label: 'label.descriptor-info', - fields: [ - 'serviceProviderSsoDescriptor' - ] - }, - { - index: 5, - id: 'logout-endpoints', - label: 'label.logout-endpoints', - fields: [ - 'logoutEndpoints' - ], - fieldsets: [ - { - type: 'group', - fields: [ - 'logoutEndpoints' - ] - } - ] - }, - { - index: 6, - id: 'key-info', - label: 'label.key-info', - fields: [ - 'securityInfo' - ] - }, - { - index: 7, - id: 'assertion', - label: 'label.assertion', - fields: [ - 'assertionConsumerServices' - ], - fieldsets: [ - { - type: 'group', - fields: [ - 'assertionConsumerServices' - ] - } - ] - }, - { - index: 8, - id: 'relying-party', - label: 'label.relying-party', - fields: [ - 'relyingPartyOverrides' - ], - fieldsets: [ - { - type: 'group', - fields: [ - 'relyingPartyOverrides' - ] - } - ] - }, - { - index: 9, - id: 'attribute', - label: 'label.attribute-release', - fields: [ - 'attributeRelease' - ], - fieldsets: [ - { - type: 'group', - fields: [ - 'attributeRelease' - ] - } - ] - }, - { - index: 10, - id: 'summary', - label: 'label.finished', - fields: [ - 'serviceEnabled' - ], - summary: true - } - ]; -} - diff --git a/ui/src/app/metadata/domain/provider/BaseProviderDefinition.js b/ui/src/app/metadata/domain/provider/BaseProviderDefinition.js new file mode 100644 index 000000000..948a43c39 --- /dev/null +++ b/ui/src/app/metadata/domain/provider/BaseProviderDefinition.js @@ -0,0 +1,219 @@ +import { metadataFilterProcessor } from './utility/providerFilterProcessor'; +import { DurationOptions } from '../data'; +import { MetadataFilterTypes } from '../filter'; + +export const BaseProviderDefinition = { + schemaPreprocessor: metadataFilterProcessor, + validator: (data = [], current = { resourceId: null }) => { + const providers = data.filter(p => p.resourceId !== current.resourceId); + const names = providers.map(s => s.name); + const ids = providers.map(s => s.xmlId); + + return (formData, errors) => { + + if (names.indexOf(formData.name) > -1) { + errors.name.addError('message.name-must-be-unique'); + } + + if (ids.indexOf(formData.xmlId) > -1) { + errors.xmlId.addError('message.id-unique'); + } + + return errors; + } + }, + parser: (changes, base) => { + + const baseFilters = base ? base.metadataFilters.filter(f => MetadataFilterTypes.indexOf(f['@type']) > -1) : [] + + const parsed = (changes.metadataFilters ? ({ + ...changes, + metadataFilters: [ + ...changes.metadataFilters.filter((filter, filterName) => ( + Object.keys(filter).filter(k => k !== '@type').length > 0 + )), + ...baseFilters + ] + }) : changes); + + return parsed; + }, + formatter: (changes, schema) => { + const filterSchema = schema?.properties?.metadataFilters; + if (!filterSchema || !changes) { + return changes; + } + + const formatted = (changes.metadataFilters ? ({ + ...changes, + metadataFilters: Object.values(filterSchema.items).map(item => { + const filter = changes.metadataFilters.find(f => f['@type'] === item.$id); + if (filter) { + return filter; + } + return {}; + }) + }) : changes); + return formatted; + }, + display: (changes) => { + if (!changes.metadataFilters) { + return changes; + } + return { + ...changes, + metadataFilters: { + ...changes.metadataFilters.reduce((collection, filter) => ({ + ...collection, + [filter['@type']]: filter + }), {}) + } + }; + }, + uiSchema: { + name: { + 'ui:help': 'message.must-be-unique' + } + }, + steps: [ + { + id: 'new', + label: 'label.select-metadata-provider-type', + index: 1, + initialValues: [], + fields: [ + 'name', + '@type' + ], + fieldsets: [ + { + type: 'section', + class: ['col-12'], + fields: [ + 'name', + '@type' + ] + } + ] + } + ] +} + +export const HttpMetadataResolverAttributesSchema = { + layout: { + groups: [ + { + title: 'label.http-security-attributes', + classNames: 'bg-light border rounded px-4 pt-4 pb-3 mb-4', + size: 12, + fields: [ + 'disregardTLSCertificate' + ] + }, + { + title: 'label.http-connection-attributes', + classNames: 'bg-light border rounded px-4 pt-4 pb-3 mb-4', + size: 12, + fields: [ + 'connectionRequestTimeout', + 'connectionTimeout', + 'socketTimeout' + ] + }, + { + title: 'label.http-proxy-attributes', + classNames: 'bg-light border rounded px-4 pt-4 pb-3 mb-4', + size: 12, + fields: [ + 'proxyHost', + 'proxyPort', + 'proxyUser', + 'proxyPassword' + ] + }, + { + title: 'label.http-caching-attributes', + classNames: 'bg-light border rounded px-4 pt-4 pb-3 mb-4', + size: 12, + fields: [ + 'httpCaching', + 'httpCacheDirectory', + 'httpMaxCacheEntries', + 'httpMaxCacheEntrySize' + ] + }, + { + classNames: 'd-none', + size: 12, + fields: [ + 'tlsTrustEngineRef', + 'httpClientSecurityParametersRef', + 'httpClientRef' + ] + } + ] + }, + disregardTLSCertificate: { + 'ui:widget': 'radio', + 'ui:options': { + inline: true + } + }, + connectionRequestTimeout: { + 'ui:widget': 'OptionWidget', + options: DurationOptions, + 'ui:placeholder': 'label.duration' + }, + connectionTimeout: { + 'ui:widget': 'OptionWidget', + options: DurationOptions, + 'ui:placeholder': 'label.duration' + }, + socketTimeout: { + 'ui:widget': 'OptionWidget', + options: DurationOptions, + 'ui:placeholder': 'label.duration' + }, + httpClientRef: { + 'ui:widget': 'hidden' + }, + tlsTrustEngineRef: { + 'ui:widget': 'hidden' + }, + httpClientSecurityParametersRef: { + 'ui:widget': 'hidden' + }, + httpMaxCacheEntries: { + 'ui:widget': 'updown' + }, + httpMaxCacheEntrySize: { + 'ui:widget': 'updown' + }, + httpCaching: { + 'ui:placeholder': 'label.select-caching-type' + } +}; + +export const MetadataFilterPluginsSchema = { + 'ui:title': false, + items: { + 'ui:options': { + classNames: 'bg-light border rounded px-4 pt-4 pb-3' + }, + '@type': { + 'ui:widget': 'hidden' + }, + retainedRoles: { + 'ui:options': { + orderable: false + } + }, + maxValidityInterval: { + 'ui:widget': 'OptionWidget', + options: DurationOptions, + 'ui:placeholder': 'label.duration' + } + } +}; + +// \ No newline at end of file diff --git a/ui/src/app/metadata/domain/provider/BaseProviderDefinition.test.js b/ui/src/app/metadata/domain/provider/BaseProviderDefinition.test.js new file mode 100644 index 000000000..d58cfe9b9 --- /dev/null +++ b/ui/src/app/metadata/domain/provider/BaseProviderDefinition.test.js @@ -0,0 +1,160 @@ +import { BaseProviderDefinition } from './BaseProviderDefinition'; +import schema from '../../../../testing/dynamic-http.schema'; +const addErrorMockFn = jest.fn(); + +const providers = [ + { + resourceId: 1, + name: 'foo', + xmlId: 'bar' + }, + { + resourceId: 2, + name: 'baz', + xmlId: 'xmlId' + } +]; + +const e = { + name: { addError: addErrorMockFn }, + xmlId: { addError: addErrorMockFn } +}; + +describe('validator function', () => { + it('should validate against the providers', () => { + const validator = BaseProviderDefinition.validator(providers, 2); + const errors = validator({ + name: 'foo', + xmlId: 'xmlId' + }, e); + + expect(addErrorMockFn).toHaveBeenCalledTimes(2); + }); + + it('should check against the current id', () => { + const validator = BaseProviderDefinition.validator(providers, 1); + const errors = validator({ + name: 'foo', + xmlId: 'naz' + }, e); + + expect(addErrorMockFn).toHaveBeenCalledTimes(1); + }); +}); + +describe('parser function', () => { + + const base = { + metadataFilters: [ + { + resourceId: 'foo', + name: 'foo', + '@type': 'NameIDFormat' + } + ] + }; + + const changes = { + metadataFilters: [ + { + '@type': "RequiredValidUntil", + audId: 19, + createdBy: "root", + createdDate: "2021-06-11T13:29:18.384219", + current: false, + filterEnabled: false, + maxValidityInterval: "PT30S", + resourceId: "299feea8-3e2c-433e-bc2e-48d28bf84a8c" + } + ] + }; + + it('should validate against the providers', () => { + const parsed = BaseProviderDefinition.parser( + changes, base + ); + + expect(parsed.metadataFilters.length).toBe(2); + }); +}); + +describe('formatter function', () => { + + const md = { + metadataFilters: [ + { + resourceId: 'foo', + name: 'foo', + '@type': 'NameIDFormat' + }, + { + '@type': "RequiredValidUntil", + audId: 19, + createdBy: "root", + createdDate: "2021-06-11T13:29:18.384219", + current: false, + filterEnabled: false, + maxValidityInterval: "PT30S", + resourceId: "299feea8-3e2c-433e-bc2e-48d28bf84a8c" + } + ] + }; + + it('should validate against the providers', () => { + const parsed = BaseProviderDefinition.formatter( + md, schema + ); + + expect(parsed.metadataFilters.length).toBe(3); + }); + + it('should return no changes if no filters are on the provider', () => { + const parsed = BaseProviderDefinition.formatter( + {}, schema + ); + + expect(parsed.metadataFilters).toBeUndefined(); + }); + + it('should return no changes if no provider is passed', () => { + const parsed = BaseProviderDefinition.formatter( + null, schema + ); + + expect(parsed).toBeNull(); + }); +}); + +describe('display function', () => { + + const md = { + metadataFilters: [ + { + resourceId: 'foo', + name: 'foo', + '@type': 'NameIDFormat' + }, + { + '@type': "RequiredValidUntil", + audId: 19, + createdBy: "root", + createdDate: "2021-06-11T13:29:18.384219", + current: false, + filterEnabled: false, + maxValidityInterval: "PT30S", + resourceId: "299feea8-3e2c-433e-bc2e-48d28bf84a8c" + } + ] + }; + + it('should validate against the providers', () => { + const parsed = BaseProviderDefinition.display(md); + expect(Array.isArray(parsed)).toBe(false); + }); + + it('should return an unmodified provider if no filters are present', () => { + const local = {}; + const parsed = BaseProviderDefinition.display(local); + expect(parsed).toEqual(local); + }); +}); \ No newline at end of file diff --git a/ui/src/app/metadata/domain/provider/DynamicHttpMetadataProviderDefinition.js b/ui/src/app/metadata/domain/provider/DynamicHttpMetadataProviderDefinition.js new file mode 100644 index 000000000..09218a290 --- /dev/null +++ b/ui/src/app/metadata/domain/provider/DynamicHttpMetadataProviderDefinition.js @@ -0,0 +1,233 @@ +import { BaseProviderDefinition, HttpMetadataResolverAttributesSchema, MetadataFilterPluginsSchema } from './BaseProviderDefinition'; +import API_BASE_PATH from '../../../App.constant'; +import defaultsDeep from 'lodash/defaultsDeep'; +import { DurationOptions } from '../data'; +import { isValidRegex } from '../../../core/utility/is_valid_regex'; + +export const DynamicHttpMetadataProviderWizard = { + ...BaseProviderDefinition, + label: 'DynamicHttpMetadataProvider', + type: 'DynamicHttpMetadataResolver', + schema: `${API_BASE_PATH}/ui/MetadataResolver/DynamicHttpMetadataResolver`, + validator: (data = [], current = { resourceId: null }) => { + const base = BaseProviderDefinition.validator(data, current); + return (formData, errors) => { + const errorList = base(formData, errors); + if (formData?.metadataRequestURLConstructionScheme['@type'] === 'Regex') { + const { metadataRequestURLConstructionScheme: { match } } = formData; + const isValid = isValidRegex(match); + if (!isValid) { + errors.metadataRequestURLConstructionScheme.match.addError('message.invalid-regex-pattern'); + } + } + + return errorList; + } + }, + steps: [ + ...BaseProviderDefinition.steps, + { + id: 'common', + label: 'label.common-attributes', + index: 2, + initialValues: [], + fields: [ + 'xmlId', + 'requireValidMetadata', + 'failFastInitialization', + 'metadataRequestURLConstructionScheme' + ] + }, + { + id: 'dynamic', + label: 'label.dynamic-attributes', + index: 3, + initialValues: [], + fields: [ + 'dynamicMetadataResolverAttributes' + ] + }, + { + id: 'plugins', + label: 'label.metadata-filter-plugins', + index: 4, + initialValues: [], + fields: [ + 'metadataFilters' + ] + }, + { + id: 'summary', + label: 'label.finished', + index: 5, + initialValues: [], + fields: [ + 'enabled' + ] + } + ], + uiSchema: defaultsDeep({ + layout: { + groups: [ + { + size: 8, + classNames: 'bg-light border rounded px-4 pt-4 pb-3 mb-4', + fields: [ + 'name', + '@type' + ] + }, + { + size: 8, + fields: [ + 'enabled' + ] + }, + { + size: 8, + fields: [ + 'xmlId', + 'requireValidMetadata', + 'failFastInitialization', + 'metadataRequestURLConstructionScheme' + ] + }, + { + size: 8, + fields: [ + 'dynamicMetadataResolverAttributes' + ], + }, + { + size: 8, + fields: [ + 'metadataFilters' + ], + }, + { + size: 8, + fields: [ + 'httpMetadataResolverAttributes' + ] + } + ] + }, + requireValidMetadata: { + 'ui:widget': 'radio', + 'ui:options': { + inline: true + } + }, + failFastInitialization: { + 'ui:widget': 'radio', + 'ui:options': { + inline: true + } + }, + dynamicMetadataResolverAttributes: { + refreshDelayFactor: { + 'ui:widget': 'updown', + 'ui:options': { + help: 'message.real-number' + }, + 'ui:placeholder': 'label.real-number' + }, + removeIdleEntityData: { + 'ui:widget': 'radio', + 'ui:options': { + inline: true + } + }, + initializeFromPersistentCacheInBackground: { + 'ui:widget': 'radio', + 'ui:options': { + inline: true + } + }, + minCacheDuration: { + 'ui:widget': 'OptionWidget', + options: DurationOptions, + 'ui:placeholder': 'label.duration' + }, + maxCacheDuration: { + 'ui:widget': 'OptionWidget', + options: DurationOptions, + 'ui:placeholder': 'label.duration' + }, + maxIdleEntityData: { + 'ui:widget': 'OptionWidget', + options: DurationOptions, + 'ui:placeholder': 'label.duration' + }, + cleanupTaskInterval: { + 'ui:widget': 'OptionWidget', + options: DurationOptions, + 'ui:placeholder': 'label.duration' + }, + backgroundInitializationFromCacheDelay: { + 'ui:widget': 'OptionWidget', + options: DurationOptions, + 'ui:placeholder': 'label.duration', + visibleIf: { + initializeFromPersistentCacheInBackground: true + } + } + }, + metadataFilters: MetadataFilterPluginsSchema, + httpMetadataResolverAttributes: HttpMetadataResolverAttributesSchema + }, BaseProviderDefinition.uiSchema), +}; + +export const DynamicHttpMetadataProviderEditor = { + ...DynamicHttpMetadataProviderWizard, + steps: [ + { + id: 'common', + label: 'label.common-attributes', + index: 1, + initialValues: [], + fields: [ + 'name', + '@type', + 'xmlId', + 'metadataRequestURLConstructionScheme', + 'enabled', + 'requireValidMetadata', + 'failFastInitialization' + ] + }, + { + id: 'dynamic', + label: 'label.dynamic-attributes', + index: 3, + initialValues: [], + fields: [ + 'dynamicMetadataResolverAttributes' + ] + }, + { + id: 'plugins', + label: 'label.metadata-filter-plugins', + index: 4, + initialValues: [], + fields: [ + 'metadataFilters' + ] + }, + { + id: 'advanced', + label: 'label.http-settings-advanced', + index: 4, + initialValues: [], + locked: true, + fields: [ + 'httpMetadataResolverAttributes' + ] + } + ], + uiSchema: defaultsDeep({ + '@type': { + 'ui:readonly': true + } + }, DynamicHttpMetadataProviderWizard.uiSchema) +}; \ No newline at end of file diff --git a/ui/src/app/metadata/domain/provider/FileBackedHttpMetadataProviderDefinition.js b/ui/src/app/metadata/domain/provider/FileBackedHttpMetadataProviderDefinition.js new file mode 100644 index 000000000..155ac915f --- /dev/null +++ b/ui/src/app/metadata/domain/provider/FileBackedHttpMetadataProviderDefinition.js @@ -0,0 +1,232 @@ +import defaultsDeep from 'lodash/defaultsDeep'; +import { BaseProviderDefinition, HttpMetadataResolverAttributesSchema, MetadataFilterPluginsSchema } from './BaseProviderDefinition'; + +import { DurationOptions } from '../data'; + +export const FileBackedHttpMetadataProviderWizard = { + ...BaseProviderDefinition, + label: 'FileBackedHttpMetadataProvider', + type: 'FileBackedHttpMetadataResolver', + schema: '/assets/schema/provider/filebacked-http.schema.json', + steps: [ + ...BaseProviderDefinition.steps, + { + id: 'common', + label: 'label.common-attributes', + index: 2, + initialValues: [], + fields: [ + 'xmlId', + 'metadataURL', + 'initializeFromBackupFile', + 'backingFile', + 'backupFileInitNextRefreshDelay', + 'requireValidMetadata', + 'failFastInitialization', + 'useDefaultPredicateRegistry', + 'satisfyAnyPredicates' + ] + }, + { + id: 'reloading', + label: 'label.reloading-attributes', + index: 3, + initialValues: [], + fields: [ + 'reloadableMetadataResolverAttributes' + ] + }, + { + id: 'plugins', + label: 'label.metadata-filter-plugins', + index: 4, + initialValues: [ + { key: 'metadataFilters', value: [] } + ], + fields: [ + 'metadataFilters' + ] + }, + { + id: 'summary', + label: 'label.finished', + index: 5, + initialValues: [], + fields: [ + 'enabled' + ] + } + ], + uiSchema: defaultsDeep({ + layout: { + groups: [ + { + size: 8, + classNames: 'bg-light border rounded px-4 pt-4 pb-3 mb-4', + fields: [ + 'name', + '@type' + ] + }, + { + size: 8, + fields: [ + 'enabled' + ] + }, + { + size: 8, + fields: [ + 'xmlId', + 'metadataURL', + 'initializeFromBackupFile', + 'backingFile', + 'backupFileInitNextRefreshDelay', + 'requireValidMetadata', + 'failFastInitialization', + 'useDefaultPredicateRegistry', + 'satisfyAnyPredicates', + ] + }, + { + size: 8, + fields: [ + 'reloadableMetadataResolverAttributes' + ], + }, + { + size: 8, + fields: [ + 'metadataFilters' + ], + }, + { + size: 8, + fields: [ + 'httpMetadataResolverAttributes' + ] + } + ] + }, + initializeFromBackupFile: { + 'ui:widget': 'radio', + 'ui:options': { + inline: true + } + }, + backupFileInitNextRefreshDelay: { + 'ui:widget': 'OptionWidget', + options: DurationOptions, + 'ui:placeholder': 'label.duration' + }, + requireValidMetadata: { + 'ui:widget': 'radio', + 'ui:options': { + inline: true + } + }, + useDefaultPredicateRegistry: { + 'ui:widget': 'radio', + 'ui:options': { + inline: true + } + }, + satisfyAnyPredicates: { + 'ui:widget': 'radio', + 'ui:options': { + inline: true + } + }, + failFastInitialization: { + 'ui:widget': 'radio', + 'ui:options': { + inline: true + } + }, + reloadableMetadataResolverAttributes: { + minRefreshDelay: { + 'ui:widget': 'OptionWidget', + options: DurationOptions, + 'ui:placeholder': 'label.duration' + }, + maxRefreshDelay: { + 'ui:widget': 'OptionWidget', + options: DurationOptions, + 'ui:placeholder': 'label.duration' + }, + refreshDelayFactor: { + 'ui:widget': 'updown', + 'ui:options': { + help: 'message.real-number', + step: 0.001 + }, + 'ui:placeholder': 'label.real-number' + } + }, + metadataFilters: MetadataFilterPluginsSchema, + httpMetadataResolverAttributes: HttpMetadataResolverAttributesSchema + }, BaseProviderDefinition.uiSchema) +}; + + +export const FileBackedHttpMetadataProviderEditor = { + ...FileBackedHttpMetadataProviderWizard, + schema: 'assets/schema/provider/filebacked-http.schema.json', + steps: [ + { + id: 'common', + label: 'label.common-attributes', + index: 1, + initialValues: [], + fields: [ + 'name', + '@type', + 'enabled', + 'xmlId', + 'metadataURL', + 'initializeFromBackupFile', + 'backingFile', + 'backupFileInitNextRefreshDelay', + 'requireValidMetadata', + 'failFastInitialization', + 'useDefaultPredicateRegistry', + 'satisfyAnyPredicates' + ] + }, + { + id: 'reloading', + label: 'label.reloading-attributes', + index: 2, + initialValues: [], + fields: [ + 'reloadableMetadataResolverAttributes' + ] + }, + { + id: 'plugins', + label: 'label.metadata-filter-plugins', + index: 3, + initialValues: [ + { key: 'metadataFilters', value: [] } + ], + fields: [ + 'metadataFilters' + ] + }, + { + id: 'advanced', + label: 'label.advanced-settings', + index: 4, + initialValues: [], + locked: true, + fields: [ + 'httpMetadataResolverAttributes' + ] + } + ], + uiSchema: defaultsDeep({ + '@type': { + 'ui:readonly': true + } + }, FileBackedHttpMetadataProviderWizard.uiSchema) +}; diff --git a/ui/src/app/metadata/provider/model/file-system.provider.form.ts b/ui/src/app/metadata/domain/provider/FileSystemMetadataProviderDefinition.js similarity index 60% rename from ui/src/app/metadata/provider/model/file-system.provider.form.ts rename to ui/src/app/metadata/domain/provider/FileSystemMetadataProviderDefinition.js index acff99069..84228dced 100644 --- a/ui/src/app/metadata/provider/model/file-system.provider.form.ts +++ b/ui/src/app/metadata/domain/provider/FileSystemMetadataProviderDefinition.js @@ -1,14 +1,15 @@ -import { Wizard } from '../../../wizard/model'; -import { FileSystemMetadataProvider } from '../../domain/model/providers/file-system-metadata-provider'; -import { BaseMetadataProviderEditor } from './base.provider.form'; -import API_BASE_PATH from '../../../app.constant'; +import defaultsDeep from 'lodash/defaultsDeep'; +import API_BASE_PATH from "../../../App.constant"; +import { BaseProviderDefinition } from "./BaseProviderDefinition"; +import { DurationOptions } from '../data'; -export const FileSystemMetadataProviderWizard: Wizard = { - ...BaseMetadataProviderEditor, +export const FileSystemMetadataProviderWizard = { + ...BaseProviderDefinition, label: 'FilesystemMetadataProvider', type: 'FilesystemMetadataResolver', schema: `${API_BASE_PATH}/ui/MetadataResolver/FilesystemMetadataResolver`, steps: [ + ...BaseProviderDefinition.steps, { id: 'common', label: 'label.common-attributes', @@ -18,17 +19,6 @@ export const FileSystemMetadataProviderWizard: Wizard = { +export const FileSystemMetadataProviderEditor = { ...FileSystemMetadataProviderWizard, steps: [ { @@ -92,7 +123,8 @@ export const FileSystemMetadataProviderEditor: Wizard = { - ...BaseMetadataProviderEditor, +import API_BASE_PATH from "../../../App.constant"; +import {DurationOptions} from '../data'; +import { BaseProviderDefinition } from "./BaseProviderDefinition"; + +export const LocalDynamicMetadataProviderWizard = { + ...BaseProviderDefinition, label: 'LocalDynamicMetadataProvider', type: 'LocalDynamicMetadataResolver', schema: `${API_BASE_PATH}/ui/MetadataResolver/LocalDynamicMetadataResolver`, steps: [ + ...BaseProviderDefinition.steps, { id: 'common', label: 'label.common-attributes', @@ -17,16 +19,6 @@ export const LocalDynamicMetadataProviderWizard: Wizard = { +export const LocalDynamicMetadataProviderEditor = { ...LocalDynamicMetadataProviderWizard, + uiSchema: defaultsDeep({ + '@type': { + 'ui:readonly': true + } + }, LocalDynamicMetadataProviderWizard.uiSchema), steps: [ { id: 'common', diff --git a/ui/src/app/metadata/domain/provider/component/ProviderList.js b/ui/src/app/metadata/domain/provider/component/ProviderList.js new file mode 100644 index 000000000..c2f07743a --- /dev/null +++ b/ui/src/app/metadata/domain/provider/component/ProviderList.js @@ -0,0 +1,77 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; +import Badge from 'react-bootstrap/Badge'; +import Button from 'react-bootstrap/Button'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { faChevronCircleDown, faChevronCircleUp } from '@fortawesome/free-solid-svg-icons'; + +import FormattedDate from '../../../../core/components/FormattedDate'; +import Translate from '../../../../i18n/components/translate'; +import { Scroller } from '../../../../dashboard/component/Scroller'; + +export default function ProviderList({ entities, reorder = true, first, last, onOrderUp, onOrderDown }) { + return ( + + {(limited) =>
+ + + + + + + + + + + + + {limited.map((provider, idx) => + + + + + + + + + )} + +
OrderTitleProvider TypeAuthorCreated DateEnabled
+
+ {reorder ? +
{idx + 1}
+ : +
+ } +   + + +
+
+ {provider.name} + { provider['@type'] }{ provider.createdBy } + + + +
+
+ } +
+ ); +} diff --git a/ui/src/app/metadata/provider/model/index.ts b/ui/src/app/metadata/domain/provider/index.js similarity index 65% rename from ui/src/app/metadata/provider/model/index.ts rename to ui/src/app/metadata/domain/provider/index.js index 123f99812..bc36234e5 100644 --- a/ui/src/app/metadata/provider/model/index.ts +++ b/ui/src/app/metadata/domain/provider/index.js @@ -1,8 +1,7 @@ -import { FileBackedHttpMetadataProviderWizard } from './file-backed-http.provider.form'; -import { FileBackedHttpMetadataProviderEditor } from './file-backed-http.provider.form'; -import { DynamicHttpMetadataProviderWizard, DynamicHttpMetadataProviderEditor } from './dynamic-http.provider.form'; -import { LocalDynamicMetadataProviderWizard, LocalDynamicMetadataProviderEditor } from './local-dynamic.provider.form'; -import { FileSystemMetadataProviderWizard, FileSystemMetadataProviderEditor } from './file-system.provider.form'; +import { FileBackedHttpMetadataProviderWizard, FileBackedHttpMetadataProviderEditor } from './FileBackedHttpMetadataProviderDefinition'; +import { DynamicHttpMetadataProviderWizard, DynamicHttpMetadataProviderEditor } from './DynamicHttpMetadataProviderDefinition'; +import { LocalDynamicMetadataProviderWizard, LocalDynamicMetadataProviderEditor } from './LocalDynamicMetadataProviderDefinition'; +import { FileSystemMetadataProviderWizard, FileSystemMetadataProviderEditor } from './FileSystemMetadataProviderDefinition'; export const MetadataProviderWizardTypes = [ FileBackedHttpMetadataProviderWizard, @@ -23,6 +22,3 @@ export const FilterableProviders = [ DynamicHttpMetadataProviderEditor.type, LocalDynamicMetadataProviderEditor.type ]; - -export * from './file-backed-http.provider.form'; -export * from './provider.form'; diff --git a/ui/src/app/metadata/provider/model/utilities.ts b/ui/src/app/metadata/domain/provider/utility/providerFilterProcessor.js similarity index 87% rename from ui/src/app/metadata/provider/model/utilities.ts rename to ui/src/app/metadata/domain/provider/utility/providerFilterProcessor.js index dc415bae1..d7eba098e 100644 --- a/ui/src/app/metadata/provider/model/utilities.ts +++ b/ui/src/app/metadata/domain/provider/utility/providerFilterProcessor.js @@ -12,7 +12,7 @@ export const metadataFilterProcessor = (schema) => { ...schema.properties, metadataFilters: { type: 'object', - properties: filters.items.reduce((collection, filterType) => ({ + properties: filters?.items?.reduce((collection, filterType) => ({ ...collection, [filterType.$id]: filterType }), {}) diff --git a/ui/src/app/metadata/domain/service/attributes.service.spec.ts b/ui/src/app/metadata/domain/service/attributes.service.spec.ts deleted file mode 100644 index fdb3ded69..000000000 --- a/ui/src/app/metadata/domain/service/attributes.service.spec.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { TestBed, inject, waitForAsync } from '@angular/core/testing'; -import { AttributesService } from './attributes.service'; -import { HttpClient, HttpClientModule, HttpRequest } from '@angular/common/http'; -import { of } from 'rxjs'; -import { HttpTestingController, HttpClientTestingModule } from '@angular/common/http/testing'; - -describe(`Attributes Service`, () => { - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - HttpClientModule, - HttpClientTestingModule - ], - providers: [ - AttributesService - ] - }); - }); - - describe('query method', () => { - it(`should call the request attributes method`, waitForAsync(inject([AttributesService, HttpTestingController], - (service: AttributesService) => { - spyOn(service, 'requestAttributes').and.returnValue(of([])); - service.query().subscribe(() => { - expect(service.requestAttributes).toHaveBeenCalled(); - }); - } - ))); - }); - describe('requestAttributes method', () => { - it(`should send an expected GET request`, waitForAsync(inject([AttributesService, HttpTestingController], - (service: AttributesService, backend: HttpTestingController) => { - service.requestAttributes('foo').subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `${service.base}${'foo'}` - && req.method === 'GET'; - }, `GET attributes by term`); - } - ))); - }); -}); diff --git a/ui/src/app/metadata/domain/service/attributes.service.ts b/ui/src/app/metadata/domain/service/attributes.service.ts deleted file mode 100644 index f07cd8e83..000000000 --- a/ui/src/app/metadata/domain/service/attributes.service.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; -import { Observable, throwError } from 'rxjs'; -import { catchError, shareReplay, map } from 'rxjs/operators'; -import { ReleaseAttribute } from '../model/properties/release-attribute'; -import API_BASE_PATH from '../../../app.constant'; - -const CACHE_SIZE = 1; - -@Injectable() -export class AttributesService { - - readonly endpoint = '/customAttributes'; - readonly base = API_BASE_PATH; - - private cache$: Observable; - - constructor( - private http: HttpClient - ) { } - - query(path: string = this.endpoint): Observable { - if (!this.cache$) { - this.cache$ = this.requestAttributes(path).pipe( - shareReplay(CACHE_SIZE) - ); - } - - return this.cache$; - } - - requestAttributes(path: string): Observable { - return this.http.get(`${this.base}${path}`, {}) - .pipe( - map(attrs => attrs.map((attr: any) => ({ key: attr.name, label: attr.displayName }))), - catchError(err => throwError([])) - ); - } -} diff --git a/ui/src/app/metadata/domain/service/draft.service.spec.ts b/ui/src/app/metadata/domain/service/draft.service.spec.ts deleted file mode 100644 index a8ae3cde8..000000000 --- a/ui/src/app/metadata/domain/service/draft.service.spec.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { TestBed } from '@angular/core/testing'; -import { EntityDraftService } from './draft.service'; -import { FileBackedHttpMetadataResolver } from '../entity'; -import { MetadataResolver } from '../model'; - -describe(`EntityDraftService`, () => { - let service: EntityDraftService; - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [], - providers: [ - EntityDraftService - ] - }); - - service = TestBed.get(EntityDraftService); - }); - - describe('query', () => { - it(`should return an observable of the list from the store`, (done: DoneFn) => { - let list = [new FileBackedHttpMetadataResolver()]; - spyOn(service.storage, 'query').and.returnValue(list); - service.query().subscribe(l => { - expect(l).toEqual(list); - done(); - }); - }); - }); - describe('find', () => { - it(`should return an observable of the list from the store`, (done: DoneFn) => { - let id = 'foo'; - let e = new FileBackedHttpMetadataResolver({ id: id }); - let list = [e]; - spyOn(service.storage, 'query').and.returnValue(list); - service.find(id).subscribe(entity => { - expect(entity).toEqual(e); - done(); - }); - }); - - it(`should return a 404 error if not found`, (done: DoneFn) => { - let id = null; - service.find(id).subscribe(null, err => { - expect(err).toEqual(`404 - null not found in cache.`); - done(); - }); - }); - }); - - describe('exists', () => { - it('should check if the provided id exists in storage', () => { - spyOn(service.storage, 'query').and.returnValue([{id: 'bar'} as MetadataResolver]); - expect(service.exists('foo')).toBe(false); - expect(service.exists('bar')).toBe(true); - }); - - it('should use the provided attr', () => { - spyOn(service.storage, 'query').and.returnValue([ - { id: 'bar', serviceProviderName: 'foo' } as MetadataResolver - ]); - expect(service.exists('foo', 'serviceProviderName')).toBe(true); - expect(service.exists('bar', 'serviceProviderName')).toBe(false); - }); - }); - - describe('save', () => { - it('should add the provider to storage', () => { - const resolver = { id: 'bar' } as MetadataResolver; - spyOn(service.storage, 'add'); - service.save(resolver).subscribe(); - expect(service.storage.add).toHaveBeenCalledWith(resolver); - }); - }); - - describe('remove', () => { - it('should remove the provider from storage', () => { - const resolver = { id: 'bar' } as MetadataResolver; - spyOn(service.storage, 'removeByAttr'); - service.remove(resolver).subscribe(); - expect(service.storage.removeByAttr).toHaveBeenCalledWith(resolver.id, 'id'); - }); - }); - - describe('update', () => { - it('should remove the provider from storage', () => { - const resolver = { id: 'bar' } as MetadataResolver; - const updates = { id: 'foo', serviceProviderName: 'bar' }; - spyOn(service.storage, 'findByAttr').and.returnValue(resolver); - spyOn(service.storage, 'add'); - spyOn(service.storage, 'removeByAttr'); - service.update(resolver).subscribe(); - expect(service.storage.removeByAttr).toHaveBeenCalled(); - expect(service.storage.add).toHaveBeenCalled(); - expect(service.storage.findByAttr).toHaveBeenCalled(); - }); - - it('should return a 404 if not found', () => { - const resolver = { id: 'bar' } as MetadataResolver; - spyOn(service.storage, 'findByAttr').and.returnValue(null); - service.update(resolver).subscribe(null, (err) => { - expect(err).toBe(`404 - ${resolver.id} not found in cache.`); - expect(service.storage.findByAttr).toHaveBeenCalled(); - }); - }); - }); -}); diff --git a/ui/src/app/metadata/domain/service/draft.service.ts b/ui/src/app/metadata/domain/service/draft.service.ts deleted file mode 100644 index 05efe2ef0..000000000 --- a/ui/src/app/metadata/domain/service/draft.service.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { Injectable } from '@angular/core'; - -import { Observable, of, throwError } from 'rxjs'; -import { switchMap } from 'rxjs/operators'; - -import { MetadataResolver } from '../../domain/model'; -import { Storage } from '../../../shared/storage'; - -@Injectable() -export class EntityDraftService { - - readonly storage: Storage; - - constructor() { - this.storage = new Storage('provider_drafts'); - } - query(): Observable { - return of(this.storage.query()); - } - - find(id: string, attr: string = 'id'): Observable { - if (!id) { - return throwError(`404 - ${id} not found in cache.`); - } - return this.query().pipe( - switchMap( - list => of(list.find(entity => entity[attr] === id)) - ) - ); - } - - exists(id: string, attr: string = 'id'): boolean { - return this.storage.query().some(entity => entity[attr] === id); - } - - save(provider: MetadataResolver): Observable { - this.storage.add(provider); - return of(provider); - } - - remove(provider: MetadataResolver): Observable { - if (!!provider) { - this.storage.removeByAttr(provider.id, 'id'); - } - return of(provider); - } - - update(provider: MetadataResolver): Observable { - let stored = this.storage.findByAttr(provider.id, 'id'); - if (stored) { - stored = { ...stored, ...provider }; - this.storage.removeByAttr(provider.id, 'id'); - this.storage.add(stored); - return of(stored); - } else { - return throwError(`404 - ${provider.id} not found in cache.`); - } - } -} /* istanbul ignore next */ diff --git a/ui/src/app/metadata/domain/service/entity-id.service.spec.ts b/ui/src/app/metadata/domain/service/entity-id.service.spec.ts deleted file mode 100644 index 9fdb54970..000000000 --- a/ui/src/app/metadata/domain/service/entity-id.service.spec.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { TestBed, inject, waitForAsync } from '@angular/core/testing'; -import { HttpClientModule, HttpRequest, HttpParams } from '@angular/common/http'; -import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; -import { EntityIdService } from './entity-id.service'; - - -describe(`EntityIdService`, () => { - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - HttpClientModule, - HttpClientTestingModule - ], - providers: [ - EntityIdService - ] - }); - }); - - describe('query', () => { - let query = { - term: 'foo', - limit: 10, - offset: 1 - }; - - it(`should send an expected GET request`, waitForAsync(inject([EntityIdService, HttpTestingController], - (service: EntityIdService, backend: HttpTestingController) => { - service.query(query).subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `${service.base}${service.searchEndpoint}` - && req.method === 'GET'; - }, `GET EntityIds by term`); - } - ))); - }); -}); diff --git a/ui/src/app/metadata/domain/service/entity-id.service.ts b/ui/src/app/metadata/domain/service/entity-id.service.ts deleted file mode 100644 index 58845dd09..000000000 --- a/ui/src/app/metadata/domain/service/entity-id.service.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; - -import { Observable, Subject, throwError } from 'rxjs'; -import { map, catchError } from 'rxjs/operators'; - -import { QueryParams } from '../../../core/model/query'; -import { MDUI } from '../model'; -import API_BASE_PATH from '../../../app.constant'; - -@Injectable() -export class EntityIdService { - - readonly searchEndpoint = '/EntityIds/search'; - readonly entitiesEndpoint = '/entities'; - readonly base = API_BASE_PATH; - - constructor( - private http: HttpClient - ) { } - - query(q: QueryParams): Observable { - let params: HttpParams = new HttpParams(); - Object.keys(q).forEach(key => params = params.set(key, q[key])); - const opts = { params: params }; - return this.http - .get(`${this.base}${this.searchEndpoint}`, opts) - .pipe( - map(resp => resp.entityIds), - catchError(err => throwError([])) - ); - } - - preview(id: string): Observable { - return this.http - .get(`${this.base}${this.entitiesEndpoint}/${encodeURIComponent(id)}`, { - headers: new HttpHeaders({ - 'Accept': 'application/xml' - }), - responseType: 'text' - }); - } - - findEntityById(id: string): Observable { - return this.http - .get(`${this.base}${this.entitiesEndpoint}/${encodeURIComponent(id)}`) - .pipe( - map(entity => entity.mdui as MDUI) - ); - } -} diff --git a/ui/src/app/metadata/domain/service/entity-validators.service.spec.ts b/ui/src/app/metadata/domain/service/entity-validators.service.spec.ts deleted file mode 100644 index d6c4a8392..000000000 --- a/ui/src/app/metadata/domain/service/entity-validators.service.spec.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { TestBed, inject, waitForAsync } from '@angular/core/testing'; -import { EntityValidators } from './entity-validators.service'; -import { Observable, of } from 'rxjs'; -import { AbstractControl, FormBuilder, ReactiveFormsModule } from '@angular/forms'; - -let ids = ['foo', 'bar', 'baz']; - -describe(`Entity Validators service`, () => { - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - ReactiveFormsModule - ], - providers: [ - EntityValidators - ] - }); - }); - - describe('createUniqueIdValidator', () => { - it('should detect that a provided id is already used', waitForAsync(inject([FormBuilder], (fb) => { - let obs = of(ids), - validator = EntityValidators.createUniqueIdValidator(obs), - ctrl = fb.control('foo'); - validator(ctrl).subscribe(next => { - expect(next).toBeTruthy(); - }); - }))); - - it('should detect that a provided id is NOT already used', waitForAsync(inject([FormBuilder], (fb) => { - let obs = of(ids), - validator = EntityValidators.createUniqueIdValidator(obs), - ctrl = fb.control('hi'); - validator(ctrl).subscribe(next => { - expect(next).toBeFalsy(); - }); - }))); - }); - - describe('createOrgValidator', () => { - it('should detect that all controls in a group have a value', waitForAsync(inject([FormBuilder], (fb) => { - let validator = EntityValidators.createOrgValidator(), - group = fb.group({ - foo: '', - bar: '', - baz: '' - }); - group.get('baz').patchValue('123'); - group.updateValueAndValidity(); - validator(group).subscribe(next => { - expect(next).toBeTruthy(); - }); - }))); - - it('should not validate if all controls are empty', waitForAsync(inject([FormBuilder], (fb) => { - let validator = EntityValidators.createOrgValidator(), - group = fb.group({ - foo: '', - bar: '', - baz: '' - }); - validator(group).subscribe(next => { - expect(next).toBeFalsy(); - }); - }))); - - it('should not validate if all controls are empty', waitForAsync(inject([FormBuilder], (fb) => { - let validator = EntityValidators.createOrgValidator(), - group = fb.group({ - foo: '', - bar: '', - baz: '' - }); - group.get('foo').patchValue('123'); - group.get('bar').patchValue('456'); - group.get('baz').patchValue('789'); - group.updateValueAndValidity(); - validator(group).subscribe(next => { - expect(next).toBeFalsy(); - }); - }))); - - it('should return an empty observable when no control is provided', waitForAsync(inject([FormBuilder], (fb) => { - let validator = EntityValidators.createOrgValidator(); - validator(null).subscribe(next => { - expect(next).toBeFalsy(); - }); - }))); - }); - - describe('createUniqueIdValidator', () => { - it('should detect that a provided id is in the collection', waitForAsync(inject([FormBuilder], (fb) => { - let obs = of(ids), - validator = EntityValidators.existsInCollection(obs), - ctrl = fb.control('foo'); - validator(ctrl).subscribe(next => { - expect(next).toBeNull(); - }); - }))); - - it('should detect that a provided id is not in the collection', waitForAsync(inject([FormBuilder], (fb) => { - let obs = of(ids), - validator = EntityValidators.existsInCollection(obs), - ctrl = fb.control('hi'); - validator(ctrl).subscribe(next => { - expect(next).toBeTruthy(); - }); - }))); - }); -}); diff --git a/ui/src/app/metadata/domain/service/entity-validators.service.ts b/ui/src/app/metadata/domain/service/entity-validators.service.ts deleted file mode 100644 index 638ba0c63..000000000 --- a/ui/src/app/metadata/domain/service/entity-validators.service.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { Observable, of } from 'rxjs'; -import { map, take, startWith } from 'rxjs/operators'; - -import { AbstractControl } from '@angular/forms'; - -export class EntityValidators { - static createUniqueIdValidator(ids$: Observable) { - return (control: AbstractControl) => { - return ids$.pipe( - map(ids => ids.filter(id => id === control.value)), - map(ids => !!ids.length), - map((isTaken: boolean) => isTaken ? { unique: true } : null), - take(1) - ); - }; - } - - static createOrgValidator() { - return (control: AbstractControl) => { - if (!control || !control.valueChanges) { - return of(null); - } - return control.valueChanges.pipe( - startWith(control.value), - map(values => { - let keys = Object.keys(values), - hasValue = keys.reduce((val, key) => val + (values[key] ? values[key] : ''), ''), - allHaveValue = keys.reduce((val, key) => { - return !values[key] ? false : val; - }, true); - if (!hasValue) { - return true; - } else { - return allHaveValue; - } - }), - map(isValid => { - return !isValid ? { org: true } : null; - }), - take(1) - ); - }; - } - - static existsInCollection(ids$: Observable) { - return (control: AbstractControl) => { - return ids$.pipe( - map(ids => ids.find(id => id === control.value)), - map(ids => ids && !!ids.length), - map((exists: boolean) => exists ? null : { exists: true }), - take(1) - ); - }; - } -} diff --git a/ui/src/app/metadata/domain/service/filter.service.spec.ts b/ui/src/app/metadata/domain/service/filter.service.spec.ts deleted file mode 100644 index bf8147a4d..000000000 --- a/ui/src/app/metadata/domain/service/filter.service.spec.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { TestBed, inject, waitForAsync } from '@angular/core/testing'; -import { HttpTestingController, HttpClientTestingModule } from '@angular/common/http/testing'; -import { HttpClientModule, HttpRequest } from '@angular/common/http'; -import { MetadataFilterService } from './filter.service'; -import { EntityAttributesFilterEntity } from '../entity'; - -describe(`Metadata Filter Service`, () => { - - const provider = 'foo'; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - HttpClientModule, - HttpClientTestingModule - ], - providers: [ - MetadataFilterService - ] - }); - }); - - describe('query method', () => { - it(`should send an expected GET[] request`, waitForAsync(inject([MetadataFilterService, HttpTestingController], - (service: MetadataFilterService, backend: HttpTestingController) => { - service.query(provider).subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `${service.base}${service.endpoint}/${provider}/Filters` - && req.method === 'GET'; - }, `GET MetadataFilter collection`); - } - ))); - }); - describe('find method', () => { - it(`should send an expected GET request`, waitForAsync(inject([MetadataFilterService, HttpTestingController], - (service: MetadataFilterService, backend: HttpTestingController) => { - const id = 'bar'; - service.find(provider, id).subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `${service.base}${service.endpoint}/${provider}/Filters/${id}` - && req.method === 'GET'; - }, `GET MetadataFilter`); - } - ))); - }); - describe('update method', () => { - it(`should send an expected PUT request`, waitForAsync(inject([MetadataFilterService, HttpTestingController], - (service: MetadataFilterService, backend: HttpTestingController) => { - const id = 'bar'; - const filter = new EntityAttributesFilterEntity({ resourceId: id }); - service.update(provider, filter).subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `${service.base}${service.endpoint}/${provider}/Filters/${ id }` - && req.method === 'PUT'; - }, `PUT (update) MetadataFilter`); - } - ))); - }); - describe('save method', () => { - it(`should send an expected POST request`, waitForAsync(inject([MetadataFilterService, HttpTestingController], - (service: MetadataFilterService, backend: HttpTestingController) => { - const id = 'bar'; - const filter = new EntityAttributesFilterEntity({ resourceId: id }); - service.save(provider, filter).subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `${service.base}${service.endpoint}/${provider}/Filters` - && req.method === 'POST'; - }, `POST MetadataFilter`); - } - ))); - }); -}); diff --git a/ui/src/app/metadata/domain/service/filter.service.ts b/ui/src/app/metadata/domain/service/filter.service.ts deleted file mode 100644 index fed08adec..000000000 --- a/ui/src/app/metadata/domain/service/filter.service.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; -import { Observable } from 'rxjs'; - -import { MetadataFilter } from '../../domain/model'; -import API_BASE_PATH from '../../../app.constant'; - -@Injectable() -export class MetadataFilterService { - - readonly endpoint = '/MetadataResolvers'; - readonly order = 'FiltersPositionOrder'; - readonly base = API_BASE_PATH; - readonly path = 'Filters'; - - constructor( - private http: HttpClient - ) { } - query(providerId: string): Observable { - return this.http.get(`${this.base}${this.endpoint}/${providerId}/${this.path}`); - } - - find(providerId: string, filterId: string): Observable { - return this.http.get(`${this.base}${this.endpoint}/${providerId}/${this.path}/${filterId}`); - } - - update(providerId: string, filter: MetadataFilter): Observable { - return this.http.put(`${this.base}${this.endpoint}/${providerId}/${this.path}/${ filter.resourceId }`, filter); - } - - save(providerId: string, filter: MetadataFilter): Observable { - return this.http.post(`${this.base}${this.endpoint}/${providerId}/${this.path}`, filter); - } - - getOrder(providerId: string): Observable { - return this.http.get(`${this.base}${this.endpoint}/${providerId}/${this.order}`); - } - - setOrder(providerId: string, order: string[]): Observable { - return this.http.post(`${this.base}${this.endpoint}/${providerId}/${this.order}`, order); - } - - remove(providerId: string, filterId: string): Observable { - return this.http.delete(`${this.base}${this.endpoint}/${providerId}/${this.path}/${filterId}`); - } -} diff --git a/ui/src/app/metadata/domain/service/list-values.service.spec.ts b/ui/src/app/metadata/domain/service/list-values.service.spec.ts deleted file mode 100644 index a4b17614e..000000000 --- a/ui/src/app/metadata/domain/service/list-values.service.spec.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { TestBed, inject, waitForAsync } from '@angular/core/testing'; -import { EntityValidators } from './entity-validators.service'; -import { Observable, of } from 'rxjs'; -import { ListValuesService } from './list-values.service'; -import { AttributesService } from './attributes.service'; -import { MockAttributeService } from '../../../../testing/attributes.stub'; - -describe(`ListValuesService`, () => { - let service: ListValuesService; - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [], - providers: [ - { provide: AttributesService, useClass: MockAttributeService }, - ListValuesService - ] - }); - service = TestBed.get(ListValuesService); - }); - - describe(`searchStringList method`, () => { - it('should match values', (done: DoneFn) => { - let list = of(['foo', 'bar', 'baz']), - query = of('foo'); - service.searchStringList(list)(query).subscribe((matches) => { - expect(matches.length).toBe(1); - done(); - }); - }); - }); - - describe(`searchFormats method`, () => { - it('should match the nameid formats', (done: DoneFn) => { - let query = of('unspecified'); - service.searchFormats(query).subscribe((matches) => { - expect(matches.length).toBe(1); - done(); - }); - }); - }); - - describe(`searchAuthenticationMethods method`, () => { - it('should match the nameid formats', (done: DoneFn) => { - let query = of('TimeSyncToken'); - service.searchAuthenticationMethods(query).subscribe((matches) => { - expect(matches.length).toBe(1); - done(); - }); - }); - }); -}); diff --git a/ui/src/app/metadata/domain/service/list-values.service.ts b/ui/src/app/metadata/domain/service/list-values.service.ts deleted file mode 100644 index dff88ea7e..000000000 --- a/ui/src/app/metadata/domain/service/list-values.service.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable, of } from 'rxjs'; - -import { debounceTime, distinctUntilChanged, combineLatest } from 'rxjs/operators'; -import { AttributesService } from './attributes.service'; -import { ReleaseAttribute } from '../model/properties/release-attribute'; - -@Injectable() -export class ListValuesService { - constructor( - private attributes: AttributesService - ) {} - - readonly nameIdFormats: Observable = of([ - 'urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified', - 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress', - 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent', - 'urn:oasis:names:tc:SAML:2.0:nameid-format:transient' - ]); - - readonly authenticationMethods: Observable = of([ - 'https://refeds.org/profile/mfa', - 'urn:oasis:names:tc:SAML:2.0:ac:classes:TimeSyncToken', - 'urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport' - ]); - - get attributesToRelease(): Observable { - return this.attributes.query(); - } - - searchStringList = (list: Observable): Function => - (text$: Observable) => - text$.pipe( - debounceTime(100), - distinctUntilChanged(), - combineLatest( - list, - (term, formats) => formats.filter( - v => v.toLowerCase().match(term.toLowerCase()) - ) - .slice(0, 4)) - ) - - get searchFormats(): Function { - return this.searchStringList(this.nameIdFormats); - } - get searchAuthenticationMethods(): Function { - return this.searchStringList(this.authenticationMethods); - } -} /* istanbul ignore next */ diff --git a/ui/src/app/metadata/domain/service/provider-change-emitter.service.spec.ts b/ui/src/app/metadata/domain/service/provider-change-emitter.service.spec.ts deleted file mode 100644 index b96ee0416..000000000 --- a/ui/src/app/metadata/domain/service/provider-change-emitter.service.spec.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { TestBed, inject, waitForAsync } from '@angular/core/testing'; -import { EntityValidators } from './entity-validators.service'; -import { Observable } from 'rxjs'; -import { AbstractControl, FormBuilder, ReactiveFormsModule } from '@angular/forms'; -import { ProviderStatusEmitter, ProviderValueEmitter } from './provider-change-emitter.service'; - -describe(`Resolver Change emitter service`, () => { - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - ReactiveFormsModule - ], - providers: [ - ProviderStatusEmitter, - ProviderValueEmitter - ] - }); - }); - - describe('ProviderStatusEmitter', () => { - it('should emit values', waitForAsync(inject([ProviderStatusEmitter], (emitter) => { - let val = 'foo'; - emitter.changeEmitted$.subscribe(n => { - expect(n).toEqual(val); - }); - emitter.emit(val); - }))); - }); - - describe('ProviderValueEmitter', () => { - it('should emit values', waitForAsync(inject([ProviderValueEmitter], (emitter) => { - let val = 'foo'; - emitter.changeEmitted$.subscribe(n => { - expect(n).toEqual(val); - }); - emitter.emit(val); - }))); - }); -}); diff --git a/ui/src/app/metadata/domain/service/provider-change-emitter.service.ts b/ui/src/app/metadata/domain/service/provider-change-emitter.service.ts deleted file mode 100644 index 64c527a04..000000000 --- a/ui/src/app/metadata/domain/service/provider-change-emitter.service.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable, Subject } from 'rxjs'; - -@Injectable() -export class ProviderValueEmitter implements ChangeEmitter { - private subj = new Subject(); - changeEmitted$ = this.subj.asObservable(); - emit(change: any) { - this.subj.next(change); - } -} - -@Injectable() -export class ProviderStatusEmitter implements ChangeEmitter { - private subj = new Subject(); - changeEmitted$ = this.subj.asObservable(); - emit(change: string) { - this.subj.next(change); - } -} - -export interface ChangeEmitter { - changeEmitted$: Observable; - emit(change: string): void; -} /* istanbul ignore next */ diff --git a/ui/src/app/metadata/domain/service/provider.service.spec.ts b/ui/src/app/metadata/domain/service/provider.service.spec.ts deleted file mode 100644 index dabc06e6c..000000000 --- a/ui/src/app/metadata/domain/service/provider.service.spec.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { TestBed, inject, waitForAsync } from '@angular/core/testing'; -import { HttpTestingController, HttpClientTestingModule } from '@angular/common/http/testing'; -import { HttpClientModule, HttpRequest } from '@angular/common/http'; -import { MetadataProviderService } from './provider.service'; -import { MetadataProvider } from '../model'; - -describe(`Metadata Provider Service`, () => { - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - HttpClientModule, - HttpClientTestingModule - ], - providers: [ - MetadataProviderService - ] - }); - }); - - describe('query method', () => { - it(`should send an expected GET[] request`, waitForAsync(inject([MetadataProviderService, HttpTestingController], - (service: MetadataProviderService, backend: HttpTestingController) => { - service.query().subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `${service.base}${service.endpoint}` - && req.method === 'GET'; - }, `GET MetadataResolvers collection`); - } - ))); - }); - describe('find method', () => { - it(`should send an expected GET request`, waitForAsync(inject([MetadataProviderService, HttpTestingController], - (service: MetadataProviderService, backend: HttpTestingController) => { - const id = 'foo'; - service.find(id).subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `${service.base}${service.endpoint}/${id}` - && req.method === 'GET'; - }, `GET MetadataResolvers collection`); - } - ))); - }); - describe('update method', () => { - it(`should send an expected PUT request`, waitForAsync(inject([MetadataProviderService, HttpTestingController], - (service: MetadataProviderService, backend: HttpTestingController) => { - const id = 'foo'; - const provider = { resourceId: id }; - service.update(provider).subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `${service.base}${service.endpoint}/${id}` - && req.method === 'PUT'; - }, `PUT (update) MetadataResolvers collection`); - } - ))); - }); - describe('save method', () => { - it(`should send an expected POST request`, waitForAsync(inject([MetadataProviderService, HttpTestingController], - (service: MetadataProviderService, backend: HttpTestingController) => { - const id = 'foo'; - const provider = { resourceId: id }; - service.save(provider).subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `${service.base}${service.endpoint}` - && req.method === 'POST'; - }, `POST MetadataResolvers collection`); - } - ))); - }); -}); diff --git a/ui/src/app/metadata/domain/service/provider.service.ts b/ui/src/app/metadata/domain/service/provider.service.ts deleted file mode 100644 index b48e8876f..000000000 --- a/ui/src/app/metadata/domain/service/provider.service.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; -import { Observable } from 'rxjs'; -import { map } from 'rxjs/operators'; - -import { MetadataProvider } from '../../domain/model'; -import API_BASE_PATH from '../../../app.constant'; - - -@Injectable() -export class MetadataProviderService { - - readonly endpoint = '/MetadataResolvers'; - readonly order = '/MetadataResolversPositionOrder'; - readonly base = API_BASE_PATH; - - constructor( - private http: HttpClient - ) {} - query(): Observable { - return this.http.get(`${this.base}${this.endpoint}`).pipe( - map(providers => providers.filter(p => p['@type'] !== 'BaseMetadataResolver')), - map(providers => providers.map(p => ({ ...p, id: p.resourceId }))) - ); - } - - find(id: string): Observable { - return this.http.get(`${this.base}${this.endpoint}/${id}`); - } - - update(provider: MetadataProvider): Observable { - return this.http.put(`${this.base}${this.endpoint}/${provider.resourceId}`, provider); - } - - save(provider: MetadataProvider): Observable { - return this.http.post(`${this.base}${this.endpoint}`, provider); - } - - getOrder(): Observable { - return this.http.get<{ [resourceIds: string]: string[] }>(`${this.base}${this.order}`).pipe( - map( - (order: {[resourceIds: string]: string[]}) => order.resourceIds - ) - ); - } - - setOrder(order: string[]): Observable { - return this.http.post(`${this.base}${this.order}`, { resourceIds: order }); - } -} diff --git a/ui/src/app/metadata/domain/service/resolver.service.spec.ts b/ui/src/app/metadata/domain/service/resolver.service.spec.ts deleted file mode 100644 index edace7e1f..000000000 --- a/ui/src/app/metadata/domain/service/resolver.service.spec.ts +++ /dev/null @@ -1,179 +0,0 @@ -import { TestBed, inject, waitForAsync } from '@angular/core/testing'; -import { HttpClientModule, HttpRequest } from '@angular/common/http'; -import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; -import { ResolverService } from './resolver.service'; -import API_BASE_PATH from '../../../app.constant'; - - -describe(`Resolver Service`, () => { - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - HttpClientModule, - HttpClientTestingModule - ], - providers: [ - ResolverService - ] - }); - }); - - describe('query', () => { - it(`should send an expected query request`, waitForAsync(inject([ResolverService, HttpTestingController], - (service: ResolverService, backend: HttpTestingController) => { - service.query().subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `${API_BASE_PATH}/EntityDescriptors` - && req.method === 'GET'; - }, `GET EntityDescriptors collection`); - } - ))); - - it(`should emit 'true' for 200 Ok`, waitForAsync(inject([ResolverService, HttpTestingController], - (service: ResolverService, backend: HttpTestingController) => { - service.query().subscribe((next) => { - expect(next).toBeTruthy(); - }); - - backend.expectOne(`${API_BASE_PATH}/EntityDescriptors`).flush(['foo'], { status: 200, statusText: 'Ok' }); - } - ))); - }); - - describe('queryForAdmin', () => { - it(`should send an expected query request`, waitForAsync(inject([ResolverService, HttpTestingController], - (service: ResolverService, backend: HttpTestingController) => { - service.queryForAdmin().subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `${API_BASE_PATH}/EntityDescriptor/disabledNonAdmin` - && req.method === 'GET'; - }, `GET EntityDescriptors collection for an admin`); - } - ))); - - it(`should emit 'true' for 200 Ok`, waitForAsync(inject([ResolverService, HttpTestingController], - (service: ResolverService, backend: HttpTestingController) => { - service.queryForAdmin().subscribe((next) => { - expect(next).toBeTruthy(); - }); - - backend.expectOne(`${API_BASE_PATH}/EntityDescriptor/disabledNonAdmin`).flush(['foo'], { status: 200, statusText: 'Ok' }); - } - ))); - }); - - describe('find', () => { - let id = 'foo'; - - it(`should send an expected GET request`, waitForAsync(inject([ResolverService, HttpTestingController], - (service: ResolverService, backend: HttpTestingController) => { - service.find(id).subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `${API_BASE_PATH}/EntityDescriptor/${id}` - && req.method === 'GET'; - }, `GET EntityDescriptor by id`); - } - ))); - }); - - describe('update', () => { - let id = 'foo', - serviceProviderName = 'Test Provider', - createdBy = 'admin'; - - it(`should send an expected PUT request`, waitForAsync(inject([ResolverService, HttpTestingController], - (service: ResolverService, backend: HttpTestingController) => { - service.update({id, serviceProviderName, createdBy}).subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `${ API_BASE_PATH }/EntityDescriptor/${id}` - && req.method === 'PUT'; - }, `PUT EntityDescriptor by id`); - } - ))); - }); - - describe('create', () => { - let id = 'foo', - serviceProviderName = 'Test Provider', - createdBy = 'admin'; - - it(`should send an expected POST request`, waitForAsync(inject([ResolverService, HttpTestingController], - (service: ResolverService, backend: HttpTestingController) => { - service.save({ id, serviceProviderName, createdBy }).subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `api/EntityDescriptor` - && req.method === 'POST'; - }, `POST new EntityDescriptor`); - } - ))); - }); - - describe('remove', () => { - let id = 'foo'; - - it(`should send an expected PUT request`, waitForAsync(inject([ResolverService, HttpTestingController], - (service: ResolverService, backend: HttpTestingController) => { - service.remove(id).subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `api/EntityDescriptor/${id}` - && req.method === 'DELETE'; - }, `DELETE an EntityDescriptor`); - } - ))); - }); - - describe('preview', () => { - let id = 'foo'; - - it(`should send an expected GET request`, waitForAsync(inject([ResolverService, HttpTestingController], - (service: ResolverService, backend: HttpTestingController) => { - service.preview(id).subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `api/EntityDescriptor/${id}` - && req.method === 'GET' - && req.headers.get('Accept') === 'application/xml' - && req.responseType === 'text'; - }, `GET an EntityDescriptor (xml)`); - } - ))); - }); - - describe('upload', () => { - it(`should send an expected POST request`, waitForAsync(inject([ResolverService, HttpTestingController], - (service: ResolverService, backend: HttpTestingController) => { - const name = 'foo', xml = ''; - service.upload(name, xml).subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `api/EntityDescriptor` - && req.method === 'POST' - && req.headers.get('Content-Type') === 'application/xml'; - }, `POST new EntityDescriptor`); - } - ))); - }); - - describe('createFromUrl', () => { - it(`should send an expected POST request`, waitForAsync(inject([ResolverService, HttpTestingController], - (service: ResolverService, backend: HttpTestingController) => { - const name = 'foo', url = 'http://goo.gle'; - service.createFromUrl(name, url).subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `api/EntityDescriptor` - && req.method === 'POST' - && req.headers.get('Content-Type') === 'application/x-www-form-urlencoded' - && req.body === `metadataUrl=${url}`; - }, `POST new EntityDescriptor`); - } - ))); - }); -}); diff --git a/ui/src/app/metadata/domain/service/resolver.service.ts b/ui/src/app/metadata/domain/service/resolver.service.ts deleted file mode 100644 index a29c7f0d7..000000000 --- a/ui/src/app/metadata/domain/service/resolver.service.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; -import { Observable, throwError, of } from 'rxjs'; -import { catchError } from 'rxjs/operators'; -import { MetadataResolver } from '../model'; -import API_BASE_PATH from '../../../app.constant'; - -@Injectable() -export class ResolverService { - - private endpoint = '/EntityDescriptor'; - private base = API_BASE_PATH; - - constructor( - private http: HttpClient - ) {} - - query(): Observable { - return this.http.get(`${ this.base }${ this.endpoint }s`, {}); - } - - queryForAdmin(): Observable { - return this.http.get(`${this.base}${this.endpoint}/disabledNonAdmin`, {}); - } - - find(id: string): Observable { - return this.http.get(`${ this.base }${ this.endpoint }/${ id }`); - } - - update(provider: MetadataResolver): Observable { - return this.http.put(`${this.base}${this.endpoint}/${provider.id}`, provider); - } - - save(provider: MetadataResolver): Observable { - const { id, ...p } = provider; - return this.http.post(`${this.base}${this.endpoint}`, p); - } - - remove(id: string): Observable { - return this.http.delete(`${this.base}${this.endpoint}/${id}`); - } - - upload(name: string, xml: string): Observable { - return this.http.post(`${this.base}${this.endpoint}`, xml, { - headers: new HttpHeaders().set('Content-Type', 'application/xml'), - params: new HttpParams().set('spName', name) - }).pipe(catchError(error => throwError({ - errorCode: error.status, - errorMessage: `Unable to upload file ... ${error.error.errorMessage}` - }))); - } - - createFromUrl(name: string, url: string): Observable { - let body = `metadataUrl=${url}`; - return this.http.post(`${this.base}${this.endpoint}`, body, { - headers: new HttpHeaders().set('Content-Type', 'application/x-www-form-urlencoded'), - params: new HttpParams().set('spName', name) - }).pipe(catchError(error => throwError( - { - errorCode: error.status, - errorMessage: `Unable to upload file ... ${error.error.errorMessage}` - } - ))); - } - - preview(id: string): Observable { - return this.http.get(`${this.base}${this.endpoint}/${id}`, { - headers: new HttpHeaders({ - 'Accept': 'application/xml' - }), - responseType: 'text' - }); - } -} diff --git a/ui/src/app/metadata/domain/source/SourceDefinition.js b/ui/src/app/metadata/domain/source/SourceDefinition.js new file mode 100644 index 000000000..c2e557c7a --- /dev/null +++ b/ui/src/app/metadata/domain/source/SourceDefinition.js @@ -0,0 +1,518 @@ +import defaults from 'lodash/defaults'; +import merge from 'lodash/merge'; +import toNumber from 'lodash/toNumber'; +import defaultsDeep from 'lodash/defaultsDeep'; +import API_BASE_PATH from '../../../App.constant'; +import {removeNull} from '../../../core/utility/remove_null'; +import { detailedDiff } from 'deep-object-diff'; + +export const SourceBase = { + label: 'Metadata Source', + type: '@MetadataProvider', + steps: [], + schema: `${API_BASE_PATH}/ui/MetadataSources`, + + parser: (data) => removeNull(data, true), + + formatter: (changes, schema) => changes, + + display: (changes) => changes, + + validator: (data = [], current = {id: null}) => { + + const sources = current ? data.filter(s => s.id !== current.id) : data; + const entityIds = sources.map(s => s.entityId); + + return (formData, errors) => { + if (entityIds.indexOf(formData.entityId) > -1) { + errors.entityId.addError('message.id-unique'); + } + + if (formData?.serviceProviderSsoDescriptor?.nameIdFormats?.length > 0 && !formData.serviceProviderSsoDescriptor.protocolSupportEnum) { + errors.serviceProviderSsoDescriptor.protocolSupportEnum.addError('message.protocol-support-required') + } + + return errors; + } + }, + + warnings: (data) => { + let warnings = {}; + if (!data?.relyingPartyOverrides?.signAssertion && data?.relyingPartyOverrides?.dontSignResponse) { + warnings = { + ...warnings, + 'relying-party': [ + ...(warnings.hasOwnProperty('relying-party') ? warnings['relying-party'] : []), + 'message.invalid-signing' + ] + }; + } + return warnings; + }, + + bindings: (original, formData) => { + + let d = { ...formData }; + + if (formData.assertionConsumerServices && formData.assertionConsumerServices.length) { + const { updated, added } = detailedDiff(original.assertionConsumerServices, formData.assertionConsumerServices); + const merged = merge(updated, added); + const changingDefault = Object.keys(merged).some(k => merged[k].hasOwnProperty('makeDefault')); + if (changingDefault) { + const settingToTrue = Object.keys(merged).some(k => merged[k].makeDefault === true); + if (settingToTrue) { + d.assertionConsumerServices = d.assertionConsumerServices.map((s, i) => ({ + ...s, + makeDefault: i === toNumber(Object.keys(merged)[0]) + })); + } + } + } + + if (formData?.securityInfo?.x509Certificates) { + if (formData.securityInfo.x509Certificates?.length > 0) { + d.securityInfo.x509CertificateAvailable = true; + } else { + d.securityInfo.x509CertificateAvailable = false; + } + } + + return d; + }, + + uiSchema: { + 'ui:order': ['serviceProviderName', '*'], + layout: { + groups: [ + { + size: 6, + fields: [ + 'serviceProviderName', + 'entityId', + 'serviceEnabled', + 'organization' + ] + }, + { + size: 6, + fields: [ + 'contacts' + ], + }, + { + size: 12, + fields: [ + 'mdui' + ], + }, + { + size: 6, + fields: [ + 'serviceProviderSsoDescriptor' + ], + }, + { + size: 6, + fields: [ + 'logoutEndpoints' + ], + }, + { + size: 12, + fields: [ + 'securityInfo' + ], + }, + { + size: 6, + fields: [ + 'assertionConsumerServices' + ], + }, + { + size: 6, + fields: [ + 'relyingPartyOverrides' + ], + }, + { + size: 6, + fields: [ + 'attributeRelease' + ], + } + ] + }, + contacts: { + "ui:options": { + orderable: false + }, + type: 'contact', + "ui:title": false + }, + attributeRelease: { + 'ui:widget': 'AttributeReleaseWidget' + }, + logoutEndpoints: { + type: 'endpoint', + "ui:options": { + orderable: false + }, + "ui:title": false + }, + assertionConsumerServices: { + type: 'service', + "ui:options": { + orderable: false + }, + "ui:title": false + }, + relyingPartyOverrides: { + nameIdFormats: { + "ui:options": { + orderable: false + }, + items: { + 'ui:widget': 'OptionWidget' + } + }, + authenticationMethods: { + "ui:options": { + orderable: false + }, + items: { + 'ui:widget': 'OptionWidget' + } + } + }, + serviceProviderSsoDescriptor: { + protocolSupportEnum: { + 'ui:placeholder': 'label.select-protocol' + }, + nameIdFormats: { + "ui:options": { + orderable: false + }, + items: { + 'ui:widget': 'OptionWidget' + } + } + }, + securityInfo: { + layout: { + groups: [ + { + size: 6, + fields: [ + 'authenticationRequestsSigned', + 'wantAssertionsSigned', + 'x509Certificates' + ], + } + ] + }, + x509CertificateAvailable: { + 'ui:widget': 'hidden' + }, + authenticationRequestsSigned: { + 'ui:widget': 'radio', + 'ui:options': { + inline: true + } + }, + wantAssertionsSigned: { + 'ui:widget': 'radio', + 'ui:options': { + inline: true + } + }, + x509Certificates: { + type: 'certificate', + "ui:options": { + orderable: false + }, + items: { + type: { + 'ui:widget': 'radio', + "ui:description": false, + 'ui:options': { + inline: true + } + }, + value: { + 'ui:widget': 'textarea' + } + } + } + }, + mdui: { + layout: { + groups: [ + { + size: 6, + fields: [ + "displayName", + "informationUrl", + "description" + ], + }, + { + size: 6, + fields: [ + "privacyStatementUrl", + "logoUrl", + "logoWidth", + "logoHeight" + ] + } + ] + }, + description: { + 'ui:widget': 'textarea' + }, + logoHeight: { + 'ui:widget': 'updown' + }, + logoWidth: { + 'ui:widget': 'updown' + } + } + } +} + +export const SourceEditor = { + ...SourceBase, + uiSchema: defaultsDeep({}, SourceBase.uiSchema), + steps: [ + { + index: 1, + id: 'common', + label: 'label.sp-org-info', + fields: [ + 'serviceProviderName', + 'entityId', + 'serviceEnabled', + 'organization', + 'contacts' + ] + }, + { + index: 3, + id: 'metadata-ui', + label: 'label.metadata-ui', + fields: [ + 'mdui' + ] + }, + { + index: 4, + id: 'descriptor-info', + label: 'label.descriptor-info', + fields: [ + 'serviceProviderSsoDescriptor' + ] + }, + { + index: 5, + id: 'logout-endpoints', + label: 'label.logout-endpoints', + fields: [ + 'logoutEndpoints' + ] + }, + { + index: 6, + id: 'key-info', + label: 'label.key-info', + fields: [ + 'securityInfo' + ] + }, + { + index: 7, + id: 'assertion', + label: 'label.assertion', + fields: [ + 'assertionConsumerServices' + ] + }, + { + index: 8, + id: 'relying-party', + label: 'label.relying-party', + fields: [ + 'relyingPartyOverrides' + ] + }, + { + index: 9, + id: 'attribute', + label: 'label.attribute-release', + fields: [ + 'attributeRelease' + ] + } + ] +}; + +export const SourceWizard = { + ...SourceEditor, + uiSchema: defaults({ + layout: { + groups: [ + { + size: 6, + classNames: 'bg-light border rounded px-4 pt-4 pb-3', + fields: [ + 'serviceProviderName', + 'entityId' + ] + }, + { + size: 6, + fields: [ + 'organization', + ], + }, + { + size: 6, + fields: [ + 'contacts' + ], + }, + { + size: 12, + fields: [ + 'mdui' + ], + }, + { + size: 6, + fields: [ + 'serviceProviderSsoDescriptor' + ], + }, + { + size: 6, + fields: [ + 'logoutEndpoints' + ], + }, + { + size: 12, + fields: [ + 'securityInfo' + ], + }, + { + size: 6, + fields: [ + 'assertionConsumerServices' + ], + }, + { + size: 6, + fields: [ + 'relyingPartyOverrides' + ], + }, + { + size: 6, + fields: [ + 'attributeRelease' + ], + }, + { + size: 6, + fields: [ + 'serviceEnabled' + ] + } + ] + } + }, SourceBase.uiSchema), + steps: [ + { + index: 1, + id: 'common', + label: 'label.name-and-entity-id', + fields: [ + 'serviceProviderName', + 'entityId' + ] + }, + { + index: 2, + id: 'org-info', + label: 'label.org-info', + fields: [ + 'organization', + 'contacts' + ] + }, + { + index: 3, + id: 'metadata-ui', + label: 'label.metadata-ui', + fields: [ + 'mdui' + ] + }, + { + index: 4, + id: 'descriptor-info', + label: 'label.descriptor-info', + fields: [ + 'serviceProviderSsoDescriptor' + ] + }, + { + index: 5, + id: 'logout-endpoints', + label: 'label.logout-endpoints', + fields: [ + 'logoutEndpoints' + ] + }, + { + index: 6, + id: 'key-info', + label: 'label.key-info', + fields: [ + 'securityInfo' + ] + }, + { + index: 7, + id: 'assertion', + label: 'label.assertion', + fields: [ + 'assertionConsumerServices' + ] + }, + { + index: 8, + id: 'relying-party', + label: 'label.relying-party', + fields: [ + 'relyingPartyOverrides' + ] + }, + { + index: 9, + id: 'attribute', + label: 'label.attribute-release', + fields: [ + 'attributeRelease' + ] + }, + { + index: 10, + id: 'summary', + label: 'label.finished', + fields: [ + 'serviceEnabled' + ] + } + ] +} \ No newline at end of file diff --git a/ui/src/app/metadata/domain/source/SourceDefinition.test.js b/ui/src/app/metadata/domain/source/SourceDefinition.test.js new file mode 100644 index 000000000..130cb1110 --- /dev/null +++ b/ui/src/app/metadata/domain/source/SourceDefinition.test.js @@ -0,0 +1,15 @@ +import { SourceBase } from './SourceDefinition'; + +describe('SourceDefinition', () => { + describe('parser', () => { + it('should remove null values', () => { + expect(SourceBase.parser({ + foo: null, + bar: 'baz', + baz: { + bar: null + } + })).toEqual({bar: 'baz'}); + }); + }) +}); \ No newline at end of file diff --git a/ui/src/app/metadata/domain/source/component/DeleteSourceConfirmation.js b/ui/src/app/metadata/domain/source/component/DeleteSourceConfirmation.js new file mode 100644 index 000000000..848e97c63 --- /dev/null +++ b/ui/src/app/metadata/domain/source/component/DeleteSourceConfirmation.js @@ -0,0 +1,64 @@ +import React from 'react'; + +import Modal from 'react-bootstrap/Modal'; +import Button from 'react-bootstrap/Button'; + +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons'; + +import { useMetadataEntity } from '../../../hooks/api'; +import Translate from '../../../../i18n/components/translate'; +import { noop } from 'lodash'; + +import { useIsAdmin } from '../../../../core/user/UserContext'; + +export function DeleteSourceConfirmation ({children}) { + + const { del, response } = useMetadataEntity('source'); + + const cb = React.useRef(null); + + const [deleting, setDeleting] = React.useState(null); + + const onConfirm = (id, cb = () => {}) => { + deleteSource(deleting); + setDeleting(null); + } + + const onDeleteSource = (id, onComplete) => { + setDeleting(id); + cb.current = onComplete; + }; + + async function deleteSource(id) { + await del(`/${id}`); + if (response.ok) { + cb.current && typeof cb.current === 'function' ? cb.current() : noop(); + } + } + + const isAdmin = useIsAdmin(); + + return ( + <> + {children(isAdmin ? onDeleteSource : false)} + setDeleting(null)}> + Delete Metadata Source? + + +

+ You are deleting a metadata source. This cannot be undone. Continue? +

+
+ + {' '} + + +
+ + ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/domain/source/component/SourceList.js b/ui/src/app/metadata/domain/source/component/SourceList.js new file mode 100644 index 000000000..41e2c7adb --- /dev/null +++ b/ui/src/app/metadata/domain/source/component/SourceList.js @@ -0,0 +1,94 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; +import Badge from 'react-bootstrap/Badge'; +import Popover from 'react-bootstrap/Popover'; +import Button from 'react-bootstrap/Button'; +import OverlayTrigger from 'react-bootstrap/OverlayTrigger'; + +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { faTrash, faCheck } from '@fortawesome/free-solid-svg-icons'; + +import FormattedDate from '../../../../core/components/FormattedDate'; +import Translate from '../../../../i18n/components/translate'; +import { Scroller } from '../../../../dashboard/component/Scroller'; +import { DeleteSourceConfirmation } from './DeleteSourceConfirmation'; + +export default function SourceList({ entities, onDelete, onEnable }) { + return ( + + {(onDeleteSource) => + + {(limited) => +
+ + + + + + + + + + {onDeleteSource && } + + + + {limited.map((source, idx) => + + + + + + + + + {onDeleteSource && } + + )} + +
TitleEntity IDAuthorCreated DateEnabled
+ {source.serviceProviderName} + + {source.entityId} + + {source.createdBy} + + {onEnable ? + + : + + + + } + + + A metadata source must be disabled before it can be deleted. + + }> + + + + +
+
+ } +
+ } +
+ ); +} diff --git a/ui/src/app/metadata/domain/transform.js b/ui/src/app/metadata/domain/transform.js new file mode 100644 index 000000000..1a3f3f973 --- /dev/null +++ b/ui/src/app/metadata/domain/transform.js @@ -0,0 +1,25 @@ +const invisErrors = ['const', 'oneOf']; + +export const transformErrors = (errors) => { + + let list = [ + ...errors.filter(e => invisErrors.indexOf(e.name) === -1) + ].map(e => { + if (e.name === 'pattern') { + if (e.property.includes('email')) { + e.message = 'message.valid-email'; + } else { + e.message = 'message.valid-duration'; + } + } + + if (e.name === 'type') { + if (e.message === 'should be string') { + e.message = 'message.required' + } + } + return e; + }); + + return list; +} \ No newline at end of file diff --git a/ui/src/app/metadata/domain/utility/configuration.ts b/ui/src/app/metadata/domain/utility/configuration.ts deleted file mode 100644 index 2d5572cb4..000000000 --- a/ui/src/app/metadata/domain/utility/configuration.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { Property } from '../model/property'; - -export function getDefinition(path: string, definitions: any): any { - let def = path.split('/').pop(); - return definitions[def]; -} - -export function getPropertyItemSchema(items: any, definitions: any): any { - if (!items) { return null; } - return items.$ref ? getDefinition(items.$ref, definitions) : items; -} - -export function getStepProperty(property, model, definitions): Property { - if (!property) { return null; } - property = property.$ref ? { ...property, ...getDefinition(property.$ref, definitions) } : property; - return { - name: property.title, - value: model, - type: property.type, - items: getPropertyItemSchema(property.items, definitions), - properties: getStepProperties( - property, - model, - definitions - ), - widget: property.widget instanceof String ? { id: property.widget } : { ...property.widget } - }; -} - - -export function getStepProperties(schema: any, model: any, definitions: any = {}): Property[] { - if (!schema || !schema.properties) { return []; } - return Object - .keys(schema.properties) - .map(property => { - return { - ...getStepProperty( - schema.properties[property], - model && model.hasOwnProperty(property) ? model[property] : null, - definitions - ), - id: property - }; - }); -} diff --git a/ui/src/app/metadata/editor/MetadataAttributeEditor.js b/ui/src/app/metadata/editor/MetadataAttributeEditor.js new file mode 100644 index 000000000..9c13e2a5f --- /dev/null +++ b/ui/src/app/metadata/editor/MetadataAttributeEditor.js @@ -0,0 +1,54 @@ +import React from 'react'; +import { MetadataFormContext, setFormDataAction, setFormErrorAction } from '../hoc/MetadataFormContext'; +import { MetadataDefinitionContext, MetadataSchemaContext } from '../hoc/MetadataSchema'; + +import Form from '@rjsf/bootstrap-4'; + +import { fields, widgets } from '../../form/component'; +import { templates } from '../../form/component'; + +function ErrorListTemplate() { + return (<>); +} + +export function MetadataAttributeEditor({ children }) { + + const definition = React.useContext(MetadataDefinitionContext); + const schema = React.useContext(MetadataSchemaContext); + + const { state, dispatch } = React.useContext(MetadataFormContext); + const { metadata, errors } = state; + + const onChange = (changes) => { + dispatch(setFormDataAction(changes.formData)); + dispatch(setFormErrorAction(changes.errors)); + // setBlocking(true); + }; + + return ( +
+
+ {children(metadata, errors)} +
+
+
+
+
onChange(form)} + schema={schema} + uiSchema={definition.uiSchema} + FieldTemplate={templates.FieldTemplate} + ObjectFieldTemplate={templates.ObjectFieldTemplate} + ArrayFieldTemplate={templates.ArrayFieldTemplate} + fields={fields} + widgets={widgets} + liveValidate={true} + ErrorList={ErrorListTemplate}> + <> +
+
+
+
+ ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/editor/MetadataEditor.js b/ui/src/app/metadata/editor/MetadataEditor.js new file mode 100644 index 000000000..c38766404 --- /dev/null +++ b/ui/src/app/metadata/editor/MetadataEditor.js @@ -0,0 +1,191 @@ +import React from 'react'; +import { faCogs, faExclamationTriangle, faSave, faSpinner } from '@fortawesome/free-solid-svg-icons'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { useHistory, useParams, Prompt } from 'react-router'; +import Button from 'react-bootstrap/Button'; +import Alert from 'react-bootstrap/Alert'; + +import Translate from '../../i18n/components/translate'; +import { MetadataFormContext, setFormDataAction, setFormErrorAction } from '../hoc/MetadataFormContext'; +import { MetadataDefinitionContext, MetadataSchemaContext } from '../hoc/MetadataSchema'; + +import { MetadataEditorForm } from './MetadataEditorForm'; +import { MetadataEditorNav } from './MetadataEditorNav'; +import { getMetadataPath, useMetadataEntities, useMetadataUpdater } from '../hooks/api'; +import { NavLink } from 'react-router-dom'; +import { useTranslator } from '../../i18n/hooks'; +import API_BASE_PATH from '../../App.constant'; +import { MetadataObjectContext } from '../hoc/MetadataSelector'; +import { FilterableProviders } from '../domain/provider'; +import { checkChanges } from '../hooks/utility'; + +export function MetadataEditor ({ current }) { + + const translator = useTranslator(); + + const { type, id, section } = useParams(); + + const { update, loading } = useMetadataUpdater(`${ API_BASE_PATH }${getMetadataPath(type)}`, current); + + const { data } = useMetadataEntities(type, {}, []); + const history = useHistory(); + const definition = React.useContext(MetadataDefinitionContext); + const schema = React.useContext(MetadataSchemaContext); + const base = React.useContext(MetadataObjectContext); + + const { state, dispatch } = React.useContext(MetadataFormContext); + const { metadata, errors } = state; + const onChange = (changes) => { + dispatch(setFormDataAction(changes.formData)); + dispatch(setFormErrorAction(changes.errors)); + setBlocking(checkChanges(metadata, changes.formData)); + }; + + function save(metadata) { + update(`/${id}`, definition.parser(metadata, base)) + .then(() => { + gotoDetail({ refresh: true }); + }) + .catch(err => { + window.location.reload(); + }); + }; + + const cancel = () => { + setBlocking(false); + setTimeout(() => gotoDetail()); + }; + + const gotoDetail = (state = null) => { + setBlocking(false); + history.push(`/metadata/${type}/${id}`, state); + }; + + const onNavigate = (path) => { + const resetBlock = blocking; + setBlocking(false); + setTimeout(() => { + history.push(path); + setBlocking(resetBlock); + }); + // setBlocking(resetBlock); + }; + + const [blocking, setBlocking] = React.useState(false); + + const validator = definition.validator(data, current); + + const warnings = definition.warnings && definition.warnings(metadata); + + const canFilter = FilterableProviders.indexOf(definition.type) > -1; + + return ( +
+ + `message.unsaved-editor` + } + /> +
+
+
+
+ +   + Edit metadata {type} - {metadata.serviceProviderName || metadata.name} + +
+
+
+
+
+
+ + {canFilter && + + } + +
+
+ +   + +
+
+ {warnings && warnings.hasOwnProperty(section) && + + {warnings[section].map((w, widx) => +

+ + +

+ )} +
+ } + {errors.length > 0 && + +

+ + +

+
+ } +
+
+
+
+
+ + {canFilter && + + } + +
+
+ {definition && schema && metadata && + + } +
+
+
+
+
+ ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/editor/MetadataEditorForm.js b/ui/src/app/metadata/editor/MetadataEditorForm.js new file mode 100644 index 000000000..cf38c108a --- /dev/null +++ b/ui/src/app/metadata/editor/MetadataEditorForm.js @@ -0,0 +1,73 @@ +import React from 'react'; + +import Form from '@rjsf/bootstrap-4'; +import FormCheck from 'react-bootstrap/FormCheck'; + +import { fields, widgets } from '../../form/component'; +import { templates } from '../../form/component'; +import { useUiSchema } from '../hooks/schema'; +import Alert from 'react-bootstrap/Alert'; + +import { transformErrors } from '../domain/transform'; + +function ErrorListTemplate () { + return (<>); +} + +export function MetadataEditorForm({ metadata, definition, schema, current, onChange, validator }) { + + const [locked, setLocked] = React.useState(true); + + const {uiSchema, step} = useUiSchema(definition, schema, current, locked); + + const [data, setData] = React.useState(metadata); + + React.useEffect(() => setData(metadata), [metadata, definition]); + + const onSubmit = () => {}; + + const onFormChange = (form) => { + onChange(definition.bindings ? { ...form, formData: definition.bindings(data, form.formData) }: form); + }; + + return ( + <> + {step.locked &&
+
+
+ + setLocked(!locked)} + size="lg" + /> + For Advanced Knowledge Only + +
+
+
} +
+
onFormChange(form)} + onSubmit={() => onSubmit()} + schema={schema} + uiSchema={uiSchema} + FieldTemplate={templates.FieldTemplate} + ObjectFieldTemplate={templates.ObjectFieldTemplate} + ArrayFieldTemplate={templates.ArrayFieldTemplate} + fields={fields} + widgets={widgets} + liveValidate={true} + transformErrors={transformErrors} + ErrorList={ErrorListTemplate} + validate={validator}> + <> +
+ +
+ + ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/editor/MetadataEditorNav.js b/ui/src/app/metadata/editor/MetadataEditorNav.js new file mode 100644 index 000000000..bfae1bb73 --- /dev/null +++ b/ui/src/app/metadata/editor/MetadataEditorNav.js @@ -0,0 +1,79 @@ +import React from 'react'; +import { faBars } from '@fortawesome/free-solid-svg-icons'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import Dropdown from 'react-bootstrap/Dropdown'; +import Button from 'react-bootstrap/Button'; + +import Translate from '../../i18n/components/translate'; +// import { usePagesWithErrors } from '../hoc/MetadataFormContext'; + +export function MetadataEditorNav ({ definition, current, children, format = 'tabs', onNavigate }) { + + const [routes, setRoutes] = React.useState([]); + const [active, setActive] = React.useState(null); + + // const errors = usePagesWithErrors(definition); + + React.useEffect(() => { + setRoutes(definition ? definition.steps.map(step => ({ path: step.id, label: step.label })) : []) + }, [definition]); + + React.useEffect(() => { + setActive(definition ? definition.steps.find(s => s.id === current)?.label : null); + }, [current, definition]); + + return ( + + {format === 'dropdown' ? + + +   + + + + {routes.map((route, idx) => + + )} + {children && + + + {children} + + } + + + : + + +
+ +
+ } + +
+ ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/editor/MetadataFilterEditor.js b/ui/src/app/metadata/editor/MetadataFilterEditor.js new file mode 100644 index 000000000..85e41755e --- /dev/null +++ b/ui/src/app/metadata/editor/MetadataFilterEditor.js @@ -0,0 +1,99 @@ +import React from 'react'; +import { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { useParams } from 'react-router'; +import Alert from 'react-bootstrap/Alert'; + +import Translate from '../../i18n/components/translate'; +import { MetadataFormContext, setFormDataAction, setFormErrorAction } from '../hoc/MetadataFormContext'; +import { MetadataDefinitionContext, MetadataSchemaContext } from '../hoc/MetadataSchema'; + +import { MetadataEditorForm } from './MetadataEditorForm'; +import { MetadataEditorNav } from './MetadataEditorNav'; +import { useMetadataFilters } from '../hooks/api'; +import { MetadataFilterContext } from '../hoc/MetadataFilterSelector'; +import { checkChanges } from '../hooks/utility'; + +export function MetadataFilterEditor({children, onNavigate, block}) { + + const { id, section } = useParams(); + + const { data } = useMetadataFilters(id, {}, []); + const definition = React.useContext(MetadataDefinitionContext); + const schema = React.useContext(MetadataSchemaContext); + const current = React.useContext(MetadataFilterContext); + + const { state, dispatch } = React.useContext(MetadataFormContext); + const { metadata, errors } = state; + + const onChange = (changes) => { + dispatch(setFormDataAction(changes.formData)); + dispatch(setFormErrorAction(changes.errors)); + block(checkChanges(metadata, changes.formData)); + }; + + const validator = definition.validator(data, current); + + const warnings = definition.warnings && definition.warnings(metadata); + + return ( +
+
+
+ + +
+
+ {children(metadata, errors.length > 0)} +
+
0 ? 'justify-content-between' : 'justify-content-end'}`}> + {errors.length > 0 && + +

+
+ } + {errors.length === 0 && warnings && warnings.hasOwnProperty(section) && + + {warnings[section].map((w, widx) => +

+ + +

+ )} +
+ } +
+
+
+
+
+ + +
+
+ {definition && schema && metadata && + + } +
+
+
+ ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/editor/MetadataFilterList.js b/ui/src/app/metadata/editor/MetadataFilterList.js new file mode 100644 index 000000000..9b71f6ee5 --- /dev/null +++ b/ui/src/app/metadata/editor/MetadataFilterList.js @@ -0,0 +1,110 @@ +import React from 'react'; +import { faArrowLeft, faCogs, faPlus } from '@fortawesome/free-solid-svg-icons'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { useHistory, useParams } from 'react-router'; + +import Translate from '../../i18n/components/translate'; +import { MetadataDefinitionContext, MetadataSchemaContext } from '../hoc/MetadataSchema'; + +import { MetadataEditorNav } from './MetadataEditorNav'; +import { MetadataFilterEditorList } from '../domain/filter/component/MetadataFilterEditorList'; +import { MetadataFilters } from '../domain/filter/component/MetadataFilters'; +import { MetadataFilterTypes } from '../domain/filter'; +import { Link, NavLink } from 'react-router-dom'; +import { MetadataObjectContext } from '../hoc/MetadataSelector'; +import { useTranslator } from '../../i18n/hooks'; + +export function MetadataFilterList() { + + const { type, id, section } = useParams(); + + const translator = useTranslator(); + + const history = useHistory(); + const definition = React.useContext(MetadataDefinitionContext); + const schema = React.useContext(MetadataSchemaContext); + const current = React.useContext(MetadataObjectContext); + + const onNavigate = (path) => { + history.push(`../edit/${path}`); + }; + + return ( +
+
+
+
+
+ +   + Edit metadata {type} - {current.name} + +
+
+
+
+
+ +   + Return to Provider + +
+ + + + + +
+
+ +   + Add Filter + +
+
+
+
+
+ + + + + +
+
+ {definition && schema && current && + + {(filters, onUpdate, onDelete, loading) => + + } + + } +
+
+
+
+
+ ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/filter/action/collection.action.ts b/ui/src/app/metadata/filter/action/collection.action.ts deleted file mode 100644 index 8c14693e2..000000000 --- a/ui/src/app/metadata/filter/action/collection.action.ts +++ /dev/null @@ -1,240 +0,0 @@ -import { Action } from '@ngrx/store'; -import { Update } from '@ngrx/entity'; - -import { MetadataFilter } from '../../domain/model/metadata-filter'; - -export enum FilterCollectionActionTypes { - SELECT_FILTER_REQUEST = '[Metadata Filter Collection] Select Filter Request', - SELECT_FILTER_SUCCESS = '[Metadata Filter Collection] Select Filter Success', - SELECT_FILTER_FAIL = '[Metadata Filter Collection] Select Filter Fail', - - UPDATE_FILTER_REQUEST = '[Metadata Filter Collection] Update Filter Request', - UPDATE_FILTER_SUCCESS = '[Metadata Filter Collection] Update Filter Success', - UPDATE_FILTER_FAIL = '[Metadata Filter Collection] Update Filter Fail', - UPDATE_FILTER_CONFLICT = '[Metadata Filter Collection] Update Filter Conflict', - - LOAD_FILTER_REQUEST = '[Metadata Filter Collection] Load Filter Request', - LOAD_FILTER_SUCCESS = '[Metadata Filter Collection] Load Filter Success', - LOAD_FILTER_ERROR = '[Metadata Filter Collection] Load Filter Error', - - ADD_FILTER_REQUEST = '[Metadata Filter Collection] Add Filter Request', - ADD_FILTER_SUCCESS = '[Metadata Filter Collection] Add Filter Success', - ADD_FILTER_FAIL = '[Metadata Filter Collection] Add Filter Fail', - - REMOVE_FILTER_REQUEST = '[Metadata Filter Collection] Remove Filter Request', - REMOVE_FILTER_SUCCESS = '[Metadata Filter Collection] Remove Filter Success', - REMOVE_FILTER_FAIL = '[Metadata Filter Collection] Remove Filter Fail', - - CLEAR_FILTERS = '[Metadata Filter Collection] Clear Filters', - - SET_ORDER_FILTER_REQUEST = '[Metadata Filter Collection] Set Order Filter Request', - SET_ORDER_FILTER_SUCCESS = '[Metadata Filter Collection] Set Order Filter Success', - SET_ORDER_FILTER_FAIL = '[Metadata Filter Collection] Set Order Filter Fail', - - GET_ORDER_FILTER_REQUEST = '[Metadata Filter Collection] Get Order Filter Request', - GET_ORDER_FILTER_SUCCESS = '[Metadata Filter Collection] Get Order Filter Success', - GET_ORDER_FILTER_FAIL = '[Metadata Filter Collection] Get Order Filter Fail', - - CHANGE_FILTER_ORDER_UP = '[Metadata Filter Collection] Change Order Up', - CHANGE_FILTER_ORDER_DOWN = '[Metadata Filter Collection] Change Order Down' - -} - -export class SelectFilter implements Action { - readonly type = FilterCollectionActionTypes.SELECT_FILTER_REQUEST; - - constructor(public payload: string) { } -} - -export class SelectFilterSuccess implements Action { - readonly type = FilterCollectionActionTypes.SELECT_FILTER_SUCCESS; - - constructor(public payload: MetadataFilter) { } -} - -export class SelectFilterFail implements Action { - readonly type = FilterCollectionActionTypes.SELECT_FILTER_FAIL; - - constructor(public payload: Error) { } -} - -export class LoadFilterRequest implements Action { - readonly type = FilterCollectionActionTypes.LOAD_FILTER_REQUEST; - - constructor(public payload: string) { } -} - -export class LoadFilterSuccess implements Action { - readonly type = FilterCollectionActionTypes.LOAD_FILTER_SUCCESS; - - constructor(public payload: MetadataFilter[]) { } -} - -export class LoadFilterError implements Action { - readonly type = FilterCollectionActionTypes.LOAD_FILTER_ERROR; - - constructor(public payload: any) { } -} - -export class UpdateFilterRequest implements Action { - readonly type = FilterCollectionActionTypes.UPDATE_FILTER_REQUEST; - - constructor(public payload: { - filter: MetadataFilter, - providerId: string; - }) { } -} - -export class UpdateFilterSuccess implements Action { - readonly type = FilterCollectionActionTypes.UPDATE_FILTER_SUCCESS; - - constructor(public payload: { - providerId: string, - update: Update - }) { } -} - -export class UpdateFilterFail implements Action { - readonly type = FilterCollectionActionTypes.UPDATE_FILTER_FAIL; - - constructor(public payload: any) { } -} - -export class UpdateFilterConflict implements Action { - readonly type = FilterCollectionActionTypes.UPDATE_FILTER_CONFLICT; - - constructor(public payload: { - providerId: string, - filter: MetadataFilter - }) { } -} - -export class AddFilterRequest implements Action { - readonly type = FilterCollectionActionTypes.ADD_FILTER_REQUEST; - - constructor(public payload: { - filter: MetadataFilter, - providerId: string - }) { } -} - -export class AddFilterSuccess implements Action { - readonly type = FilterCollectionActionTypes.ADD_FILTER_SUCCESS; - - constructor(public payload: { - filter: MetadataFilter, - providerId: string - }) { } -} - -export class AddFilterFail implements Action { - readonly type = FilterCollectionActionTypes.ADD_FILTER_FAIL; - - constructor(public payload: any) { } -} - -export class RemoveFilterRequest implements Action { - readonly type = FilterCollectionActionTypes.REMOVE_FILTER_REQUEST; - - constructor(public payload: string) { } -} - -export class RemoveFilterSuccess implements Action { - readonly type = FilterCollectionActionTypes.REMOVE_FILTER_SUCCESS; - - constructor(public payload: string) { } -} - -export class RemoveFilterFail implements Action { - readonly type = FilterCollectionActionTypes.REMOVE_FILTER_FAIL; - - constructor(public error: Error) { } -} - -export class ClearFilters implements Action { - readonly type = FilterCollectionActionTypes.CLEAR_FILTERS; -} - -export class SetOrderFilterRequest implements Action { - readonly type = FilterCollectionActionTypes.SET_ORDER_FILTER_REQUEST; - - constructor(public payload: { - order: string[], - providerId: string - }) { } -} - -export class SetOrderFilterSuccess implements Action { - readonly type = FilterCollectionActionTypes.SET_ORDER_FILTER_SUCCESS; - - constructor(public payload: string) { } -} - -export class SetOrderFilterFail implements Action { - readonly type = FilterCollectionActionTypes.SET_ORDER_FILTER_FAIL; - - constructor(public payload: Error) { } -} - -export class GetOrderFilterRequest implements Action { - readonly type = FilterCollectionActionTypes.GET_ORDER_FILTER_REQUEST; - - constructor() { } -} - -export class GetOrderFilterSuccess implements Action { - readonly type = FilterCollectionActionTypes.GET_ORDER_FILTER_SUCCESS; - - constructor(public payload: string[]) { } -} - -export class GetOrderFilterFail implements Action { - readonly type = FilterCollectionActionTypes.GET_ORDER_FILTER_FAIL; - - constructor(public payload: Error) { } -} - -export class ChangeFilterOrderUp implements Action { - readonly type = FilterCollectionActionTypes.CHANGE_FILTER_ORDER_UP; - - constructor(public payload: { - id: string, - providerId: string - }) { } -} - -export class ChangeFilterOrderDown implements Action { - readonly type = FilterCollectionActionTypes.CHANGE_FILTER_ORDER_DOWN; - - constructor(public payload: { - id: string, - providerId: string - }) { } -} - -export type FilterCollectionActionsUnion = - | LoadFilterRequest - | LoadFilterSuccess - | LoadFilterError - | AddFilterRequest - | AddFilterSuccess - | AddFilterFail - | RemoveFilterRequest - | RemoveFilterSuccess - | RemoveFilterFail - | SelectFilter - | SelectFilterSuccess - | SelectFilterFail - | UpdateFilterRequest - | UpdateFilterSuccess - | UpdateFilterFail - | UpdateFilterConflict - | ClearFilters - | ChangeFilterOrderDown - | ChangeFilterOrderUp - | GetOrderFilterRequest - | GetOrderFilterSuccess - | GetOrderFilterFail - | SetOrderFilterRequest - | SetOrderFilterSuccess - | SetOrderFilterFail; diff --git a/ui/src/app/metadata/filter/action/editor.action.ts b/ui/src/app/metadata/filter/action/editor.action.ts deleted file mode 100644 index 7ea0a867b..000000000 --- a/ui/src/app/metadata/filter/action/editor.action.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Action } from '@ngrx/store'; - -export enum EditorActionTypes { - UPDATE_STATUS = '[Filter Editor] Update Status', - CLEAR = '[Filter Editor] Clear' -} - -export class UpdateStatus implements Action { - readonly type = EditorActionTypes.UPDATE_STATUS; - - constructor(public payload: { [key: string]: string }) { } -} - -export class ClearEditor implements Action { - readonly type = EditorActionTypes.CLEAR; -} - -export type EditorActionUnion = - | UpdateStatus - | ClearEditor; diff --git a/ui/src/app/metadata/filter/action/filter.action.spec.ts b/ui/src/app/metadata/filter/action/filter.action.spec.ts deleted file mode 100644 index 921f12385..000000000 --- a/ui/src/app/metadata/filter/action/filter.action.spec.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { FilterActionTypes, CancelCreateFilter, SelectId } from './filter.action'; - -describe('Filter Actions', () => { - it('should provide actions', () => { - expect(new CancelCreateFilter('id').type).toBe(FilterActionTypes.CANCEL_CREATE_FILTER); - expect(new SelectId('foo').type).toBe(FilterActionTypes.SELECT_ID); - }); -}); diff --git a/ui/src/app/metadata/filter/action/filter.action.ts b/ui/src/app/metadata/filter/action/filter.action.ts deleted file mode 100644 index b13e2ee8f..000000000 --- a/ui/src/app/metadata/filter/action/filter.action.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { Action } from '@ngrx/store'; -import { MetadataFilter } from '../../domain/model/metadata-filter'; -import { MDUI } from '../../domain/model'; - -export enum FilterActionTypes { - SELECT_ID = '[Filter] Select Entity ID', - SELECT_FILTER_TYPE = '[Filter] Select Filter Type', - UPDATE_FILTER = '[Filter] Update Filter', - CANCEL_CREATE_FILTER = '[Filter] Cancel Create Filter', - CLEAR_FILTER = '[Filter] Clear Filter', - LOAD_ENTITY_PREVIEW = '[Filter] Load Preview data', - LOAD_ENTITY_PREVIEW_SUCCESS = '[Filter] Load Preview data success', - LOAD_ENTITY_PREVIEW_ERROR = '[Filter] Load Preview data error', - - RESET_CHANGES = '[Filter] Reset Changes' -} - -export class SelectId implements Action { - readonly type = FilterActionTypes.SELECT_ID; - - constructor(public payload: string) { } -} - -export class LoadEntityPreview implements Action { - readonly type = FilterActionTypes.LOAD_ENTITY_PREVIEW; - - constructor(public payload: string) { } -} -export class LoadEntityPreviewSuccess implements Action { - readonly type = FilterActionTypes.LOAD_ENTITY_PREVIEW_SUCCESS; - - constructor(public payload: MDUI) { } -} -export class LoadEntityPreviewError implements Action { - readonly type = FilterActionTypes.LOAD_ENTITY_PREVIEW_ERROR; - - constructor(public payload: string) { } -} - -export class CancelCreateFilter implements Action { - readonly type = FilterActionTypes.CANCEL_CREATE_FILTER; - - constructor(public payload: string) { } -} - -export class ClearFilter implements Action { - readonly type = FilterActionTypes.CLEAR_FILTER; -} - -export class UpdateFilterChanges implements Action { - readonly type = FilterActionTypes.UPDATE_FILTER; - - constructor(public payload: Partial) { } -} - -export class SelectFilterType implements Action { - readonly type = FilterActionTypes.SELECT_FILTER_TYPE; - - constructor(public payload: string) { } -} - -export class ResetChanges implements Action { - readonly type = FilterActionTypes.RESET_CHANGES; -} - -export type FilterActionsUnion = - | SelectId - | SelectFilterType - | UpdateFilterChanges - | CancelCreateFilter - | LoadEntityPreview - | LoadEntityPreviewSuccess - | LoadEntityPreviewError - | ClearFilter - | ResetChanges; diff --git a/ui/src/app/metadata/filter/action/search.action.spec.ts b/ui/src/app/metadata/filter/action/search.action.spec.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/ui/src/app/metadata/filter/action/search.action.ts b/ui/src/app/metadata/filter/action/search.action.ts deleted file mode 100644 index cd9638a54..000000000 --- a/ui/src/app/metadata/filter/action/search.action.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { Action } from '@ngrx/store'; - -import { QueryParams } from '../../../core/model/query'; - -export enum SearchActionTypes { - QUERY_ENTITY_IDS = '[Filter] Query Entity Ids', - VIEW_MORE_IDS = '[Filter] View More Ids Modal', - CANCEL_VIEW_MORE = '[Filter] Cancel View More', - CLEAR_SEARCH = '[Filter] Clear Search', - LOAD_ENTITY_IDS_SUCCESS = '[Entity ID Collection] Load Entity Ids Success', - LOAD_ENTITY_IDS_ERROR = '[Entity ID Collection] Load Entity Ids Error' -} - -export class QueryEntityIds implements Action { - readonly type = SearchActionTypes.QUERY_ENTITY_IDS; - - constructor(public payload: QueryParams) { } -} - -export class ViewMoreIds implements Action { - readonly type = SearchActionTypes.VIEW_MORE_IDS; - - constructor(public payload: string) { } -} - -export class ClearSearch implements Action { - readonly type = SearchActionTypes.CLEAR_SEARCH; -} - -export class CancelViewMore implements Action { - readonly type = SearchActionTypes.CANCEL_VIEW_MORE; -} - -export class LoadEntityIdsSuccess implements Action { - readonly type = SearchActionTypes.LOAD_ENTITY_IDS_SUCCESS; - - constructor(public payload: string[]) { } -} - -export class LoadEntityIdsError implements Action { - readonly type = SearchActionTypes.LOAD_ENTITY_IDS_ERROR; - - constructor(public payload: Error) { } -} - -export type SearchActionsUnion = - | ViewMoreIds - | CancelViewMore - | ClearSearch - | LoadEntityIdsSuccess - | LoadEntityIdsError - | QueryEntityIds; diff --git a/ui/src/app/metadata/filter/component/filter-list.component.html b/ui/src/app/metadata/filter/component/filter-list.component.html deleted file mode 100644 index 780b16a69..000000000 --- a/ui/src/app/metadata/filter/component/filter-list.component.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - -
Filter NameFilter TypeEnabled?EditDelete
-
- - -
-
{{ i + 1 }}{{ filter.name }}{{ filter['@type'] }} -
-
- - -
- -
-
- - - Edit - - - -
\ No newline at end of file diff --git a/ui/src/app/metadata/filter/component/filter-list.component.scss b/ui/src/app/metadata/filter/component/filter-list.component.scss deleted file mode 100644 index e1a2e17b9..000000000 --- a/ui/src/app/metadata/filter/component/filter-list.component.scss +++ /dev/null @@ -1,17 +0,0 @@ -:host { - .table { - .td-sm { - max-width: 100px; - } - .td-xs { - max-width: 20px; - } - .td-lg { - width: 30%; - } - - td { - vertical-align: middle; - } - } -} \ No newline at end of file diff --git a/ui/src/app/metadata/filter/component/filter-list.component.spec.ts b/ui/src/app/metadata/filter/component/filter-list.component.spec.ts deleted file mode 100644 index 44cc812cb..000000000 --- a/ui/src/app/metadata/filter/component/filter-list.component.spec.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { FilterListComponent } from './filter-list.component'; -import { RouterModule } from '@angular/router'; - -describe('Filter List Component', () => { - let fixture: ComponentFixture; - let instance: FilterListComponent; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [], - imports: [ - RouterModule - ], - declarations: [ - FilterListComponent - ], - }); - - fixture = TestBed.createComponent(FilterListComponent); - instance = fixture.componentInstance; - }); - - it('should compile', () => { - fixture.detectChanges(); - - expect(fixture).toBeDefined(); - expect(instance).toBeDefined(); - }); -}); diff --git a/ui/src/app/metadata/filter/component/filter-list.component.ts b/ui/src/app/metadata/filter/component/filter-list.component.ts deleted file mode 100644 index 4335c865f..000000000 --- a/ui/src/app/metadata/filter/component/filter-list.component.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Component, Input, Output, EventEmitter } from '@angular/core'; -import { MetadataFilter } from '../../domain/model'; - -import {} from '../../filter/action/collection.action'; -import { NAV_FORMATS } from '../../domain/component/editor-nav.component'; - -@Component({ - selector: 'filter-list', - templateUrl: './filter-list.component.html', - styleUrls: ['./filter-list.component.scss'] -}) -export class FilterListComponent { - - @Input() filters: MetadataFilter[]; - @Input() disabled: boolean; - - @Output() onUpdateOrderUp: EventEmitter = new EventEmitter(); - @Output() onUpdateOrderDown: EventEmitter = new EventEmitter(); - @Output() onRemove: EventEmitter = new EventEmitter(); - @Output() onToggleEnabled: EventEmitter = new EventEmitter(); - - formats = NAV_FORMATS; - - constructor() {} -} diff --git a/ui/src/app/metadata/filter/component/search-dialog.component.html b/ui/src/app/metadata/filter/component/search-dialog.component.html deleted file mode 100644 index 032f056d5..000000000 --- a/ui/src/app/metadata/filter/component/search-dialog.component.html +++ /dev/null @@ -1,54 +0,0 @@ -
- - - -
diff --git a/ui/src/app/metadata/filter/component/search-dialog.component.scss b/ui/src/app/metadata/filter/component/search-dialog.component.scss deleted file mode 100644 index 543de14e3..000000000 --- a/ui/src/app/metadata/filter/component/search-dialog.component.scss +++ /dev/null @@ -1,6 +0,0 @@ -:host { - .scrolled { - max-height: 400px; - overflow: scroll; - } -} \ No newline at end of file diff --git a/ui/src/app/metadata/filter/component/search-dialog.component.spec.ts b/ui/src/app/metadata/filter/component/search-dialog.component.spec.ts deleted file mode 100644 index 325c74dbf..000000000 --- a/ui/src/app/metadata/filter/component/search-dialog.component.spec.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { NgbModalModule, NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; -import { SearchDialogComponent } from './search-dialog.component'; -import { NgbActiveModalStub } from '../../../../testing/modal.stub'; -import * as fromFilter from '../reducer'; -import { SharedModule } from '../../../shared/shared.module'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; - -describe('Search Dialog', () => { - let fixture: ComponentFixture; - let store: Store; - let instance: SearchDialogComponent; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - { provide: NgbActiveModal, useClass: NgbActiveModalStub } - ], - imports: [ - ReactiveFormsModule, - NgbModalModule, - StoreModule.forRoot({ - 'filter': combineReducers(fromFilter.reducers), - }), - SharedModule, - MockI18nModule - ], - declarations: [ - SearchDialogComponent - ], - }); - - fixture = TestBed.createComponent(SearchDialogComponent); - instance = fixture.componentInstance; - - store = TestBed.get(Store); - - spyOn(store, 'dispatch').and.callThrough(); - }); - - it('should compile', () => { - fixture.detectChanges(); - - expect(fixture).toBeDefined(); - }); - - describe('search method', () => { - it('should dispatch a search action', () => { - fixture.detectChanges(); - instance.search('foo'); - expect(store.dispatch).toHaveBeenCalled(); - }); - - it('should dispatch a search action with the default string if not provided', () => { - fixture.detectChanges(); - instance.search(); - expect(store.dispatch).toHaveBeenCalled(); - }); - }); -}); diff --git a/ui/src/app/metadata/filter/component/search-dialog.component.ts b/ui/src/app/metadata/filter/component/search-dialog.component.ts deleted file mode 100644 index 545684077..000000000 --- a/ui/src/app/metadata/filter/component/search-dialog.component.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { Component, AfterViewInit, Input, OnInit, SimpleChange, SimpleChanges } from '@angular/core'; -import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; -import { Observable } from 'rxjs'; - -import { Store } from '@ngrx/store'; - -import * as fromFilter from '../reducer'; -import { QueryEntityIds } from '../action/search.action'; -import { FormBuilder, FormGroup, Validators } from '@angular/forms'; - -@Component({ - selector: 'search-dialog', - templateUrl: './search-dialog.component.html', - styleUrls: ['./search-dialog.component.scss'] -}) -export class SearchDialogComponent implements OnInit, AfterViewInit { - - @Input() term: string; - @Input() source = 'InCommon'; - - matches$: Observable; - loading$: Observable; - - selected: string; - - limit = 100; - dbounce = 500; - - form: FormGroup = this.fb.group({ - search: ['', [Validators.minLength(4)]], - entityId: [''] - }); - - constructor( - public activeModal: NgbActiveModal, - private store: Store, - private fb: FormBuilder - ) { - this.matches$ = this.store.select(fromFilter.getEntityCollection); - } - - ngOnInit(): void { - let search = this.form.get('search'); - search.setValue(this.term); - } - - ngAfterViewInit(): void { - const { term, limit } = this; - this.store.dispatch(new QueryEntityIds({ term, limit })); - } - - search(term: string = ''): void { - this.store.dispatch(new QueryEntityIds({ term, limit: this.limit })); - } -} /* istanbul ignore next */ diff --git a/ui/src/app/metadata/filter/container/edit-filter-step.component.html b/ui/src/app/metadata/filter/container/edit-filter-step.component.html deleted file mode 100644 index ad969fd9e..000000000 --- a/ui/src/app/metadata/filter/container/edit-filter-step.component.html +++ /dev/null @@ -1,16 +0,0 @@ - -
- - - {{ lock.value ? 'Locked' : 'Unlocked' }} - - For Advanced Knowledge Only -
- -
\ No newline at end of file diff --git a/ui/src/app/metadata/filter/container/edit-filter-step.component.ts b/ui/src/app/metadata/filter/container/edit-filter-step.component.ts deleted file mode 100644 index 963add6bf..000000000 --- a/ui/src/app/metadata/filter/container/edit-filter-step.component.ts +++ /dev/null @@ -1,141 +0,0 @@ -import { ChangeDetectorRef, Component, OnDestroy } from '@angular/core'; -import { Store } from '@ngrx/store'; -import { Subject, Observable, Subscription } from 'rxjs'; - -import * as fromFilter from '../reducer'; -import { FormDefinition, WizardStep } from '../../../wizard/model'; -import { MetadataFilter } from '../../domain/model'; -import { SchemaService } from '../../../schema-form/service/schema.service'; -import { UpdateFilterChanges } from '../action/filter.action'; -import { PreviewEntity } from '../../domain/action/entity.action'; -import { map, withLatestFrom, filter, takeUntil, distinctUntilChanged, skip } from 'rxjs/operators'; -import * as fromWizard from '../../../wizard/reducer'; -import { LockEditor, UnlockEditor } from '../../../wizard/action/wizard.action'; -import { UpdateStatus } from '../action/editor.action'; - -@Component({ - selector: 'edit-filter-step-page', - templateUrl: './edit-filter-step.component.html' -}) -export class EditFilterStepComponent implements OnDestroy { - - private ngUnsubscribe: Subject = new Subject(); - - valueChangeSubject = new Subject>(); - private valueChangeEmitted$ = this.valueChangeSubject.asObservable(); - - statusChangeSubject = new Subject<{ value: any[] }>(); - private statusChangeEmitted$ = this.statusChangeSubject.asObservable(); - - definition$: Observable>; - definition: FormDefinition; - schema$: Observable; - bindings$: Observable; - - model$: Observable; - isSaving$: Observable; - filter: MetadataFilter; - isValid: boolean; - type$: Observable; - - validators$: Observable<{ [key: string]: any }>; - status$: Observable; - step$: Observable; - - actions: any; - - defSub: Subscription; - currentPage: string; - - constructor( - private store: Store, - private ref: ChangeDetectorRef - ) { - this.definition$ = this.store.select(fromWizard.getWizardDefinition).pipe(filter(d => !!d)); - - this.defSub = this.definition$.subscribe(d => this.definition = d); - - this.schema$ = this.store.select(fromWizard.getSchema); - this.bindings$ = this.definition$.pipe(map(d => d.bindings)); - - this.step$ = this.store.select(fromWizard.getCurrent); - - this.step$.subscribe(s => { - if (s && s.locked) { - this.store.dispatch(new LockEditor()); - } else { - this.store.dispatch(new UnlockEditor()); - } - }); - - this.isSaving$ = this.store.select(fromFilter.getCollectionSaving); - this.model$ = this.store.select(fromFilter.getSelectedFilter); - this.type$ = this.model$.pipe(map(f => f && f.hasOwnProperty('@type') ? f['@type'] : '')); - - this.valueChangeEmitted$.pipe(takeUntil(this.ngUnsubscribe)).subscribe(changes => this.store.dispatch(new UpdateFilterChanges(changes.value))); - - this.statusChangeEmitted$ - .pipe( - skip(1), - takeUntil(this.ngUnsubscribe), - withLatestFrom(this.model$), - distinctUntilChanged() - ) - .subscribe(([errors, model]) => { - this.updateStatus(errors); - }); - - this.status$ = this.store.select(fromFilter.getInvalidEditorForms); - - this.status$.pipe(takeUntil(this.ngUnsubscribe)).subscribe(() => { - this.ref.detach(); - setTimeout(() => { - this.ref.detectChanges(); - this.ref.reattach(); - }, 250); - }) - - this.validators$ = this.store.select(fromFilter.getFilterNames).pipe( - takeUntil(this.ngUnsubscribe), - withLatestFrom( - this.store.select(fromFilter.getSelectedFilter), - this.definition$ - ), - map(([names, provider, definition]) => definition.getValidators( - names.filter(n => n !== provider.name) - )) - ); - - this.store - .select(fromFilter.getFilter) - .pipe(takeUntil(this.ngUnsubscribe)) - .subscribe(filter => this.filter = filter); - - this.actions = { - preview: (property: any, parameters: any) => { - this.preview(parameters.filterId); - } - }; - - this.store.select(fromWizard.getWizardIndex).pipe(takeUntil(this.ngUnsubscribe)).subscribe(i => this.currentPage = i); - } - - updateStatus(errors: any): void { - const status = { [this.currentPage]: !(errors.value) ? 'VALID' : 'INVALID' }; - this.store.dispatch(new UpdateStatus(status)); - } - - ngOnDestroy(): void { - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - this.defSub.unsubscribe(); - } - - preview(id: string): void { - this.store.dispatch(new PreviewEntity({ - id, - entity: this.definition.getEntity(this.filter) - })); - } -} - diff --git a/ui/src/app/metadata/filter/container/edit-filter.component.html b/ui/src/app/metadata/filter/container/edit-filter.component.html deleted file mode 100644 index 394c27aea..000000000 --- a/ui/src/app/metadata/filter/container/edit-filter.component.html +++ /dev/null @@ -1,54 +0,0 @@ -
-
-
-
-
- -    - - Edit Filter – {{ type$ | async }} - - -
-
-
-
-
-
-
-
- - -
-
-
- -   - -
-
-
-
-
- - -
-
- -
-
-
-
-
-
diff --git a/ui/src/app/metadata/filter/container/edit-filter.component.spec.ts b/ui/src/app/metadata/filter/container/edit-filter.component.spec.ts deleted file mode 100644 index 9d7e31a46..000000000 --- a/ui/src/app/metadata/filter/container/edit-filter.component.spec.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { ReactiveFormsModule, FormBuilder } from '@angular/forms'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; -import * as fromFilter from '../reducer'; -import * as fromWizard from '../../../wizard/reducer'; -import { ProviderStatusEmitter, ProviderValueEmitter } from '../../domain/service/provider-change-emitter.service'; -import { NgbPopoverModule, NgbPopoverConfig } from '@ng-bootstrap/ng-bootstrap'; -import { NavigatorService } from '../../../core/service/navigator.service'; -import { SharedModule } from '../../../shared/shared.module'; -import { EditFilterComponent } from './edit-filter.component'; -import { SchemaFormModule } from 'ngx-schema-form'; -import { SchemaService } from '../../../schema-form/service/schema.service'; -import { HttpClientModule } from '@angular/common/http'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { MetadataFilterTypes } from '../model'; -import { RouterTestingModule } from '@angular/router/testing'; -import { ActivatedRouteStub } from '../../../../testing/activated-route.stub'; -import { ActivatedRoute } from '@angular/router'; - -describe('Edit Metadata Filter Page', () => { - let fixture: ComponentFixture; - let store: Store; - let instance: EditFilterComponent; - - let activatedRoute: ActivatedRouteStub = new ActivatedRouteStub(); - activatedRoute.testParamMap = { providerId: 'foo' }; - let child: ActivatedRouteStub = new ActivatedRouteStub(); - child.testParamMap = { form: 'common' }; - activatedRoute.firstChild = child; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - ProviderStatusEmitter, - ProviderValueEmitter, - FormBuilder, - NgbPopoverConfig, - NavigatorService, - SchemaService, - { - provide: ActivatedRoute, useValue: activatedRoute - } - ], - imports: [ - StoreModule.forRoot({ - 'filter': combineReducers(fromFilter.reducers), - 'wizard': combineReducers(fromWizard.reducers) - }), - ReactiveFormsModule, - NgbPopoverModule, - SharedModule, - HttpClientModule, - SchemaFormModule.forRoot(), - MockI18nModule - ], - declarations: [ - EditFilterComponent - ], - }); - - fixture = TestBed.createComponent(EditFilterComponent); - instance = fixture.componentInstance; - store = TestBed.get(Store); - - spyOn(store, 'dispatch'); - }); - - it('should compile', () => { - fixture.detectChanges(); - - expect(fixture).toBeDefined(); - }); - - describe('cancel method', () => { - it('should dispatch a cancel changes action', () => { - fixture.detectChanges(); - instance.cancel('foo'); - expect(store.dispatch).toHaveBeenCalled(); - }); - }); - - describe('preview method', () => { - it('should dispatch a preview action', () => { - fixture.detectChanges(); - instance.definition = MetadataFilterTypes.EntityAttributes; - instance.preview('foo'); - expect(store.dispatch).toHaveBeenCalled(); - }); - }); -}); diff --git a/ui/src/app/metadata/filter/container/edit-filter.component.ts b/ui/src/app/metadata/filter/container/edit-filter.component.ts deleted file mode 100644 index 1df2ac5d6..000000000 --- a/ui/src/app/metadata/filter/container/edit-filter.component.ts +++ /dev/null @@ -1,114 +0,0 @@ -import { Component, OnDestroy } from '@angular/core'; -import { Store } from '@ngrx/store'; -import { Subject, Observable, Subscription, combineLatest } from 'rxjs'; - -import * as fromFilter from '../reducer'; -import { FormDefinition } from '../../../wizard/model'; -import { MetadataFilter } from '../../domain/model'; -import { UpdateFilterRequest } from '../action/collection.action'; -import { CancelCreateFilter } from '../action/filter.action'; -import { PreviewEntity } from '../../domain/action/entity.action'; -import { NAV_FORMATS } from '../../domain/component/editor-nav.component'; -import { map, filter, takeUntil, withLatestFrom, skip } from 'rxjs/operators'; -import * as fromWizard from '../../../wizard/reducer'; -import { ActivatedRoute } from '@angular/router'; -import { LoadSchemaRequest, SetIndex } from '../../../wizard/action/wizard.action'; - -@Component({ - selector: 'edit-filter-page', - templateUrl: './edit-filter.component.html' -}) -export class EditFilterComponent implements OnDestroy { - - private ngUnsubscribe: Subject = new Subject(); - - definition$: Observable>; - definition: FormDefinition; - schema$: Observable; - - model$: Observable; - isSaving$: Observable; - filter: MetadataFilter; - isValid$: Observable; - isInvalid$: Observable; - cantSave$: Observable; - type$: Observable; - - status$: Observable; - - actions: any; - - defSub: Subscription; - - formats = NAV_FORMATS; - providerId: string; - - constructor( - private store: Store, - private route: ActivatedRoute - ) { - - this.definition$ = this.store.select(fromWizard.getWizardDefinition).pipe(filter(d => !!d)) - - this.defSub = this.definition$.subscribe(d => this.definition = d); - - this.providerId = this.route.snapshot.params.providerId; - - this.store - .select(fromWizard.getCurrentWizardSchema) - .pipe(filter(s => !!s), takeUntil(this.ngUnsubscribe)) - .subscribe(s => { - if (s) { - this.store.dispatch(new LoadSchemaRequest(s)); - } - }); - - let startIndex$ = this.route.firstChild.params.pipe(map(p => p.form || 'filters')); - startIndex$.subscribe(index => this.store.dispatch(new SetIndex(index))); - - this.isSaving$ = this.store.select(fromFilter.getCollectionSaving); - this.model$ = this.store.select(fromFilter.getSelectedFilter); - this.type$ = this.model$.pipe(map(f => f && f.hasOwnProperty('@type') ? f['@type'] : '')); - - this.status$ = this.store.select(fromFilter.getInvalidEditorForms); - - this.isValid$ = this.store.select(fromFilter.getFilterIsValid); - this.isInvalid$ = this.isValid$.pipe(map(v => !v)); - this.cantSave$ = this.store.select(fromFilter.cantSaveFilter).pipe(skip(1)); - - this.store - .select(fromFilter.getFilter) - .subscribe(filter => this.filter = filter); - - this.actions = { - preview: (property: any, parameters: any) => { - this.preview(parameters.filterId); - } - }; - } - - ngOnDestroy(): void { - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - this.defSub.unsubscribe(); - } - - save(id: string): void { - this.store.dispatch(new UpdateFilterRequest({ - filter: this.filter, - providerId: id - })); - } - - cancel(id: string): void { - this.store.dispatch(new CancelCreateFilter(id)); - } - - preview(id: string): void { - this.store.dispatch(new PreviewEntity({ - id, - entity: this.definition.getEntity(this.filter) - })); - } -} - diff --git a/ui/src/app/metadata/filter/container/filter.component.html b/ui/src/app/metadata/filter/container/filter.component.html deleted file mode 100644 index eb3040a74..000000000 --- a/ui/src/app/metadata/filter/container/filter.component.html +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/ui/src/app/metadata/filter/container/filter.component.spec.ts b/ui/src/app/metadata/filter/container/filter.component.spec.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/ui/src/app/metadata/filter/container/filter.component.ts b/ui/src/app/metadata/filter/container/filter.component.ts deleted file mode 100644 index bd6054990..000000000 --- a/ui/src/app/metadata/filter/container/filter.component.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { Component, OnDestroy } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { Observable, Subscription } from 'rxjs'; -import { distinctUntilChanged, filter, map } from 'rxjs/operators'; -import { Store } from '@ngrx/store'; - -import { MetadataFilter } from '../../domain/model/metadata-filter'; -import { LoadFilterRequest } from '../action/collection.action'; -import * as fromFilter from '../reducer'; -import * as fromProviders from '../../provider/reducer'; -import { SelectProviderRequest } from '../../provider/action/collection.action'; -import { MetadataProvider } from '../../domain/model'; - -@Component({ - selector: 'filter-page', - templateUrl: './filter.component.html', - styleUrls: [], - providers: [] -}) -export class FilterComponent implements OnDestroy { - filterSelectSubscription: Subscription; - filters$: Observable; - provider$: Observable; - - constructor( - private store: Store, - private route: ActivatedRoute - ) { - const params$ = this.route.params.pipe(distinctUntilChanged()); - - this.filterSelectSubscription = params$.pipe( - map(params => new LoadFilterRequest(params.providerId)) - ).subscribe(this.store); - } - - ngOnDestroy() { - this.filterSelectSubscription.unsubscribe(); - } -} /* istanbul ignore next */ diff --git a/ui/src/app/metadata/filter/container/new-filter-step.component.html b/ui/src/app/metadata/filter/container/new-filter-step.component.html deleted file mode 100644 index f8d748c37..000000000 --- a/ui/src/app/metadata/filter/container/new-filter-step.component.html +++ /dev/null @@ -1,15 +0,0 @@ - -
- - - {{ lock.value ? 'Locked' : 'Unlocked' }} - - For Advanced Knowledge Only -
- -
\ No newline at end of file diff --git a/ui/src/app/metadata/filter/container/new-filter-step.component.ts b/ui/src/app/metadata/filter/container/new-filter-step.component.ts deleted file mode 100644 index a927b5d8c..000000000 --- a/ui/src/app/metadata/filter/container/new-filter-step.component.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { Component, OnDestroy, OnInit } from '@angular/core'; -import { Store } from '@ngrx/store'; -import { FormBuilder } from '@angular/forms'; -import { Subject, Observable } from 'rxjs'; - -import { takeUntil, shareReplay, withLatestFrom, map, switchMap, filter, distinctUntilChanged } from 'rxjs/operators'; - - -import * as fromFilter from '../reducer'; -import { FormDefinition, WizardStep } from '../../../wizard/model'; -import { MetadataFilter } from '../../domain/model'; -import { SchemaService } from '../../../schema-form/service/schema.service'; -import { UpdateFilterChanges } from '../action/filter.action'; -import { ActivatedRoute } from '@angular/router'; -import * as fromWizard from '../../../wizard/reducer'; -import { SetIndex } from '../../../wizard/action/wizard.action'; -import { UpdateStatus } from '../action/editor.action'; - -@Component({ - selector: 'new-filter-step-page', - templateUrl: './new-filter-step.component.html' -}) -export class NewFilterStepComponent implements OnDestroy, OnInit { - - private ngUnsubscribe: Subject = new Subject(); - - valueChangeSubject = new Subject>(); - private valueChangeEmitted$ = this.valueChangeSubject.asObservable(); - - statusChangeSubject = new Subject<{ value: any[] }>(); - private statusChangeEmitted$ = this.statusChangeSubject.asObservable(); - - definition$: Observable>; - schema$: Observable; - - changes$: Observable; - isSaving$: Observable; - filter: MetadataFilter; - - validators$: Observable<{ [key: string]: any }>; - - options$: Observable[]>; - - step$: Observable; - - currentPage: string; - - constructor( - private store: Store, - private schemaService: SchemaService, - private fb: FormBuilder, - private route: ActivatedRoute - ) { - this.isSaving$ = this.store.select(fromFilter.getCollectionSaving); - this.changes$ = this.store.select(fromFilter.getFilter); - this.step$ = this.store.select(fromWizard.getCurrent); - this.definition$ = this.store.select(fromWizard.getWizardDefinition).pipe(filter(d => !!d)); - this.schema$ = this.store.select(fromWizard.getSchema); - - this.validators$ = this.definition$.pipe( - takeUntil(this.ngUnsubscribe), - withLatestFrom(this.store.select(fromFilter.getFilterNames)), - map(([definition, names]) => definition.getValidators(names)) - ); - - let startIndex$ = this.route.params.pipe(map(p => p.form || 'filters')); - startIndex$.subscribe(index => this.store.dispatch(new SetIndex(index))); - } - - ngOnInit(): void { - this.valueChangeEmitted$ - .pipe(takeUntil(this.ngUnsubscribe)) - .subscribe(changes => this.store.dispatch(new UpdateFilterChanges(changes.value))); - this.statusChangeEmitted$ - .pipe( - takeUntil(this.ngUnsubscribe), - distinctUntilChanged() - ) - .subscribe(errors => { - this.updateStatus(errors); - }); - - this.store - .select(fromFilter.getFilter) - .pipe( - takeUntil(this.ngUnsubscribe), - withLatestFrom(this.definition$), - map(([filter, definition]) => definition.parser(filter)) - ) - .subscribe(filter => this.filter = filter); - - this.store.select(fromWizard.getWizardIndex).subscribe(i => this.currentPage = i); - } - - updateStatus(errors: any): void { - const status = { [this.currentPage]: !(errors.value) ? 'VALID' : 'INVALID' }; - this.store.dispatch(new UpdateStatus(status)); - } - - ngOnDestroy(): void { - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - } -} diff --git a/ui/src/app/metadata/filter/container/new-filter.component.html b/ui/src/app/metadata/filter/container/new-filter.component.html deleted file mode 100644 index 3976b1ff9..000000000 --- a/ui/src/app/metadata/filter/container/new-filter.component.html +++ /dev/null @@ -1,63 +0,0 @@ -
-
-
-
-
- -    - New Filter - -
-
-
-
-
-
-
-
- - -
-
-
- -   - -
-
-
-
-
- - -
-
- -
-
-
-
-
-
\ No newline at end of file diff --git a/ui/src/app/metadata/filter/container/new-filter.component.spec.ts b/ui/src/app/metadata/filter/container/new-filter.component.spec.ts deleted file mode 100644 index 18c7e067e..000000000 --- a/ui/src/app/metadata/filter/container/new-filter.component.spec.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { ReactiveFormsModule, FormBuilder } from '@angular/forms'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; -import { NewFilterComponent } from './new-filter.component'; -import * as fromFilter from '../reducer'; -import * as fromWizard from '../../../wizard/reducer'; -import { ProviderStatusEmitter, ProviderValueEmitter } from '../../domain/service/provider-change-emitter.service'; -import { NgbPopoverModule, NgbPopoverConfig } from '@ng-bootstrap/ng-bootstrap'; -import { NavigatorService } from '../../../core/service/navigator.service'; -import { SharedModule } from '../../../shared/shared.module'; -import { SchemaFormModule, WidgetRegistry, DefaultWidgetRegistry } from 'ngx-schema-form'; -import { SchemaService } from '../../../schema-form/service/schema.service'; -import { HttpClientModule } from '@angular/common/http'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { RouterTestingModule } from '@angular/router/testing'; -import { ActivatedRoute } from '@angular/router'; -import { ActivatedRouteStub } from '../../../../testing/activated-route.stub'; - -describe('New Metadata Filter Page', () => { - let fixture: ComponentFixture; - let store: Store; - let instance: NewFilterComponent; - - let activatedRoute: ActivatedRouteStub = new ActivatedRouteStub(); - activatedRoute.testParamMap = { providerId: 'foo' }; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - ProviderStatusEmitter, - ProviderValueEmitter, - FormBuilder, - NgbPopoverConfig, - NavigatorService, - SchemaService, - { provide: WidgetRegistry, useClass: DefaultWidgetRegistry }, - { - provide: ActivatedRoute, useValue: activatedRoute - } - ], - imports: [ - StoreModule.forRoot({ - 'filter': combineReducers(fromFilter.reducers), - 'wizard': combineReducers(fromWizard.reducers) - }), - ReactiveFormsModule, - NgbPopoverModule, - SharedModule, - HttpClientModule, - SchemaFormModule.forRoot(), - MockI18nModule, - RouterTestingModule - ], - declarations: [ - NewFilterComponent - ], - }); - - fixture = TestBed.createComponent(NewFilterComponent); - instance = fixture.componentInstance; - store = TestBed.get(Store); - - spyOn(store, 'dispatch').and.callThrough(); - }); - - it('should compile', () => { - fixture.detectChanges(); - - expect(fixture).toBeDefined(); - }); - - describe('cancel method', () => { - it('should dispatch a cancel changes action', () => { - fixture.detectChanges(); - instance.cancel(); - expect(store.dispatch).toHaveBeenCalled(); - }); - }); -}); diff --git a/ui/src/app/metadata/filter/container/new-filter.component.ts b/ui/src/app/metadata/filter/container/new-filter.component.ts deleted file mode 100644 index 51907707a..000000000 --- a/ui/src/app/metadata/filter/container/new-filter.component.ts +++ /dev/null @@ -1,127 +0,0 @@ -import { Component, OnDestroy, OnInit } from '@angular/core'; -import { Store } from '@ngrx/store'; -import { Validators, FormBuilder, FormGroup } from '@angular/forms'; -import { Subject, Observable, of, combineLatest } from 'rxjs'; -import { ActivatedRoute } from '@angular/router'; -import { takeUntil, withLatestFrom, map, filter, distinctUntilChanged, skip } from 'rxjs/operators'; - -import * as fromFilter from '../reducer'; -import { MetadataFilterEditorTypes, MetadataFilterTypes } from '../model'; -import { FormDefinition } from '../../../wizard/model'; -import { MetadataFilter } from '../../domain/model'; -import { AddFilterRequest } from '../action/collection.action'; -import { CancelCreateFilter, SelectFilterType } from '../action/filter.action'; -import * as fromWizard from '../../../wizard/reducer'; -import { LoadSchemaRequest, SetDefinition, SetIndex } from '../../../wizard/action/wizard.action'; -import { NAV_FORMATS } from '../../domain/component/editor-nav.component'; - -@Component({ - selector: 'new-filter-page', - templateUrl: './new-filter.component.html' -}) -export class NewFilterComponent implements OnDestroy, OnInit { - - private ngUnsubscribe: Subject = new Subject(); - - definition$: Observable>; - schema$: Observable; - - isSaving$: Observable; - filter: MetadataFilter; - isValid$: Observable; - isInvalid$: Observable; - cantSave$: Observable; - - validators$: Observable<{ [key: string]: any }>; - - form: FormGroup = this.fb.group({ - type: ['', Validators.required] - }); - - options$: Observable[]>; - - formats = NAV_FORMATS; - - status$: Observable; - - type$: Observable = this.store.select(fromFilter.getFilterType); - - constructor( - private store: Store, - private fb: FormBuilder, - private route: ActivatedRoute - ) { - this.isSaving$ = this.store.select(fromFilter.getCollectionSaving); - this.isValid$ = this.store.select(fromFilter.getFilterIsValid); - this.isInvalid$ = this.isValid$.pipe(map(v => !v)); - - this.cantSave$ = this.store.select(fromFilter.cantSaveFilter).pipe(skip(1)); - - this.definition$ = this.store.select(fromFilter.getFilterType).pipe( - takeUntil(this.ngUnsubscribe), - filter(t => !!t), - map(t => MetadataFilterTypes[t]) - ); - - this.store - .select(fromWizard.getCurrentWizardSchema) - .pipe(filter(s => !!s), takeUntil(this.ngUnsubscribe)) - .subscribe(s => { - if (s) { - this.store.dispatch(new LoadSchemaRequest(s)); - } - }); - - let startIndex$ = this.route.params.pipe(map(p => p.form || 'filters'), takeUntil(this.ngUnsubscribe)); - startIndex$.subscribe(index => this.store.dispatch(new SetIndex(index))); - - this.status$ = this.store.select(fromFilter.getInvalidEditorForms); - this.options$ = of(Object.values(MetadataFilterTypes)); - - this.form.get('type').valueChanges - .pipe( - takeUntil(this.ngUnsubscribe), - distinctUntilChanged() - ) - .subscribe(type => { - this.store.dispatch(new SelectFilterType(type)); - }); - - this.type$.pipe( - takeUntil(this.ngUnsubscribe) - ).subscribe((t: string) => { - if (t) { - this.store.dispatch(new SetDefinition({ - ...MetadataFilterEditorTypes.find(def => def.type === t) - })); - } - }); - } - - ngOnInit(): void { - this.store - .select(fromFilter.getFilter) - .pipe( - takeUntil(this.ngUnsubscribe), - withLatestFrom(this.definition$), - map(([filter, definition]) => definition.parser(filter)) - ) - .subscribe(filter => this.filter = filter); - } - - ngOnDestroy(): void { - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - } - - save(): void { - this.store.dispatch(new AddFilterRequest({ - filter: this.filter, - providerId: this.route.snapshot.params.providerId - })); - } - - cancel(): void { - this.store.dispatch(new CancelCreateFilter(this.route.snapshot.params.providerId)); - } -} diff --git a/ui/src/app/metadata/filter/container/select-filter.component.html b/ui/src/app/metadata/filter/container/select-filter.component.html deleted file mode 100644 index 3793ba3bf..000000000 --- a/ui/src/app/metadata/filter/container/select-filter.component.html +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/ui/src/app/metadata/filter/container/select-filter.component.scss b/ui/src/app/metadata/filter/container/select-filter.component.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/ui/src/app/metadata/filter/container/select-filter.component.spec.ts b/ui/src/app/metadata/filter/container/select-filter.component.spec.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/ui/src/app/metadata/filter/container/select-filter.component.ts b/ui/src/app/metadata/filter/container/select-filter.component.ts deleted file mode 100644 index 55bdabb4e..000000000 --- a/ui/src/app/metadata/filter/container/select-filter.component.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { Component, OnDestroy } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { Observable, Subscription } from 'rxjs'; -import { distinctUntilChanged, map } from 'rxjs/operators'; -import { Store } from '@ngrx/store'; -import { NgbPopoverConfig } from '@ng-bootstrap/ng-bootstrap'; - -import { MetadataFilter } from '../../domain/model/metadata-filter'; -import { SelectFilter } from '../action/collection.action'; -import * as fromFilter from '../reducer'; -import { MetadataFilterEditorTypes } from '../model'; -import { SetDefinition } from '../../../wizard/action/wizard.action'; - -@Component({ - selector: 'select-filter-page', - templateUrl: './select-filter.component.html', - styleUrls: ['./select-filter.component.scss'], - providers: [NgbPopoverConfig] -}) -export class SelectFilterComponent implements OnDestroy { - actionsSubscription: Subscription; - filterSubscription: Subscription; - filter$: Observable; - - constructor( - private store: Store, - private route: ActivatedRoute - ) { - this.actionsSubscription = this.route.params.pipe( - distinctUntilChanged(), - map(params => new SelectFilter(params.filterId)) - ).subscribe(store); - - this.filter$ = this.store.select(fromFilter.getSelectedFilter); - - this.filterSubscription = this.filter$.subscribe(f => { - this.setDefinition(f); - }); - } - - setDefinition(filter: MetadataFilter): void { - if (filter) { - this.store.dispatch(new SetDefinition({ - ...MetadataFilterEditorTypes.find(def => def.type === filter['@type']) - })); - } - } - - ngOnDestroy() { - this.actionsSubscription.unsubscribe(); - this.filterSubscription.unsubscribe(); - } -} /* istanbul ignore next */ diff --git a/ui/src/app/metadata/filter/effect/collection.effect.spec.ts b/ui/src/app/metadata/filter/effect/collection.effect.spec.ts deleted file mode 100644 index d89c931ad..000000000 --- a/ui/src/app/metadata/filter/effect/collection.effect.spec.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { TestBed } from '@angular/core/testing'; -import { Actions } from '@ngrx/effects'; - -import { TestActions, getActions } from '../../../../testing/effect.util'; -import { MetadataFilter } from '../../domain/model'; -import { FilterCollectionEffects } from './collection.effect'; -import { MetadataProviderService } from '../../domain/service/provider.service'; -import { Router } from '@angular/router'; -import { RouterStub } from '../../../../testing/router.stub'; - -describe('Filter Collection Effects', () => { - let effects: FilterCollectionEffects; - let draftService: any; - let actions$: TestActions; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - FilterCollectionEffects, - { - provide: MetadataProviderService, - useValue: { - query: () => { }, - find: (id: string) => { }, - save: (f: MetadataFilter) => { }, - update: (f: MetadataFilter) => { } - }, - }, - { provide: Actions, useFactory: getActions }, - { provide: Router, useClass: RouterStub } - ], - }); - - effects = TestBed.get(FilterCollectionEffects); - draftService = TestBed.get(MetadataProviderService); - actions$ = TestBed.get(Actions); - }); -}); diff --git a/ui/src/app/metadata/filter/effect/collection.effect.ts b/ui/src/app/metadata/filter/effect/collection.effect.ts deleted file mode 100644 index db94eacaf..000000000 --- a/ui/src/app/metadata/filter/effect/collection.effect.ts +++ /dev/null @@ -1,333 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { Store } from '@ngrx/store'; -import { ActivatedRoute, Router } from '@angular/router'; - -import { of } from 'rxjs'; -import { switchMap, map, catchError, tap, combineLatest, skipWhile, debounceTime, withLatestFrom } from 'rxjs/operators'; - -import { - LoadFilterRequest, - LoadFilterSuccess, - LoadFilterError, - UpdateFilterRequest, - UpdateFilterSuccess, - UpdateFilterFail, - SelectFilter, - SelectFilterSuccess, - SelectFilterFail, - AddFilterRequest, - AddFilterSuccess, - AddFilterFail, - GetOrderFilterRequest, - GetOrderFilterSuccess, - GetOrderFilterFail, - SetOrderFilterRequest, - SetOrderFilterSuccess, - SetOrderFilterFail, - ChangeFilterOrderUp, - ChangeFilterOrderDown, - RemoveFilterRequest, - RemoveFilterSuccess, - RemoveFilterFail, - UpdateFilterConflict -} from '../action/collection.action'; -import { FilterCollectionActionTypes } from '../action/collection.action'; -import * as fromFilter from '../reducer'; -import * as fromProvider from '../../provider/reducer'; -import { MetadataFilter } from '../../domain/model'; -import { array_move } from '../../../shared/util'; -import { MetadataFilterService } from '../../domain/service/filter.service'; -import { SelectProviderRequest } from '../../provider/action/collection.action'; -import { UpdateFilterChanges, ClearFilter } from '../action/filter.action'; -import { AddNotification } from '../../../notification/action/notification.action'; -import { NotificationType, Notification } from '../../../notification/model/notification'; -import { I18nService } from '../../../i18n/service/i18n.service'; -import * as fromI18n from '../../../i18n/reducer'; - -/* istanbul ignore next */ -@Injectable() -export class FilterCollectionEffects { - - @Effect() - loadFilters$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.LOAD_FILTER_REQUEST), - map(action => action.payload), - skipWhile(providerId => !providerId), - switchMap(providerId => - this.filterService - .query(providerId) - .pipe( - map(filters => new LoadFilterSuccess(filters)), - catchError(error => of(new LoadFilterError(error))) - ) - ) - ); - @Effect() - selectFilterRequest$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.SELECT_FILTER_REQUEST), - map(action => action.payload), - withLatestFrom(this.store.select(fromProvider.getSelectedProviderId).pipe(skipWhile(id => !id))), - switchMap(([filterId, providerId]) => { - return this.filterService - .find(providerId, filterId) - .pipe( - map(p => new SelectFilterSuccess(p)), - catchError(error => of(new SelectFilterFail(error))) - ); - } - ) - ); - - @Effect() - selectFilterRequestSetChanges$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.SELECT_FILTER_SUCCESS), - map(action => action.payload), - map(filter => new UpdateFilterChanges({...filter, type: filter['@type']})) - ); - - @Effect() - addFilter$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.ADD_FILTER_REQUEST), - map(action => action.payload), - switchMap(({filter, providerId}) => { - return this.filterService - .save(providerId, filter as MetadataFilter) - .pipe( - map(saved => new AddFilterSuccess({ - filter: saved, - providerId: providerId - })), - catchError(error => of(new AddFilterFail(error))) - ); - }) - ); - @Effect({ dispatch: false }) - addFilterSuccessRedirect$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.ADD_FILTER_SUCCESS), - map(action => action.payload), - tap(({ providerId }) => this.navigateToParent(providerId)) - ); - - @Effect() - addFilterSuccessReloadParent$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.ADD_FILTER_SUCCESS), - map(action => action.payload), - map(({ providerId }) => new SelectProviderRequest(providerId)) - ); - - @Effect() - addFilterSuccessResetState$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.ADD_FILTER_SUCCESS), - map(() => new ClearFilter()) - ); - - @Effect() - addFilterFailNotification$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.ADD_FILTER_FAIL), - map(action => action.payload.error), - withLatestFrom(this.store.select(fromI18n.getMessages)), - map(([error, messages]) => { - const message = error.errorMessage || error.cause || 'message.filter-fail'; - const translated = this.i18nService.translate(message, null, messages); - return new AddNotification( - new Notification( - NotificationType.Danger, - `${error.errorCode}: ${translated}`, - 8000 - ) - ); - }) - ); - - @Effect() - updateFilterFailNotification$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.UPDATE_FILTER_FAIL), - map(action => action.payload.error), - withLatestFrom(this.store.select(fromI18n.getMessages)), - map(([error, messages]) => { - const message = error.errorMessage || error.cause || 'message.filter-fail'; - const translated = this.i18nService.translate(message, null, messages); - return new AddNotification( - new Notification( - NotificationType.Danger, - `${error.errorCode}: ${translated}`, - 8000 - ) - ); - }) - ); - - @Effect() - updateFilter$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.UPDATE_FILTER_REQUEST), - map(action => action.payload), - withLatestFrom(this.store.select(fromFilter.getSelectedFilter)), - switchMap(([action, original]) => { - const { filter, providerId } = action; - delete filter.modifiedDate; - delete filter.createdDate; - - const updates = ({ ...original, ...filter }); - - return this.filterService - .update(providerId, updates) - .pipe( - map(resp => new UpdateFilterSuccess({ - providerId, - update: { - id: resp.resourceId, - changes: resp - } - })), - catchError(err => of(err.status === 409 ? new UpdateFilterConflict({ - filter: updates, - providerId - }) : new UpdateFilterFail(err))) - ); - }) - ); - @Effect() - updateFilterSuccessReloadProvider$ = this.actions$.pipe( - ofType( - FilterCollectionActionTypes.UPDATE_FILTER_SUCCESS, - FilterCollectionActionTypes.SET_ORDER_FILTER_SUCCESS, - FilterCollectionActionTypes.REMOVE_FILTER_SUCCESS - ), - map((action) => { - const { payload } = action; - const { providerId } = payload; - return new SelectProviderRequest(providerId); - }) - ); - - @Effect({ dispatch: false }) - updateFilterSuccessRedirect$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.UPDATE_FILTER_SUCCESS), - map(action => action.payload), - tap(({ providerId }) => this.navigateToParent(providerId)) - ); - - @Effect() - updateFilterSuccessResetState$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.UPDATE_FILTER_SUCCESS), - map(() => new ClearFilter()) - ); - - @Effect() - getOrderWithLoad$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.LOAD_FILTER_SUCCESS), - map(() => new GetOrderFilterRequest()) - ); - - @Effect() - getOrder$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.GET_ORDER_FILTER_REQUEST), - withLatestFrom(this.store.select(fromProvider.getSelectedProviderId).pipe(skipWhile(id => !id))), - switchMap(([action, providerId]) => - this.filterService.getOrder(providerId).pipe( - map(order => new GetOrderFilterSuccess(order)), - catchError(err => of(new GetOrderFilterFail(err))) - ) - ) - ); - - @Effect() - setOrder$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.SET_ORDER_FILTER_REQUEST), - map(action => action.payload), - withLatestFrom( - this.store.select(fromFilter.getPluginFilterOrder) - ), - switchMap(([{order, providerId}, pluginOrder]) => - this.filterService.setOrder(providerId, [...pluginOrder, ...order]).pipe( - map(() => new SetOrderFilterSuccess(providerId)), - catchError(err => of(new SetOrderFilterFail(err))) - ) - ) - ); - - @Effect() - getOrderOnUpdate$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.SET_ORDER_FILTER_SUCCESS), - map(() => new GetOrderFilterRequest()) - ); - - @Effect() - changeOrderUp$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.CHANGE_FILTER_ORDER_UP), - map(action => action.payload), - withLatestFrom(this.store.select(fromFilter.getAdditionalFilterOrder)), - map(([{ id, providerId }, order]) => { - const index = order.indexOf(id); - if (index > 0) { - const newOrder = array_move(order, index, index - 1); - return new SetOrderFilterRequest({ order: newOrder, providerId }); - } else { - return new SetOrderFilterFail(new Error(`could not change order: ${id}`)); - } - }) - ); - - @Effect() - changeOrderDown$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.CHANGE_FILTER_ORDER_DOWN), - map(action => action.payload), - withLatestFrom(this.store.select(fromFilter.getAdditionalFilterOrder)), - map(([{id, providerId}, order]) => { - const index = order.indexOf(id); - if (index < order.length - 1) { - const newOrder = array_move(order, index, index + 1); - return new SetOrderFilterRequest({ order: newOrder, providerId }); - } else { - return new SetOrderFilterFail(new Error(`could not change order: ${id}`)); - } - }) - ); - - @Effect() - removeFilterRequest$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.REMOVE_FILTER_REQUEST), - map(action => action.payload), - withLatestFrom(this.store.select(fromProvider.getSelectedProviderId).pipe(skipWhile(id => !id))), - switchMap(([filterId, providerId]) => - this.filterService.remove(providerId, filterId).pipe( - map(removed => new RemoveFilterSuccess(removed)), - catchError(err => of(new RemoveFilterFail(err))) - ) - ) - ); - - @Effect() - removeFilterSuccess$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.REMOVE_FILTER_SUCCESS), - map(action => action.payload), - withLatestFrom(this.store.select(fromProvider.getSelectedProviderId).pipe(skipWhile(id => !id))), - map(([filter, providerId]) => new LoadFilterRequest(providerId)) - ); - - constructor( - private actions$: Actions, - private router: Router, - private route: ActivatedRoute, - private filterService: MetadataFilterService, - private store: Store, - private i18nService: I18nService - ) { } - - navigateToParent(id) { - this.router.navigate( - [ - '/', - 'metadata', - 'provider', - id, - 'configuration', - 'options' - ], - { - fragment: 'filters' - } - ); - } -} diff --git a/ui/src/app/metadata/filter/effect/editor.effect.ts b/ui/src/app/metadata/filter/effect/editor.effect.ts deleted file mode 100644 index bd8eaf261..000000000 --- a/ui/src/app/metadata/filter/effect/editor.effect.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { SchemaService } from '../../../schema-form/service/schema.service'; - -import { map, switchMap, catchError, debounceTime } from 'rxjs/operators'; -import { of } from 'rxjs'; -import { - LoadSchemaRequest, - LoadSchemaSuccess, - LoadSchemaFail, - SetDefinition, - WizardActionTypes -} from '../../../wizard/action/wizard.action'; -import { ResetChanges } from '../action/filter.action'; - -import { CancelContentionAction, ContentionActionTypes } from '../../../contention/action/contention.action'; - -@Injectable() -export class EditorEffects { - - @Effect() - $loadSchemaRequest = this.actions$.pipe( - ofType(WizardActionTypes.LOAD_SCHEMA_REQUEST), - map(action => action.payload), - debounceTime(100), - switchMap((schemaPath: string) => - this.schemaService - .get(schemaPath) - .pipe( - map(schema => new LoadSchemaSuccess(schema)), - catchError(error => of(new LoadSchemaFail(error))) - ) - ) - ); - - @Effect() - $resetChanges = this.actions$.pipe( - ofType(WizardActionTypes.SET_DEFINITION), - map(() => new ResetChanges()) - ); - - @Effect() - $resetChangesOnContentionFail = this.actions$.pipe( - ofType(ContentionActionTypes.CANCEL_CONTENTION), - map(() => new ResetChanges()) - ); - - constructor( - private schemaService: SchemaService, - private actions$: Actions - ) { } -} /* istanbul ignore next */ diff --git a/ui/src/app/metadata/filter/effect/filter.effect.ts b/ui/src/app/metadata/filter/effect/filter.effect.ts deleted file mode 100644 index 2bdc60bc9..000000000 --- a/ui/src/app/metadata/filter/effect/filter.effect.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { Store } from '@ngrx/store'; -import { of } from 'rxjs'; -import { map, switchMap, catchError, withLatestFrom, tap, combineLatest, skipWhile } from 'rxjs/operators'; - -import { ActivatedRoute, Router } from '@angular/router'; - -import * as fromFilter from '../reducer'; -import * as fromProvider from '../../provider/reducer'; -import * as fromRoot from '../../../app.reducer'; -import { - FilterCollectionActionTypes, - UpdateFilterConflict, - UpdateFilterRequest -} from '../action/collection.action'; -import { - SelectId, - FilterActionTypes, - LoadEntityPreviewSuccess, - LoadEntityPreviewError, - CancelCreateFilter -} from '../action/filter.action'; -import { EntityIdService } from '../../domain/service/entity-id.service'; -import { ShowContentionAction } from '../../../contention/action/contention.action'; -import { MetadataFilter } from '../../domain/model'; -import { ContentionService } from '../../../contention/service/contention.service'; -import { MetadataFilterService } from '../../domain/service/filter.service'; - -@Injectable() -export class FilterEffects { - - @Effect() - loadEntityMdui$ = this.actions$.pipe( - ofType(FilterActionTypes.SELECT_ID), - map(action => action.payload), - switchMap(query => - this.idService.findEntityById(query).pipe( - map(data => new LoadEntityPreviewSuccess(data)), - catchError(error => of(new LoadEntityPreviewError(error))) - ) - ) - ); - - @Effect() - openContention$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.UPDATE_FILTER_CONFLICT), - map(action => action.payload), - withLatestFrom( - this.store.select(fromFilter.getSelectedFilter) - ), - switchMap(([{ providerId, filter }, current]) => - this.filterService.find(providerId, filter.resourceId).pipe( - map(data => new ShowContentionAction(this.contentionService.getContention(current, filter, data, { - resolve: (obj) => this.store.dispatch(new UpdateFilterRequest({ - filter: { ...obj }, - providerId - })), - reject: (obj) => this.store.dispatch(new CancelCreateFilter(providerId)) - }))) - ) - ) - ); - - @Effect({ dispatch: false }) - cancelChanges$ = this.actions$.pipe( - ofType(FilterActionTypes.CANCEL_CREATE_FILTER), - map(action => action.payload), - tap((providerId) => { - this.router.navigate(['/', 'metadata', 'provider', providerId, 'configuration']); - }) - ); - - constructor( - private store: Store, - private actions$: Actions, - private router: Router, - private route: ActivatedRoute, - private idService: EntityIdService, - private filterService: MetadataFilterService, - private contentionService: ContentionService - ) { } -} diff --git a/ui/src/app/metadata/filter/effect/search.effect.ts b/ui/src/app/metadata/filter/effect/search.effect.ts deleted file mode 100644 index 2225bd91a..000000000 --- a/ui/src/app/metadata/filter/effect/search.effect.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { Store } from '@ngrx/store'; -import { of } from 'rxjs'; - -import { catchError, map, debounceTime, switchMap, withLatestFrom } from 'rxjs/operators'; -import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; -import { State } from '../../../app.reducer'; - -import { - SearchActionTypes, - QueryEntityIds, - LoadEntityIdsError, - LoadEntityIdsSuccess, - ViewMoreIds, - CancelViewMore -} from '../action/search.action'; - -import { SearchDialogComponent } from '../component/search-dialog.component'; -import { EntityIdService } from '../../domain/service/entity-id.service'; -import { from } from 'rxjs'; -import { SelectId } from '../action/filter.action'; -import * as fromProvider from '../../provider/reducer'; - - -@Injectable() -export class SearchIdEffects { - - private dbounce = 500; - @Effect() - loadEntityIds$ = this.actions$.pipe( - ofType(SearchActionTypes.QUERY_ENTITY_IDS), - map(action => action.payload), - debounceTime(this.dbounce), - withLatestFrom(this.store.select(fromProvider.getSelectedProviderId)), - map(([query, resourceId]) => ({ ...query, resourceId })), - switchMap(query => - this.idService.query(query).pipe( - map(ids => new LoadEntityIdsSuccess(ids)), - catchError(error => of(new LoadEntityIdsError(error))) - ) - ) - ); - - @Effect() - viewMore$ = this.actions$.pipe( - ofType(SearchActionTypes.VIEW_MORE_IDS), - map(action => action.payload), - switchMap(q => { - const modal = this.modalService.open(SearchDialogComponent) as NgbModalRef; - const res = modal.result; - modal.componentInstance.term = q; - return from(res).pipe( - map(id => new SelectId(id)), - catchError(() => of(new CancelViewMore())) - ); - }) - ); - - constructor( - private actions$: Actions, - private modalService: NgbModal, - private idService: EntityIdService, - private store: Store - ) { } -} diff --git a/ui/src/app/metadata/filter/filter.module.ts b/ui/src/app/metadata/filter/filter.module.ts deleted file mode 100644 index e7c3bfcff..000000000 --- a/ui/src/app/metadata/filter/filter.module.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; -import { CommonModule } from '@angular/common'; -import { HttpClientModule } from '@angular/common/http'; -import { ReactiveFormsModule } from '@angular/forms'; -import { StoreModule } from '@ngrx/store'; -import { EffectsModule } from '@ngrx/effects'; - -import { NewFilterComponent } from './container/new-filter.component'; -import { reducers } from './reducer'; -import { FilterEffects } from './effect/filter.effect'; -import { NgbPopoverModule, NgbModalModule } from '@ng-bootstrap/ng-bootstrap'; -import { SearchDialogComponent } from './component/search-dialog.component'; -import { SharedModule } from '../../shared/shared.module'; -import { EditFilterComponent } from './container/edit-filter.component'; -import { SelectFilterComponent } from './container/select-filter.component'; -import { SearchIdEffects } from './effect/search.effect'; -import { FilterExistsGuard } from './guard/filter-exists.guard'; -import { DomainModule } from '../domain/domain.module'; -import { ModuleWithProviders } from '@angular/compiler/src/core'; -import { FilterCollectionEffects } from './effect/collection.effect'; -import { FormModule } from '../../schema-form/schema-form.module'; -import { I18nModule } from '../../i18n/i18n.module'; -import { FilterComponent } from './container/filter.component'; -import { FilterListComponent } from './component/filter-list.component'; -import { EditFilterStepComponent } from './container/edit-filter-step.component'; -import { NewFilterStepComponent } from './container/new-filter-step.component'; - -@NgModule({ - declarations: [ - NewFilterComponent, - NewFilterStepComponent, - EditFilterComponent, - EditFilterStepComponent, - SelectFilterComponent, - SearchDialogComponent, - FilterComponent, - FilterListComponent - ], - entryComponents: [ - SearchDialogComponent - ], - imports: [ - CommonModule, - ReactiveFormsModule, - NgbPopoverModule, - NgbModalModule, - SharedModule, - DomainModule, - HttpClientModule, - RouterModule, - FormModule, - I18nModule - ], - exports: [ - FilterListComponent - ] -}) -export class FilterModule { - static forRoot(): ModuleWithProviders { - return { - ngModule: RootFilterModule, - providers: [ - FilterExistsGuard - ] - }; - } -} - -@NgModule({ - imports: [ - FilterModule, - StoreModule.forFeature('filter', reducers), - EffectsModule.forFeature([FilterEffects, SearchIdEffects, FilterCollectionEffects]), - ], -}) -export class RootFilterModule { } diff --git a/ui/src/app/metadata/filter/guard/filter-exists.guard.ts b/ui/src/app/metadata/filter/guard/filter-exists.guard.ts deleted file mode 100644 index 048e5ae9f..000000000 --- a/ui/src/app/metadata/filter/guard/filter-exists.guard.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, CanActivate, Router } from '@angular/router'; -import { select, Store } from '@ngrx/store'; -import { Observable, of } from 'rxjs'; -import { catchError, filter, map, switchMap, take, tap } from 'rxjs/operators'; - -import * as fromCollection from '../reducer'; -import { MetadataProviderService } from '../../domain/service/provider.service'; - -/** - * Guards are hooks into the route resolution process, providing an opportunity - * to inform the router's navigation process whether the route should continue - * to activate this route. Guards must return an of true or false. - */ -@Injectable() -export class FilterExistsGuard implements CanActivate { - constructor( - private store: Store, - private mdResolverService: MetadataProviderService, - private router: Router - ) { } - - waitForCollectionToLoad(): Observable { - return this.store.pipe( - select(fromCollection.getFilterCollectionIsLoaded), - filter(loaded => loaded), - take(1) - ); - } - - hasFilterInStore(id: string): Observable { - return this.store.pipe( - select(fromCollection.getFilterEntities), - map(entities => !!entities[id]), - take(1) - ); - } - - hasFilterInApi(id: string): Observable { - return this.store.select(fromCollection.getAllFilters).pipe( - map(filters => filters.find(f => f.resourceId === id)), - map(filter => !!filter), - catchError(() => { - this.router.navigate(['/dashboard']); - return of(false); - }) - ); - } - - hasFilter(id: string): Observable { - return this.hasFilterInStore(id).pipe( - switchMap(inStore => { - if (inStore) { - return of(inStore); - } - - return this.hasFilterInApi(id); - }) - ); - } - canActivate(route: ActivatedRouteSnapshot): Observable { - return this.waitForCollectionToLoad().pipe( - switchMap(() => this.hasFilter(route.params['id'])) - ); - } -} diff --git a/ui/src/app/metadata/filter/model/entity-attributes-configuration.filter.ts b/ui/src/app/metadata/filter/model/entity-attributes-configuration.filter.ts deleted file mode 100644 index 6117c9427..000000000 --- a/ui/src/app/metadata/filter/model/entity-attributes-configuration.filter.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { Wizard } from '../../../wizard/model'; -import { MetadataFilter } from '../../domain/model'; -import { EntityAttributesFilter } from './entity-attributes.filter'; - -export const EntityAttributesFilterConfiguration: Wizard = { - ...EntityAttributesFilter, - steps: [ - { - id: 'common', - label: 'label.target', - index: 1, - fields: [ - 'name', - '@type', - 'resourceId', - 'filterEnabled', - 'entityAttributesFilterTarget' - ] - }, - { - id: 'options', - label: 'label.options', - index: 2, - initialValues: [], - fields: [ - 'relyingPartyOverrides' - ] - }, - { - id: 'attributes', - label: 'label.attributes', - index: 3, - fields: [ - 'attributeRelease' - ] - } - ] -}; diff --git a/ui/src/app/metadata/filter/model/entity-attributes.filter.spec.ts b/ui/src/app/metadata/filter/model/entity-attributes.filter.spec.ts deleted file mode 100644 index 552b94023..000000000 --- a/ui/src/app/metadata/filter/model/entity-attributes.filter.spec.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { EntityAttributesFilter } from './entity-attributes.filter'; - -describe('Entity Attributes filter form', () => { - describe('getValidators', () => { - it('should return an empty object for validators', () => { - expect(Object.keys(EntityAttributesFilter.getValidators())).toEqual([ - '/', - '/name', - '/relyingPartyOverrides', - '/entityAttributesFilterTarget' - ]); - }); - - describe('name `/name` validator', () => { - const validators = EntityAttributesFilter.getValidators(['foo', 'bar']); - - it('should return an invalid object when provided values are invalid based on name', () => { - expect(validators['/name']('foo', { path: '/name' })).toBeDefined(); - }); - - it('should return null when provided values are valid based on name', () => { - expect(validators['/name']('baz', { path: '/name' })).toBeNull(); - }); - }); - - describe('parent `/` validator', () => { - const validators = EntityAttributesFilter.getValidators(['foo', 'bar']); - - it('should return a list of child errors', () => { - expect(validators['/']({ name: 'foo' }, { path: '/name' }, {}).length).toBe(1); - }); - - it('should ignore properties that don\'t exist a list of child errors', () => { - expect(validators['/']({ foo: 'bar' }, { path: '/foo' }, {})).toBeUndefined(); - }); - }); - }); - - describe('transformer', () => { - it('should add modify the object', () => { - expect(EntityAttributesFilter.formatter({})).toEqual({}); - expect(EntityAttributesFilter.parser({}).relyingPartyOverrides).toBeDefined(); - }); - }); -}); diff --git a/ui/src/app/metadata/filter/model/entity-attributes.filter.ts b/ui/src/app/metadata/filter/model/entity-attributes.filter.ts deleted file mode 100644 index b310e6a85..000000000 --- a/ui/src/app/metadata/filter/model/entity-attributes.filter.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { FormDefinition } from '../../../wizard/model'; -import { MetadataFilter } from '../../domain/model'; -import { removeNulls } from '../../../shared/util'; -import { EntityAttributesFilterEntity } from '../../domain/entity'; -import { RegexValidator } from '../../../shared/validation/regex.validator'; -import { getFilterNames } from '../reducer'; -import { memoize } from '../../../shared/memo'; -import API_BASE_PATH from '../../../app.constant'; - -const checkRegex = memoize(RegexValidator.isValidRegex); - -export const EntityAttributesFilter: FormDefinition = { - label: 'EntityAttributes', - type: 'EntityAttributes', - schema: `${API_BASE_PATH}/ui/EntityAttributesFilters`, - getEntity(filter: MetadataFilter): EntityAttributesFilterEntity { - return new EntityAttributesFilterEntity(filter); - }, - validatorParams: [getFilterNames], - getValidators(namesList: string[] = []): any { - const validators = { - '/': (value, property, form_current) => { - let errors; - // iterate all customer - Object.keys(value).forEach((key) => { - const item = value[key]; - const validatorKey = `/${key}`; - const validator = validators.hasOwnProperty(validatorKey) ? validators[validatorKey] : null; - const error = validator ? validator(item, { path: `/${key}` }, form_current) : null; - if (error && error.invalidate) { - errors = errors || []; - errors.push(error); - } - }); - return errors; - }, - '/name': (value, property, form) => { - const err = namesList.indexOf(value) > -1 ? { - code: 'INVALID_NAME', - path: `#${property.path}`, - message: 'message.name-must-be-unique', - params: [value], - invalidate: true - } : null; - return err; - }, - '/relyingPartyOverrides': (value, property, form) => { - if (!value.signAssertion && value.dontSignResponse) { - return { - code: 'INVALID_SIGNING', - path: `#${property.path}`, - message: 'message.invalid-signing', - params: [value], - invalidate: false - }; - } - return null; - }, - '/entityAttributesFilterTarget': (value, property, form) => { - if (!form || !form.value || !form.value.entityAttributesFilterTarget || - form.value.entityAttributesFilterTarget.entityAttributesFilterTargetType !== 'REGEX') { - return null; - } - return checkRegex(value.value[0]) ? null : { - code: 'INVALID_REGEX', - path: `#${property.path}`, - message: 'message.invalid-regex-pattern', - params: [value.value[0]], - invalidate: true - }; - }, - }; - return validators; - }, - parser: (changes: any): MetadataFilter => { - return { - ...changes, - relyingPartyOverrides: removeNulls(new EntityAttributesFilterEntity(changes).relyingPartyOverrides) - }; - }, - formatter: (changes: MetadataFilter): any => changes -}; diff --git a/ui/src/app/metadata/filter/model/index.ts b/ui/src/app/metadata/filter/model/index.ts deleted file mode 100644 index e07edc9f8..000000000 --- a/ui/src/app/metadata/filter/model/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { EntityAttributesFilter } from './entity-attributes.filter'; -import { NameIDFilter } from './nameid.filter'; -import { EntityAttributesFilterConfiguration } from './entity-attributes-configuration.filter'; -import { NameIDFilterConfiguration } from './nameid-configuration.filter'; - -export const MetadataFilterTypes = { - EntityAttributes: EntityAttributesFilterConfiguration, - NameIDFormat: NameIDFilter -}; - -export const MetadataFilterEditorTypes = [ - EntityAttributesFilterConfiguration, - NameIDFilterConfiguration -]; - -export * from './entity-attributes.filter'; -export * from './nameid.filter'; diff --git a/ui/src/app/metadata/filter/model/nameid-configuration.filter.ts b/ui/src/app/metadata/filter/model/nameid-configuration.filter.ts deleted file mode 100644 index 5520f4919..000000000 --- a/ui/src/app/metadata/filter/model/nameid-configuration.filter.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Wizard } from '../../../wizard/model'; -import { MetadataFilter } from '../../domain/model'; -import { NameIDFilter } from './nameid.filter'; - -export const NameIDFilterConfiguration: Wizard = { - ...NameIDFilter, - steps: [ - { - id: 'common', - label: 'label.target', - index: 1, - fields: [ - 'name', - 'filterEnabled', - '@type', - 'resourceId', - 'nameIdFormatFilterTarget' - ] - }, - { - id: 'options', - label: 'label.options', - index: 1, - initialValues: [], - fields: [ - 'removeExistingFormats', - 'formats' - ] - } - ] -}; diff --git a/ui/src/app/metadata/filter/model/nameid.filter.spec.ts b/ui/src/app/metadata/filter/model/nameid.filter.spec.ts deleted file mode 100644 index e3d3aca36..000000000 --- a/ui/src/app/metadata/filter/model/nameid.filter.spec.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { NameIDFilter } from './nameid.filter'; - -describe('NameID Format filter form', () => { - describe('getValidators', () => { - it('should return an empty object for validators', () => { - expect(Object.keys(NameIDFilter.getValidators())).toEqual([ - '/', - '/name', - '/nameIdFormatFilterTarget' - ]); - }); - - describe('name `/name` validator', () => { - const validators = NameIDFilter.getValidators(['foo', 'bar']); - - it('should return an invalid object when provided values are invalid based on name', () => { - expect(validators['/name']('foo', { path: '/name' })).toBeDefined(); - }); - - it('should return null when provided values are valid based on name', () => { - expect(validators['/name']('baz', { path: '/name' })).toBeNull(); - }); - }); - - describe('parent `/` validator', () => { - const validators = NameIDFilter.getValidators(['foo', 'bar']); - - it('should return a list of child errors', () => { - expect(validators['/']({ name: 'foo' }, { path: '/name' }, {}).length).toBe(1); - }); - - it('should ignore properties that don\'t exist a list of child errors', () => { - expect(validators['/']({ foo: 'bar' }, { path: '/foo' }, {})).toBeUndefined(); - }); - }); - }); - - describe('transformer', () => { - it('should add modify the object', () => { - expect(NameIDFilter.formatter({})).toEqual({}); - expect(NameIDFilter.parser({})).toEqual({}); - }); - }); -}); diff --git a/ui/src/app/metadata/filter/model/nameid.filter.ts b/ui/src/app/metadata/filter/model/nameid.filter.ts deleted file mode 100644 index a095513ea..000000000 --- a/ui/src/app/metadata/filter/model/nameid.filter.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { FormDefinition } from '../../../wizard/model'; -import { MetadataFilter } from '../../domain/model'; -import { NameIDFormatFilterEntity } from '../../domain/entity/filter/nameid-format-filter'; -import { RegexValidator } from '../../../shared/validation/regex.validator'; -import { getFilterNames } from '../reducer'; -import { memoize } from '../../../shared/memo'; -import API_BASE_PATH from '../../../app.constant'; - -const checkRegex = memoize(RegexValidator.isValidRegex); - -export const NameIDFilter: FormDefinition = { - label: 'NameIDFormat', - type: 'NameIDFormat', - schema: `${API_BASE_PATH}/ui/NameIdFormatFilter`, - getEntity(filter: MetadataFilter): NameIDFormatFilterEntity { - return new NameIDFormatFilterEntity(filter); - }, - validatorParams: [getFilterNames], - getValidators(namesList: string[] = []): any { - const validators = { - '/': (value, property, form_current) => { - let errors; - // iterate all customer - Object.keys(value).forEach((key) => { - const item = value[key]; - const validatorKey = `/${key}`; - const validator = validators.hasOwnProperty(validatorKey) ? validators[validatorKey] : null; - const error = validator ? validator(item, { path: `/${key}` }, form_current) : null; - if (error) { - errors = errors || []; - errors.push(error); - } - }); - return errors; - }, - '/name': (value, property, form) => { - const err = namesList.indexOf(value) > -1 ? { - code: 'INVALID_NAME', - path: `#${property.path}`, - message: 'message.name-must-be-unique', - params: [value] - } : null; - return err; - }, - '/nameIdFormatFilterTarget': (value, property, form) => { - if (!form || !form.value || !form.value.nameIdFormatFilterTarget || - form.value.nameIdFormatFilterTarget.nameIdFormatFilterTargetType !== 'REGEX') { - return null; - } - return checkRegex(value.value[0]) ? null : { - code: 'INVALID_REGEX', - path: `#${property.path}`, - message: 'message.invalid-regex-pattern', - params: [value.value[0]] - }; - } - }; - return validators; - }, - parser: (changes: any): MetadataFilter => changes, - formatter: (changes: MetadataFilter): any => changes -}; diff --git a/ui/src/app/metadata/filter/reducer/collection.reducer.spec.ts b/ui/src/app/metadata/filter/reducer/collection.reducer.spec.ts deleted file mode 100644 index 5c11032cd..000000000 --- a/ui/src/app/metadata/filter/reducer/collection.reducer.spec.ts +++ /dev/null @@ -1,170 +0,0 @@ -import { reducer, initialState as snapshot } from './collection.reducer'; -import * as fromFilter from './collection.reducer'; -import { - FilterCollectionActionTypes, - LoadFilterSuccess, - UpdateFilterSuccess, - SelectFilter, - SelectFilterSuccess, - AddFilterRequest, - UpdateFilterRequest, - AddFilterSuccess, - AddFilterFail, - UpdateFilterFail, - RemoveFilterFail, - RemoveFilterRequest, - RemoveFilterSuccess -} from '../action/collection.action'; -import { EntityAttributesFilterEntity } from '../../domain/entity/filter/entity-attributes-filter'; - -describe('Filter Reducer', () => { - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(snapshot, {} as any); - - expect(result).toEqual(snapshot); - }); - }); - - describe(`${FilterCollectionActionTypes.SELECT_FILTER_REQUEST}`, () => { - it('should set the selected id in the store', () => { - const selectedFilterId = 'foo'; - const action = new SelectFilter(selectedFilterId); - const result = reducer(snapshot, action); - expect(result).toEqual({...snapshot, selectedFilterId}); - }); - }); - - describe(`${FilterCollectionActionTypes.LOAD_FILTER_SUCCESS}`, () => { - it('should add the loaded filters to the collection', () => { - spyOn(fromFilter.adapter, 'addAll').and.callThrough(); - const filters = [ - new EntityAttributesFilterEntity({ resourceId: 'foo', createdDate: new Date().toLocaleDateString() }), - new EntityAttributesFilterEntity({ resourceId: 'bar', createdDate: new Date().toLocaleDateString() }) - ]; - const action = new LoadFilterSuccess(filters); - const result = reducer(snapshot, action); - expect(fromFilter.adapter.addAll).toHaveBeenCalled(); - }); - }); - - describe(`${FilterCollectionActionTypes.SELECT_FILTER_SUCCESS}`, () => { - it('should add the loaded filter to the collection', () => { - spyOn(fromFilter.adapter, 'addOne').and.callThrough(); - const filter = new EntityAttributesFilterEntity({ resourceId: 'foo', createdDate: new Date().toLocaleDateString() }); - const action = new SelectFilterSuccess(filter); - const result = reducer(snapshot, action); - expect(fromFilter.adapter.addOne).toHaveBeenCalled(); - }); - }); - - describe(`${FilterCollectionActionTypes.ADD_FILTER_REQUEST}`, () => { - it('should set saving to true', () => { - const filter = new EntityAttributesFilterEntity({ resourceId: 'foo', createdDate: new Date().toLocaleDateString() }); - const action = new AddFilterRequest({ - filter, - providerId: 'foo' - }); - expect(reducer(snapshot, action).saving).toBe(true); - }); - }); - describe(`${FilterCollectionActionTypes.UPDATE_FILTER_REQUEST}`, () => { - it('should set saving to true', () => { - const filter = new EntityAttributesFilterEntity({ resourceId: 'foo', createdDate: new Date().toLocaleDateString() }); - const action = new UpdateFilterRequest({ - filter, - providerId: 'foo' - }); - expect(reducer(snapshot, action).saving).toBe(true); - }); - }); - - describe(`${FilterCollectionActionTypes.ADD_FILTER_SUCCESS}`, () => { - it('should set saving to false', () => { - const filter = new EntityAttributesFilterEntity({ resourceId: 'foo', createdDate: new Date().toLocaleDateString() }); - const action = new AddFilterSuccess({ - filter, - providerId: 'foo' - }); - expect(reducer(snapshot, action).saving).toBe(false); - }); - }); - - describe(`${FilterCollectionActionTypes.ADD_FILTER_FAIL}`, () => { - it('should set saving to false', () => { - const action = new AddFilterFail(new Error('error')); - expect(reducer(snapshot, action).saving).toBe(false); - }); - }); - - describe(`${FilterCollectionActionTypes.UPDATE_FILTER_FAIL}`, () => { - it('should set saving to false', () => { - const filter = new EntityAttributesFilterEntity({ resourceId: 'foo', createdDate: new Date().toLocaleDateString() }); - const action = new UpdateFilterFail(filter); - expect(reducer(snapshot, action).saving).toBe(false); - }); - }); - - describe(`${FilterCollectionActionTypes.REMOVE_FILTER_FAIL}`, () => { - it('should set saving to false', () => { - const action = new RemoveFilterFail(new Error('foo')); - expect(reducer(snapshot, action).saving).toBe(false); - }); - }); - - describe(`${FilterCollectionActionTypes.REMOVE_FILTER_REQUEST}`, () => { - it('should set saving to false', () => { - const action = new RemoveFilterRequest('foo'); - expect(reducer(snapshot, action).saving).toBe(true); - }); - }); - - describe(`${FilterCollectionActionTypes.REMOVE_FILTER_SUCCESS}`, () => { - it('should set saving to false', () => { - const action = new RemoveFilterSuccess('foo'); - expect(reducer(snapshot, action).saving).toBe(false); - }); - }); - - describe(`${FilterCollectionActionTypes.UPDATE_FILTER_SUCCESS}`, () => { - it('should update the filter in the collection', () => { - spyOn(fromFilter.adapter, 'updateOne').and.callThrough(); - const update = { - id: 'foo', - changes: new EntityAttributesFilterEntity({ resourceId: 'foo', name: 'bar', createdDate: new Date().toLocaleDateString() }), - }; - const action = new UpdateFilterSuccess({ - update, - providerId: 'foo' - }); - const result = reducer(snapshot, action); - expect(fromFilter.adapter.updateOne).toHaveBeenCalled(); - }); - }); - - describe('selector methods', () => { - describe('getSelectedFilterId', () => { - it('should return the state selectedFilterId', () => { - expect(fromFilter.getSelectedFilterId(snapshot)).toBe(snapshot.selectedFilterId); - }); - }); - - describe('getIsLoaded', () => { - it('should return the state loaded', () => { - expect(fromFilter.getIsLoaded(snapshot)).toBe(snapshot.loaded); - }); - }); - - describe('getError', () => { - it('should return the state saving', () => { - expect(fromFilter.getIsSaving(snapshot)).toBe(snapshot.saving); - }); - }); - - describe('getOrder', () => { - it('should return the state order', () => { - expect(fromFilter.getOrder(snapshot)).toBe(snapshot.order); - }); - }); - }); -}); diff --git a/ui/src/app/metadata/filter/reducer/collection.reducer.ts b/ui/src/app/metadata/filter/reducer/collection.reducer.ts deleted file mode 100644 index 1a3ebcb7e..000000000 --- a/ui/src/app/metadata/filter/reducer/collection.reducer.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { EntityState, EntityAdapter, createEntityAdapter } from '@ngrx/entity'; -import { FilterCollectionActionTypes, FilterCollectionActionsUnion } from '../action/collection.action'; -import { MetadataFilter } from '../../domain/model'; - -export interface CollectionState extends EntityState { - selectedFilterId: string | null; - loaded: boolean; - saving: boolean; - order: string[]; -} - -export function sortByDate(a: MetadataFilter, b: MetadataFilter): number { - return a.createdDate.localeCompare(b.createdDate); -} - -export const adapter: EntityAdapter = createEntityAdapter({ - sortComparer: sortByDate, - selectId: (model: MetadataFilter) => model.resourceId -}); - -export const initialState: CollectionState = adapter.getInitialState({ - selectedFilterId: null, - loaded: false, - saving: false, - order: [] -}); - -export function reducer(state = initialState, action: FilterCollectionActionsUnion): CollectionState { - switch (action.type) { - case FilterCollectionActionTypes.LOAD_FILTER_SUCCESS: { - let s = adapter.addAll(action.payload, { - ...state, - selectedFilterId: state.selectedFilterId, - loaded: true - }); - return s; - } - - case FilterCollectionActionTypes.SELECT_FILTER_SUCCESS: { - return adapter.addOne(action.payload, { - ...state, - selectedFilterId: action.payload.resourceId - }); - } - - case FilterCollectionActionTypes.ADD_FILTER_REQUEST: - case FilterCollectionActionTypes.UPDATE_FILTER_REQUEST: { - return { - ...state, - saving: true - }; - } - - case FilterCollectionActionTypes.UPDATE_FILTER_SUCCESS: { - return adapter.updateOne(action.payload.update, { - ...state, - saving: false - }); - } - - case FilterCollectionActionTypes.ADD_FILTER_SUCCESS: - case FilterCollectionActionTypes.ADD_FILTER_FAIL: - case FilterCollectionActionTypes.REMOVE_FILTER_FAIL: - case FilterCollectionActionTypes.UPDATE_FILTER_FAIL: { - return { - ...state, - saving: false - }; - } - - case FilterCollectionActionTypes.REMOVE_FILTER_SUCCESS: { - return adapter.removeOne(action.payload, { - ...state, - saving: false - }); - } - - case FilterCollectionActionTypes.REMOVE_FILTER_REQUEST: { - return { - ...state, - saving: true - }; - } - - case FilterCollectionActionTypes.SELECT_FILTER_REQUEST: { - return { - ...state, - selectedFilterId: action.payload, - }; - } - case FilterCollectionActionTypes.GET_ORDER_FILTER_SUCCESS: { - return { - ...state, - order: action.payload - }; - } - - case FilterCollectionActionTypes.CLEAR_FILTERS: { - return { - ...initialState - }; - } - - default: { - return state; - } - } -} - -export const getSelectedFilterId = (state: CollectionState) => state.selectedFilterId; -export const getIsLoaded = (state: CollectionState) => state.loaded; -export const getIsSaving = (state: CollectionState) => state.saving; -export const getOrder = (state: CollectionState) => state.order; -export const { - selectIds: selectFilterIds, - selectEntities: selectFilterEntities, - selectAll: selectAllFilters, - selectTotal: selectFilterTotal -} = adapter.getSelectors(); diff --git a/ui/src/app/metadata/filter/reducer/editor.reducer.ts b/ui/src/app/metadata/filter/reducer/editor.reducer.ts deleted file mode 100644 index dcb0620f4..000000000 --- a/ui/src/app/metadata/filter/reducer/editor.reducer.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { EditorActionTypes, EditorActionUnion } from '../action/editor.action'; - -export interface EditorState { - status: { [key: string]: string }; -} - -export const initialState: EditorState = { - status: {} -}; - -export function reducer(state = initialState, action: EditorActionUnion): EditorState { - switch (action.type) { - case EditorActionTypes.CLEAR: { - return { - ...initialState - }; - } - case EditorActionTypes.UPDATE_STATUS: { - //console.log(action) - return { - ...state, - status: { - ...state.status, - ...action.payload - } - }; - } - default: { - return state; - } - } -} - - - -export const isEditorValid = (state: EditorState) => - !Object.keys(state.status).some(key => state.status[key] === ('INVALID')); -export const getFormStatus = (state: EditorState) => state.status; -export const getInvalidForms = (state: EditorState) => - Object.keys(state.status).filter(key => state.status[key] === 'INVALID'); diff --git a/ui/src/app/metadata/filter/reducer/filter.reducer.spec.ts b/ui/src/app/metadata/filter/reducer/filter.reducer.spec.ts deleted file mode 100644 index 3689e9f16..000000000 --- a/ui/src/app/metadata/filter/reducer/filter.reducer.spec.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { reducer, initialState as snapshot } from './filter.reducer'; -import * as fromFilter from './filter.reducer'; -import { SelectId, LoadEntityPreviewSuccess, UpdateFilterChanges, FilterActionTypes, CancelCreateFilter } from '../action/filter.action'; -import { MDUI } from '../../domain/model'; -import { MetadataFilter } from '../../domain/model'; - -const mdui: MDUI = { - displayName: 'foo', - informationUrl: 'bar', - privacyStatementUrl: 'baz', - logoUrl: '', - logoHeight: 100, - logoWidth: 100, - description: '', -}; - -describe('Filter Reducer', () => { - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(snapshot, {} as any); - - expect(result).toEqual(snapshot); - }); - }); - - describe(`${FilterActionTypes.SELECT_ID} action`, () => { - it('should set selected property to the provided payload', () => { - const id = 'foo'; - const result = reducer(snapshot, new SelectId(id)); - expect(result.selected).toBe(id); - }); - }); - - describe(`${FilterActionTypes.LOAD_ENTITY_PREVIEW_SUCCESS} action`, () => { - it('should set preview property to the provided payload', () => { - let sampleMdui = { ...mdui }; - const result = reducer(snapshot, new LoadEntityPreviewSuccess(sampleMdui)); - expect(result.preview).toEqual(sampleMdui); - }); - }); - - describe(`${FilterActionTypes.UPDATE_FILTER} action`, () => { - it('should update the state of changes', () => { - const changes = { filterEnabled: false }; - const current = { ...snapshot, changes: { filterEnabled: true } as MetadataFilter }; - const result = reducer(current, new UpdateFilterChanges(changes)); - expect(result.changes.filterEnabled).toBe(false); - }); - }); - describe(`${FilterActionTypes.CANCEL_CREATE_FILTER} action`, () => { - it('should set saving to true', () => { - const result = reducer(snapshot, new CancelCreateFilter('foo')); - expect(result).toEqual(fromFilter.initialState); - }); - }); - - describe('selector methods', () => { - describe('getSelected', () => { - it('should return the state selected', () => { - expect(fromFilter.getSelected(snapshot)).toBe(snapshot.selected); - }); - }); - - describe('getChanges', () => { - it('should return the state changes', () => { - expect(fromFilter.getFilterChanges(snapshot)).toBe(snapshot.changes); - }); - }); - - describe('getPreview', () => { - it('should return the state preview', () => { - expect(fromFilter.getPreview(snapshot)).toBe(snapshot.preview); - }); - }); - }); -}); diff --git a/ui/src/app/metadata/filter/reducer/filter.reducer.ts b/ui/src/app/metadata/filter/reducer/filter.reducer.ts deleted file mode 100644 index bda4668ca..000000000 --- a/ui/src/app/metadata/filter/reducer/filter.reducer.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { - FilterActionTypes, - FilterActionsUnion -} from '../action/filter.action'; -import { MetadataFilter, MDUI } from '../../domain/model'; - -export interface FilterState { - selected: string | null; - changes: MetadataFilter | null; - preview: MDUI | null; -} - -export const initialState: FilterState = { - selected: null, - changes: null, - preview: null -}; - -export function reducer(state = initialState, action: FilterActionsUnion): FilterState { - switch (action.type) { - case FilterActionTypes.SELECT_ID: { - return { - ...state, - selected: action.payload - }; - } - case FilterActionTypes.SELECT_FILTER_TYPE: { - return { - ...state, - changes: { - type: action.payload - } - }; - } - case FilterActionTypes.LOAD_ENTITY_PREVIEW_SUCCESS: { - return { - ...state, - preview: action.payload - }; - } - case FilterActionTypes.UPDATE_FILTER: { - const s = { - ...state, - changes: { - ...state.changes, - ...action.payload - } - }; - return s; - } - case FilterActionTypes.CLEAR_FILTER: - case FilterActionTypes.CANCEL_CREATE_FILTER: { - return { - ...initialState - }; - } - default: { - return state; - } - } -} - -export const getSelected = (state: FilterState) => state.selected; -export const getFilterChanges = (state: FilterState) => state.changes; -export const getPreview = (state: FilterState) => state.preview; diff --git a/ui/src/app/metadata/filter/reducer/index.spec.ts b/ui/src/app/metadata/filter/reducer/index.spec.ts deleted file mode 100644 index 0a136de68..000000000 --- a/ui/src/app/metadata/filter/reducer/index.spec.ts +++ /dev/null @@ -1,107 +0,0 @@ -import * as selectors from './index'; - -describe('filter selectors', () => { - describe('mergeFn', () => { - it('should return merged objects', () => { - expect(selectors.mergeFn({foo: 'bar' }, { resourceId: 'baz' })).toEqual({foo: 'bar', resourceId: 'baz'}); - }); - }); - - describe('isAdditionalFilter', () => { - it('should return filtered objects', () => { - const filters = [{ '@type': 'EntityAttributes' }]; - expect(selectors.filterTypeFn(filters)).toEqual(filters); - }); - - it('should return filtered objects', () => { - const filters = [{ '@type': 'EntityAttributes' }, { '@type': 'EntityRoleWhiteList' }]; - expect(selectors.filterTypeFn(filters).length).toBe(1); - }); - }); - - describe('isFilterPlugin', () => { - it('should return false for entity attributes type', () => { - expect(selectors.isFilterPlugin('EntityAttributes')).toBe(false); - }); - selectors.filterPluginTypes.forEach(type => { - it(`should return false for ${ type } type`, () => { - expect(selectors.isFilterPlugin(type)).toBe(true); - }); - }); - }); - - describe('isAdditionalFilter', () => { - it('should return false for entity attributes type', () => { - expect(selectors.isAdditionalFilter('EntityAttributes')).toBe(true); - }); - selectors.filterPluginTypes.forEach(type => { - it(`should return false for ${ type } type`, () => { - expect(selectors.isAdditionalFilter(type)).toBe(false); - }); - }); - }); - - describe('filterTypeFn', () => { - it('should return filtered objects', () => { - const filters = [{ '@type': 'EntityAttributes' }]; - expect(selectors.filterTypeFn(filters)).toEqual(filters); - }); - - it('should return filtered objects', () => { - const filters = [{ '@type': 'EntityAttributes' }, { '@type': 'EntityRoleWhiteList' }]; - expect(selectors.filterTypeFn(filters).length).toBe(1); - }); - }); - - describe('filterOrderFn', () => { - it('should return the ordered & filtered entities when they are not filter plugins', () => { - const filters = {'foo': { '@type': 'EntityAttributes' }}; - const order = ['foo']; - expect(selectors.filterOrderFn(filters, order)).toEqual(order); - }); - - it('should return entities that exist in the collection of additional filters', () => { - const filters = { 'foo': { '@type': 'EntityAttributes' } }; - const order = ['bar']; - expect(selectors.filterOrderFn(filters, order)).toEqual([]); - }); - - it('should return only additional filters', () => { - const filters = { 'foo': { '@type': 'EntityRoleWhiteList' } }; - const order = ['foo']; - expect(selectors.filterOrderFn(filters, order)).toEqual([]); - }); - - it('should return filtered objects', () => { - const filters = { 'foo': { '@type': 'EntityAttributes' }, 'bar': { '@type': 'EntityRoleWhiteList' }}; - const order = ['foo', 'bar']; - expect(selectors.filterOrderFn(filters, order).length).toBe(1); - }); - }); - - describe('pluginOrderFn', () => { - it('should return the ordered & filtered entities when they are filter plugins', () => { - const filters = { 'foo': { '@type': 'EntityRoleWhiteList' } }; - const order = ['foo']; - expect(selectors.pluginOrderFn(filters, order)).toEqual(order); - }); - - it('should return entities that exist in the collection of filter plugins', () => { - const filters = { 'foo': { '@type': 'EntityAttributes' } }; - const order = ['bar']; - expect(selectors.pluginOrderFn(filters, order)).toEqual([]); - }); - - it('should return only filter plugins', () => { - const filters = { 'foo': { '@type': 'EntityAttributes' } }; - const order = ['foo']; - expect(selectors.pluginOrderFn(filters, order)).toEqual([]); - }); - - it('should return filtered objects', () => { - const filters = { 'foo': { '@type': 'EntityAttributes' }, 'bar': { '@type': 'EntityRoleWhiteList' } }; - const order = ['foo', 'bar']; - expect(selectors.pluginOrderFn(filters, order).length).toBe(1); - }); - }); -}); diff --git a/ui/src/app/metadata/filter/reducer/index.ts b/ui/src/app/metadata/filter/reducer/index.ts deleted file mode 100644 index ee2da9bf3..000000000 --- a/ui/src/app/metadata/filter/reducer/index.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { createSelector, createFeatureSelector } from '@ngrx/store'; -import * as fromRoot from '../../../core/reducer'; -import * as fromFilter from './filter.reducer'; -import * as fromSearch from './search.reducer'; -import * as fromCollection from './collection.reducer'; -import * as fromEditor from './editor.reducer'; -import * as utils from '../../domain/domain.util'; -import { MetadataFilter } from '../../domain/model'; - -export interface FilterState { - filter: fromFilter.FilterState; - search: fromSearch.SearchState; - editor: fromEditor.EditorState; - collection: fromCollection.CollectionState; -} - -export const reducers = { - filter: fromFilter.reducer, - editor: fromEditor.reducer, - search: fromSearch.reducer, - collection: fromCollection.reducer -}; - -export interface State extends fromRoot.State { - 'filter': FilterState; -} - -export const getFiltersFromStateFn = (state: FilterState) => state.filter; -export const getSearchFromStateFn = (state: FilterState) => state.search; -export const getCollectionFromStateFn = (state: FilterState) => state.collection; -export const getEditorStateFn = (state: FilterState) => state.editor; - -export const getFilterState = createFeatureSelector('filter'); - -export const getFilterFromState = createSelector(getFilterState, getFiltersFromStateFn); - -export const getSelected = createSelector(getFilterFromState, fromFilter.getSelected); -export const getFilter = createSelector(getFilterFromState, fromFilter.getFilterChanges); -export const getPreview = createSelector(getFilterFromState, fromFilter.getPreview); -export const getEditorState = createSelector(getFilterState, getEditorStateFn); - - -/* - * Select pieces of Search Collection -*/ - -export const getSearchFromState = createSelector(getFilterState, getSearchFromStateFn); -export const getEntityCollection = createSelector(getSearchFromState, fromSearch.getEntityIds); -export const getIsLoading = createSelector(getSearchFromState, fromSearch.getLoading); -export const getError = createSelector(getSearchFromState, fromSearch.getError); -export const getTerm = createSelector(getSearchFromState, fromSearch.getTerm); -export const getViewingMore = createSelector(getSearchFromState, fromSearch.getViewMore); - -/* - * Select pieces of Filter Collection -*/ -export const getCollectionState = createSelector(getFilterState, getCollectionFromStateFn); -export const getAllFilters = createSelector(getCollectionState, fromCollection.selectAllFilters); -export const getCollectionSaving = createSelector(getCollectionState, fromCollection.getIsSaving); -export const getCollectionOrder = createSelector(getCollectionState, fromCollection.getOrder); - -export const getFilterEntities = createSelector(getCollectionState, fromCollection.selectFilterEntities); -export const getSelectedFilterId = createSelector(getCollectionState, fromCollection.getSelectedFilterId); -export const getSelectedFilter = createSelector(getFilterEntities, getSelectedFilterId, utils.getInCollectionFn); -export const getFilterIds = createSelector(getCollectionState, fromCollection.selectFilterIds); -export const getFilterCollectionIsLoaded = createSelector(getCollectionState, fromCollection.getIsLoaded); - -export const filterPluginTypes = ['RequiredValidUntil', 'SignatureValidation', 'EntityRoleWhiteList']; -export const isAdditionalFilter = (type) => filterPluginTypes.indexOf(type) === -1; -export const isFilterPlugin = (type) => filterPluginTypes.indexOf(type) >= 0; - -export const filterTypeFn = filters => [...filters.filter(f => isAdditionalFilter(f['@type']))]; -export const filterOrderFn = (filters, order) => order.filter(id => filters.hasOwnProperty(id) && isAdditionalFilter(filters[id]['@type'])); -export const pluginOrderFn = (filters, order) => order.filter(id => filters.hasOwnProperty(id) && isFilterPlugin(filters[id]['@type'])); - -export const getFilterList = createSelector(getAllFilters, filterTypeFn); -export const getAdditionalFilterOrder = createSelector(getFilterEntities, getCollectionOrder, filterOrderFn); -export const getAdditionalFilters = createSelector(getFilterList, getAdditionalFilterOrder, utils.mergeOrderFn); -export const getPluginFilterOrder = createSelector(getFilterEntities, getCollectionOrder, pluginOrderFn); - -export const getFilterNames = createSelector(getAllFilters, (filters: MetadataFilter[]) => filters.map(f => f.name).filter(f => !!f)); - -/* -Editor State -*/ - -export const getEditorIsValid = createSelector(getEditorState, fromEditor.isEditorValid); -export const getFormStatus = createSelector(getEditorState, fromEditor.getFormStatus); -export const getInvalidEditorForms = createSelector(getEditorState, fromEditor.getInvalidForms); - - -/* - * Combine pieces of State -*/ - -export const mergeFn = (changes, filter) => ({ ...filter, ...changes }); -export const detectFilterType = (changes) => changes.type ? changes.type : changes.hasOwnProperty('@type') ? changes['@type'] : null; - -export const getFilterWithChanges = createSelector(getFilter, getSelectedFilter, mergeFn); -export const getFilterType = createSelector(getFilter, (changes: MetadataFilter) => changes ? detectFilterType(changes) : null); - -export const getFilterIsValid = createSelector(getEditorIsValid, getFilterType, getFormStatus, (isValid, type, status) => { - return isValid && type !== null && Object.keys(status).length > 0; -}); - -export const cantSaveFilter = createSelector(getCollectionSaving, getFilterIsValid, (isSaving, isValid) => { - return (isSaving || !isValid); -}); \ No newline at end of file diff --git a/ui/src/app/metadata/filter/reducer/search.reducer.spec.ts b/ui/src/app/metadata/filter/reducer/search.reducer.spec.ts deleted file mode 100644 index 32af51486..000000000 --- a/ui/src/app/metadata/filter/reducer/search.reducer.spec.ts +++ /dev/null @@ -1,137 +0,0 @@ -import { reducer, initialState as snapshot } from './search.reducer'; -import * as fromFilter from './search.reducer'; -import { - SearchActionTypes, - ViewMoreIds, - CancelViewMore, - QueryEntityIds, - LoadEntityIdsError, - LoadEntityIdsSuccess, - ClearSearch -} from '../action/search.action'; -import { FilterCollectionActionTypes, UpdateFilterSuccess, AddFilterSuccess } from '../action/collection.action'; -import { EntityAttributesFilterEntity } from '../../domain/entity'; - -describe('Filter Reducer', () => { - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(snapshot, {} as any); - - expect(result).toEqual(snapshot); - }); - }); - - describe(`${SearchActionTypes.VIEW_MORE_IDS} action`, () => { - it('should set viewMore property to true', () => { - const result = reducer(snapshot, new ViewMoreIds('foo')); - - expect(result.viewMore).toBe(true); - }); - }); - - describe(`${SearchActionTypes.CANCEL_VIEW_MORE} action`, () => { - it('should set viewMore property to false', () => { - const result = reducer(snapshot, new CancelViewMore()); - - expect(result.viewMore).toBe(false); - }); - }); - - describe(`${SearchActionTypes.QUERY_ENTITY_IDS} action`, () => { - it('should set loading property to true', () => { - const result = reducer(snapshot, new QueryEntityIds({ term: 'foo' })); - - expect(result.loading).toBe(true); - }); - }); - - describe(`${SearchActionTypes.LOAD_ENTITY_IDS_SUCCESS} action`, () => { - it('should set loading property to false and the entityIds property to the provided payload', () => { - const ids = ['foo']; - const result = reducer(snapshot, new LoadEntityIdsSuccess(ids)); - - expect(result.loading).toBe(false); - expect(result.entityIds).toBe(ids); - }); - }); - - describe(`${SearchActionTypes.LOAD_ENTITY_IDS_ERROR} action`, () => { - it('should set loading property to false and the error property to the provided payload', () => { - const err = new Error('Foobar!'); - const result = reducer(snapshot, new LoadEntityIdsError(err)); - - expect(result.loading).toBe(false); - expect(result.error).toBe(err); - }); - }); - - describe(`${FilterCollectionActionTypes.UPDATE_FILTER_SUCCESS} action`, () => { - it('should reset the state', () => { - const update = { - id: 'foo', - changes: new EntityAttributesFilterEntity({ resourceId: 'foo', name: 'bar', createdDate: new Date().toLocaleDateString() }), - }; - const action = new UpdateFilterSuccess({ - update, - providerId: 'foo' - }); - const result = reducer(snapshot, action); - - expect(result).toEqual(snapshot); - }); - }); - - describe(`${FilterCollectionActionTypes.ADD_FILTER_SUCCESS} action`, () => { - it('should reset the state', () => { - const filter = new EntityAttributesFilterEntity( - { resourceId: 'foo', name: 'bar', createdDate: new Date().toLocaleDateString() } - ); - const action = new AddFilterSuccess({ - filter, - providerId: 'foo' - }); - const result = reducer(snapshot, action); - - expect(result).toEqual(snapshot); - }); - }); - - describe(`${SearchActionTypes.CLEAR_SEARCH} action`, () => { - it('should set saving to true', () => { - const result = reducer(snapshot, new ClearSearch()); - expect(result).toEqual(fromFilter.initialState); - }); - }); - - describe('selector methods', () => { - describe('getViewMore', () => { - it('should return the state viewMore', () => { - expect(fromFilter.getViewMore(snapshot)).toBe(snapshot.viewMore); - }); - }); - - describe('getEntityIds', () => { - it('should return the state entityIds', () => { - expect(fromFilter.getEntityIds(snapshot)).toBe(snapshot.entityIds); - }); - }); - - describe('getError', () => { - it('should return the state error', () => { - expect(fromFilter.getError(snapshot)).toBe(snapshot.error); - }); - }); - - describe('getLoading', () => { - it('should return the state loading', () => { - expect(fromFilter.getLoading(snapshot)).toBe(snapshot.loading); - }); - }); - - describe('getTerm', () => { - it('should return the state term', () => { - expect(fromFilter.getTerm(snapshot)).toBe(snapshot.term); - }); - }); - }); -}); diff --git a/ui/src/app/metadata/filter/reducer/search.reducer.ts b/ui/src/app/metadata/filter/reducer/search.reducer.ts deleted file mode 100644 index 1d63609e9..000000000 --- a/ui/src/app/metadata/filter/reducer/search.reducer.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { FilterActionsUnion, FilterActionTypes } from '../action/filter.action'; -import { SearchActionsUnion, SearchActionTypes } from '../action/search.action'; -import { FilterCollectionActionTypes, FilterCollectionActionsUnion } from '../action/collection.action'; - -export interface SearchState { - entityIds: string[]; - viewMore: boolean; - loading: boolean; - error: Error | null; - term: string; -} - -export const initialState: SearchState = { - entityIds: [], - viewMore: false, - loading: false, - error: null, - term: '', -}; - -export function reducer(state = initialState, action: SearchActionsUnion | FilterActionsUnion | FilterCollectionActionsUnion): SearchState { - switch (action.type) { - case SearchActionTypes.VIEW_MORE_IDS: { - return { - ...state, - viewMore: true - }; - } - case SearchActionTypes.CANCEL_VIEW_MORE: { - return { - ...state, - viewMore: false - }; - } - case SearchActionTypes.QUERY_ENTITY_IDS: { - return { - ...state, - loading: true, - term: action.payload.term - }; - } - case SearchActionTypes.LOAD_ENTITY_IDS_SUCCESS: { - return { - ...state, - loading: false, - error: null, - entityIds: action.payload - }; - } - case SearchActionTypes.LOAD_ENTITY_IDS_ERROR: { - return { - ...state, - loading: false, - error: action.payload - }; - } - case FilterCollectionActionTypes.ADD_FILTER_SUCCESS: - case FilterCollectionActionTypes.UPDATE_FILTER_SUCCESS: - case SearchActionTypes.CLEAR_SEARCH: - case FilterActionTypes.CANCEL_CREATE_FILTER: { - return { - ...initialState - }; - } - default: { - return state; - } - } -} - -export const getViewMore = (state: SearchState) => state.viewMore; -export const getEntityIds = (state: SearchState) => state.entityIds; -export const getError = (state: SearchState) => state.error; -export const getLoading = (state: SearchState) => state.loading; -export const getTerm = (state: SearchState) => state.term; diff --git a/ui/src/app/metadata/hoc/ComparisonContext.js b/ui/src/app/metadata/hoc/ComparisonContext.js new file mode 100644 index 000000000..5917a32db --- /dev/null +++ b/ui/src/app/metadata/hoc/ComparisonContext.js @@ -0,0 +1,8 @@ +import React from 'react'; + + + + +export function ComparisonContext () { + return (<>); +} \ No newline at end of file diff --git a/ui/src/app/metadata/hoc/Configuration.js b/ui/src/app/metadata/hoc/Configuration.js new file mode 100644 index 000000000..06bac7b0b --- /dev/null +++ b/ui/src/app/metadata/hoc/Configuration.js @@ -0,0 +1,11 @@ +import React from 'react'; +import { useMetadataConfiguration } from '../hooks/configuration'; + +export function Configuration ({entities, schema, definition, limited, children}) { + + const config = useMetadataConfiguration(entities, schema, definition, limited); + + return ( + <>{children(config)} + ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/hoc/FilterTargetPreview.js b/ui/src/app/metadata/hoc/FilterTargetPreview.js new file mode 100644 index 000000000..8bd8550d3 --- /dev/null +++ b/ui/src/app/metadata/hoc/FilterTargetPreview.js @@ -0,0 +1,55 @@ +import React from 'react'; +import API_BASE_PATH from '../../App.constant'; +import { useFetch } from 'use-http'; +import Modal from 'react-bootstrap/Modal'; +import Button from 'react-bootstrap/Button'; +import Translate from '../../i18n/components/translate'; +import { downloadAsXml } from '../../core/utility/download_as_xml'; + +export function FilterTargetPreview ({ entityId, children }) { + + const [show, setShow] = React.useState(false); + + const preview = () => { + setShow(true); + }; + + const handleClose = () => { + setShow(false); + }; + + //encodeURIComponent(id) + /*eaders: new HttpHeaders({ + 'Accept': 'application/xml' + }), + responseType: 'text'*/ + + const { data, loading } = useFetch(`${API_BASE_PATH}/entities/${ encodeURIComponent(entityId) }`, { + cachePolicy: 'no-cache', + headers: { + 'Content-Type': 'application/xml', + 'Accept': 'application/xml' + }, + responseType: 'text' + }, [entityId]); + + return ( + + {children(preview, loading, data)} + + + Preview XML + +
{data}
+ + + + +
+
+ ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/hoc/MetadataAttributes.js b/ui/src/app/metadata/hoc/MetadataAttributes.js new file mode 100644 index 000000000..c4c59d3c0 --- /dev/null +++ b/ui/src/app/metadata/hoc/MetadataAttributes.js @@ -0,0 +1,34 @@ +import React from 'react'; +import { useMetadataAttribute, useMetadataAttributes } from '../hooks/api'; + +export function MetadataAttributes ({children}) { + + const { get, response } = useMetadataAttributes({ + cachePolicy: 'no-cache' + }); + + const attrApi = useMetadataAttribute(); + + const { del } = attrApi; + + const [attributes, setAttributes] = React.useState([]); + + async function loadAttributes() { + const list = await get(``); + if (response.ok) { + setAttributes(list); + } + } + + async function removeAttribute(id) { + await del(`/${id}`); + if (attrApi.response.ok) { + loadAttributes(); + } + } + + /*eslint-disable react-hooks/exhaustive-deps*/ + React.useEffect(() => { loadAttributes() }, []); + + return (<>{children(attributes, removeAttribute)}); +} \ No newline at end of file diff --git a/ui/src/app/metadata/hoc/MetadataFilterSelector.js b/ui/src/app/metadata/hoc/MetadataFilterSelector.js new file mode 100644 index 000000000..79d422db1 --- /dev/null +++ b/ui/src/app/metadata/hoc/MetadataFilterSelector.js @@ -0,0 +1,46 @@ +import React from 'react'; +import { useLocation, useParams } from 'react-router'; +import { useMetadataFilters } from '../hooks/api'; + +export const MetadataFilterContext = React.createContext(); + +/*eslint-disable react-hooks/exhaustive-deps*/ +export function MetadataFilterSelector({ children }) { + + let { id, filterId } = useParams(); + const location = useLocation(); + + React.useEffect(() => { + if (location.state?.refresh) { + loadFilter(id); + } + }, [location, id]) + + const { get, response } = useMetadataFilters(id, { + cachePolicy: 'no-cache' + }); + + const [filter, setFilter] = React.useState([]); + + async function loadFilter(filterId) { + const f = await get(`/${filterId}`); + if (response.ok) { + setFilter(f); + } + } + React.useEffect(() => { loadFilter(filterId) }, [id]); + + return ( + + {filter && filter.version && + {children} + } + + ); +} + +export function useMetadataFilterObject () { + return React.useContext(MetadataFilterContext); +} + +export default MetadataFilterSelector; \ No newline at end of file diff --git a/ui/src/app/metadata/hoc/MetadataFormContext.js b/ui/src/app/metadata/hoc/MetadataFormContext.js new file mode 100644 index 000000000..12fd598e8 --- /dev/null +++ b/ui/src/app/metadata/hoc/MetadataFormContext.js @@ -0,0 +1,157 @@ +import React from 'react'; + +import uniq from 'lodash/uniq'; +import intersection from 'lodash/intersection'; + +import { MetadataDefinitionContext, MetadataSchemaContext } from './MetadataSchema'; +import { MetadataObjectContext } from './MetadataSelector'; + + +const initialState = { + metadata: {}, + errors: [] +}; + +const MetadataFormContext = React.createContext(); + +const { Provider, Consumer } = MetadataFormContext; + +export const MetadataFormActions = { + SET_FORM_ERROR: 'set form error', + SET_FORM_DATA: 'set form data' +}; + +export const setFormDataAction = (payload) => { + return { + type: MetadataFormActions.SET_FORM_DATA, + payload + } +} + +export const setFormErrorAction = (errors) => { + return { + type: MetadataFormActions.SET_FORM_ERROR, + payload: errors + } +} + +function reducer(state, action) { + switch (action.type) { + case MetadataFormActions.SET_FORM_ERROR: + return { + ...state, + errors: action.payload + }; + case MetadataFormActions.SET_FORM_DATA: + return { + ...state, + metadata: action.payload + }; + default: + return state; + } +} + +/*eslint-disable react-hooks/exhaustive-deps*/ +function MetadataForm({ children, initial = {} }) { + + const metadata = { + ...useFormattedMetadata(initial) + }; + + const [state, dispatch] = React.useReducer(reducer, { + ...initialState, + metadata + }); + + + const contextValue = React.useMemo(() => ({ state, dispatch }), [state, dispatch]); + + return ( + + {children} + + ); +} + +function useFormErrors () { + const { state } = React.useContext(MetadataFormContext); + const { errors } = state; + + return errors; +} + +function useExtraErrors (metadata, validator) { + return validator(metadata); +} + +function usePagesWithErrors(definition) { + const errorList = useFormErrors(); + const erroredProperties = uniq(errorList.map((e) => { + if (!e.hasOwnProperty('property')) { + return 'common'; + } + let name = e.property.split('.').filter((p) => !!p && p !== "")[0]; + if (name.indexOf('[')) { + name = name.split('[')[0]; + } + return name; + })); + + const pages = definition.steps.reduce((list, step) => { + const intersectionFields = intersection(step.fields, erroredProperties); + if (intersectionFields.length > 0) { + list = [...list, step.id]; + } + return list; + }, []); + + return pages; +} + +function useFormattedMetadata(initial = {}) { + const definition = React.useContext(MetadataDefinitionContext); + const schema = React.useContext(MetadataSchemaContext); + const obj = React.useContext(MetadataObjectContext); + return definition.formatter(initial ? initial : obj, schema); +} + +function useMetadataFormContext () { + return React.useContext(MetadataFormContext); +} + +function useMetadataFormDispatcher () { + const { dispatch } = useMetadataFormContext(); + return dispatch; +} + +function useMetadataFormState () { + const { state } = useMetadataFormContext(); + return state; +} + +function useMetadataFormData() { + const { metadata } = useMetadataFormState(); + return metadata; +} + +function useMetadataFormErrors() { + const { errors } = useMetadataFormState(); + return errors; +} + +export { + usePagesWithErrors, + useFormErrors, + useFormattedMetadata, + useMetadataFormContext, + useMetadataFormDispatcher, + useMetadataFormState, + useMetadataFormData, + useMetadataFormErrors, + useExtraErrors, + MetadataForm, + MetadataFormContext, + Provider as MetadataFormProvider, + Consumer as MetadataFormConsumer +}; \ No newline at end of file diff --git a/ui/src/app/metadata/hoc/MetadataSchema.js b/ui/src/app/metadata/hoc/MetadataSchema.js new file mode 100644 index 000000000..ec6dd49f0 --- /dev/null +++ b/ui/src/app/metadata/hoc/MetadataSchema.js @@ -0,0 +1,50 @@ +import React from 'react'; +import { getDefinition, getWizard } from '../domain/index'; +import useFetch from 'use-http'; + +export const MetadataSchemaContext = React.createContext(); +export const MetadataDefinitionContext = React.createContext(); + +export function MetadataSchema({ type, children, wizard = false }) { + + const definition = React.useMemo(() => wizard ? getWizard(type) : getDefinition(type), [type, wizard]); + + const { get, response } = useFetch(``, {}, []); + + const [schema, setSchema] = React.useState(); + + async function loadSchema(d) { + const source = await get(`/${d.schema}`) + if (response.ok) { + setSchema(source); + } + } + + /*eslint-disable react-hooks/exhaustive-deps*/ + React.useEffect(() => { + setSchema(null); + loadSchema(definition); + }, [definition]); + + return ( + + {type && definition && schema && + + {children} + + } + + ); +} + +export function useMetadataSchemaContext () { + return React.useContext(MetadataSchemaContext); +} + +export function useMetadataDefinitionContext() { + return React.useContext(MetadataDefinitionContext); +} + +//getConfigurationSections + +export default MetadataSchema; \ No newline at end of file diff --git a/ui/src/app/metadata/hoc/MetadataSelector.js b/ui/src/app/metadata/hoc/MetadataSelector.js new file mode 100644 index 000000000..7d7155066 --- /dev/null +++ b/ui/src/app/metadata/hoc/MetadataSelector.js @@ -0,0 +1,53 @@ +import React from 'react'; +import { useLocation, useParams } from 'react-router'; +import { useMetadataEntity } from '../hooks/api'; + +export const MetadataTypeContext = React.createContext(); +export const MetadataObjectContext = React.createContext(); + +/*eslint-disable react-hooks/exhaustive-deps*/ +export function MetadataSelector({ children, ...props }) { + + let { type, id } = useParams(); + const location = useLocation(); + + if (!type) { + type = props.type; + } + + React.useEffect(() => { + if (location.state?.refresh) { + loadMetadata(id); + } + }, [location, id]) + + const { get, response } = useMetadataEntity(type); + + const [metadata, setMetadata] = React.useState([]); + + async function loadMetadata(id) { + const source = await get(`/${id}`); + if (response.ok) { + setMetadata(source); + } + } + React.useEffect(() => { loadMetadata(id) }, [id]); + + return ( + <> + {type && + + {metadata && metadata.version && + {children(metadata)} + } + + } + + ); +} + +export function useMetadataObject () { + return React.useContext(MetadataObjectContext); +} + +export default MetadataSelector; \ No newline at end of file diff --git a/ui/src/app/metadata/hoc/MetadataVersionLoader.js b/ui/src/app/metadata/hoc/MetadataVersionLoader.js new file mode 100644 index 000000000..b14e0f59a --- /dev/null +++ b/ui/src/app/metadata/hoc/MetadataVersionLoader.js @@ -0,0 +1,38 @@ +import React from 'react'; +import { useParams } from 'react-router-dom'; +import { useMetadataEntity } from '../hooks/api'; + +export const MetadataVersionContext = React.createContext(); + +const { Provider } = MetadataVersionContext; + +export function MetadataVersionLoader({children}) { + + const { type, id, versionId } = useParams(); + + const [metadata, setMetadata] = React.useState(); + + const { get, response } = useMetadataEntity(type, { + cachePolicy: 'no-cache', + }, []); + + async function loadVersion(v) { + const l = await get(`/${id}/Versions/${v}`); + if (response.ok) { + setMetadata(l); + } + } + + /*eslint-disable react-hooks/exhaustive-deps*/ + React.useEffect(() => { + loadVersion(versionId); + }, [versionId]); + + return ( + <> + {metadata && + {children(metadata)} + } + + ); +} diff --git a/ui/src/app/metadata/hoc/MetadataVersionsLoader.js b/ui/src/app/metadata/hoc/MetadataVersionsLoader.js new file mode 100644 index 000000000..025cea743 --- /dev/null +++ b/ui/src/app/metadata/hoc/MetadataVersionsLoader.js @@ -0,0 +1,49 @@ +import React from 'react'; +import { useParams } from 'react-router'; +import { getMetadataPath } from '../hooks/api'; +import API_BASE_PATH from '../../App.constant'; +import useFetch from 'use-http'; +import { last } from 'lodash'; + +export function MetadataVersionsLoader ({versions, children}) { + + const ref = React.useRef({}); + const [list, setList] = React.useState({}); + + const { type, id } = useParams(); + + const { get, response } = useFetch(`/${API_BASE_PATH}${getMetadataPath(type)}/${id}/Versions`, { + cachePolicy: 'no-cache', + }, []); + + async function loadVersion(v) { + const l = await get(`/${v}`); + if (response.ok) { + addToList(v, l); + if (last(versions) !== v) { + loadNext(versions[versions.indexOf(v) + 1]); + } + } + } + + function addToList(version, item) { + ref.current = { + ...ref.current, + [version]: item + }; + setList(ref.current); + } + + function loadNext (v) { + loadVersion(v); + } + + /*eslint-disable react-hooks/exhaustive-deps*/ + React.useEffect(() => { + loadNext(versions[0]); + }, [versions]); + + return ( + {children(versions.map(v => list[v]).filter(v => !!v))} + ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/hoc/MetadataXmlLoader.js b/ui/src/app/metadata/hoc/MetadataXmlLoader.js new file mode 100644 index 000000000..ffc1c8bcf --- /dev/null +++ b/ui/src/app/metadata/hoc/MetadataXmlLoader.js @@ -0,0 +1,36 @@ +import React from 'react'; +import { useParams } from 'react-router'; +import { useMetadataEntityXml } from '../hooks/api'; + +export const MetadataXmlContext = React.createContext(); + +export function MetadataXmlLoader({ children }) { + + let { type, id } = useParams(); + + const { get, response } = useMetadataEntityXml(type); + + const [xml, setXml] = React.useState(); + + async function loadMetadataXml(id) { + const data = await get(`/${id}`) + if (response.ok) { + setXml(data); + } + } + + /*eslint-disable react-hooks/exhaustive-deps*/ + React.useEffect(() => { + if (type === 'source') { + loadMetadataXml(id) + } + }, [id]); + + return ( + + {children} + + ); +} + +export default MetadataXmlLoader; \ No newline at end of file diff --git a/ui/src/app/metadata/hooks/api.js b/ui/src/app/metadata/hooks/api.js new file mode 100644 index 000000000..d951b66a4 --- /dev/null +++ b/ui/src/app/metadata/hooks/api.js @@ -0,0 +1,132 @@ +import useFetch from 'use-http'; + +import API_BASE_PATH from '../../App.constant'; +import { useContentionDispatcher, openContentionModalAction } from '../contention/ContentionContext'; + +import {MetadataFilterTypes} from '../domain/filter'; + +const lists = { + source: 'EntityDescriptors', + provider: 'MetadataResolvers' +}; + +const details = { + source: 'EntityDescriptor', + provider: 'MetadataResolvers' +} + +const schema = { + source: 'MetadataSources' +} + +export function getMetadataPath(type) { + return `/${details[type]}`; +} + +export function useNonAdminSources() { + return useFetch(`/${getMetadataPath('source')}/disabledNonAdmin`); +} + +export function getMetadataListPath(type) { + return `/${lists[type]}`; +} + +export function getSchemaPath(type) { + return `/${schema[type]}`; +} + +export function useMetadataEntities(type = 'source', opts = {}, onMount) { + return useFetch(`${API_BASE_PATH}${getMetadataListPath(type)}`, opts, onMount); +} + +export function useMetadataEntity(type = 'source', opts = { + cachePolicy: 'no-cache' +}) { + return useFetch(`${API_BASE_PATH}${getMetadataPath(type)}`, opts); +} + +export function useMetadataFilters(id, opts = { + cachePolicy: 'no-cache' +}, onMount) { + return useFetch(`${API_BASE_PATH}${getMetadataPath('provider')}/${id}/Filters`, opts, onMount); +} + +export function useMetadataEntityXml(type = 'source', opts = { + interceptors: { + request: ({options}) => { + options.headers['Accept'] = 'application/xml'; + return options; + } + } +}) { + return useFetch(`${API_BASE_PATH}${getMetadataPath(type)}`, opts); +} + +export function useMetadataProviderOrder() { + return useFetch(`${API_BASE_PATH}/MetadataResolversPositionOrder`); +} + +export function useMetadataHistory(type, id, opts = {}, i) { + + return useFetch(`${API_BASE_PATH}${getMetadataPath(type)}/${id}/Versions`, opts, i); + + // EntityDescriptor/d07d6122-0dd2-433e-baec-b76413b4c842/Versions + // MetadataResolvers/4161d661-2be7-4110-9e91-539669a691e3/Versions +} + +export function useMetadataSources(opts = {}, onMount) { + return useFetch(`${API_BASE_PATH}${getMetadataListPath('source')}`, opts, onMount); +} + +export function useMetadataProviders(opts = {}, onMount) { + return useFetch(`${API_BASE_PATH}${getMetadataListPath('provider')}`, opts, onMount); +} + +export function useMetadataProviderTypes(opts = {}, onMount = null) { + return useFetch(`${API_BASE_PATH}/ui/MetadataResolver/types`, opts, onMount); +} + +export function useMetadataFilterTypes () { + return MetadataFilterTypes; +} + +export function useMetadataUpdater (path, current) { + const { request, put, get, error, response, ...props } = useFetch(path, { + cachePolicy: 'no-cache' + }); + + const dispatch = useContentionDispatcher(); + + async function update (p, body) { + const req = await put(p, body); + if (response.status === 409) { + const latest = await get(p); + return new Promise((resolve, reject) => { + dispatch(openContentionModalAction(current, latest, body, async (resolution) => { + resolve(await update(p, resolution)); + }, () => { + reject(); + })); + }); + } + return Promise.resolve(req); + } + + return { + ...props, + request, + response, + update, + error + } +} + +export function useMetadataAttributes (opts = {}, onMount) { + // + return useFetch(`${API_BASE_PATH}/custom/entity/attributes`, opts, onMount); +} + +export function useMetadataAttribute(opts = {}, onMount) { + // + return useFetch(`${API_BASE_PATH}/custom/entity/attribute`, opts, onMount); +} \ No newline at end of file diff --git a/ui/src/app/metadata/hooks/configuration.js b/ui/src/app/metadata/hooks/configuration.js new file mode 100644 index 000000000..dc23b874f --- /dev/null +++ b/ui/src/app/metadata/hooks/configuration.js @@ -0,0 +1,22 @@ +import { getConfigurationSections, getLimitedPropertiesFn } from './schema'; + +export const getLimitedConfigurationsFn = (configurations, limited) => { + return configurations ? ({ + ...configurations, + sections: !limited ? configurations.sections : + configurations.sections.map(s => ({ + ...s, + properties: getLimitedPropertiesFn(s.properties), + })) + }) : configurations; +}; + + +export function useMetadataConfiguration(models, schema, definition, limited = false) { + + if (!models || !schema || !definition) { + return {}; + } + + return getLimitedConfigurationsFn(getConfigurationSections(models, definition, schema), limited); +} diff --git a/ui/src/app/metadata/hooks/schema.js b/ui/src/app/metadata/hooks/schema.js new file mode 100644 index 000000000..ecde47f05 --- /dev/null +++ b/ui/src/app/metadata/hooks/schema.js @@ -0,0 +1,56 @@ +import React from 'react'; +import { useIsAdmin } from '../../core/user/UserContext'; + +export const fillInRootProperties = (keys, ui) => keys.reduce((sch, key, idx) => { + if (!sch.hasOwnProperty(key)) { + sch[key] = {}; + } + return sch; +}, ui); + +export function useUiSchema(definition, schema, current, locked = true) { + + const ui = React.useMemo(() => definition ? { ...definition.uiSchema } : {}, [definition]); + const schemaKeys = React.useMemo(() => schema ? Object.keys(schema.properties) : [], [schema]); + const step = React.useMemo(() => definition ? definition.steps.find(step => step.id === current) : {fields: []}, [definition, current]); + + const filled = React.useMemo(() => fillInRootProperties(schemaKeys, ui), [schemaKeys, ui]); + const mapped = React.useMemo(() => Object.keys(filled).reduce((sch, key) => { + const obj = { ...filled[key] }; + if (step.fields.indexOf(key) === -1) { + obj["ui:widget"] = 'hidden'; + } + sch[key] = obj; + return sch; + }, {}), [filled, step]); + + const isLocked = React.useMemo(() => ( + { + ...mapped, + 'ui:disabled': locked && step.locked ? true : false + } + ), [mapped, step.locked, locked]); + + const isAdmin = useIsAdmin(); + + const hideEnableFromNonAdmins = React.useMemo(() => { + if (!isAdmin) { + return { + ...isLocked, + serviceEnabled: { + 'ui:widget': 'hidden' + } + }; + } + return isLocked; + }, [isAdmin, isLocked]); + + return { uiSchema: hideEnableFromNonAdmins, step}; +} + + +export function useMetadataSchema(definition, schema) { + return definition.schemaPreprocessor ? definition.schemaPreprocessor(schema) : schema; +} + +export * from './utility'; \ No newline at end of file diff --git a/ui/src/app/metadata/hooks/schema.test.js b/ui/src/app/metadata/hooks/schema.test.js new file mode 100644 index 000000000..1679ba221 --- /dev/null +++ b/ui/src/app/metadata/hooks/schema.test.js @@ -0,0 +1,31 @@ +import React from 'react'; +import { useUiSchema } from './schema'; + +import { SourceEditor } from '../domain/source/SourceDefinition'; + +import jsonSchema from '../../../testing/sourceSchema'; +import uiSchemaResult from '../../../testing/uiSchema'; + +import { useIsAdmin } from '../../core/user/UserContext'; +jest.mock('../../core/user/UserContext'); + +describe('useUiSchema', () => { + let realUseMemo; + let useMemoMock; + beforeEach(() => { + realUseMemo = React.useMemo; + useMemoMock = React.useMemo = (cb) => cb(); + }); + // Cleanup mock + afterEach(() => { + React.useMemo = realUseMemo; + }); + + test('should return a parsed ui schema', () => { + useIsAdmin.mockResolvedValue(false); + + const { uiSchema } = useUiSchema(SourceEditor, jsonSchema, 'common') + expect(uiSchema).toEqual(uiSchemaResult); + }) + +}); \ No newline at end of file diff --git a/ui/src/app/metadata/hooks/utility.js b/ui/src/app/metadata/hooks/utility.js new file mode 100644 index 000000000..653448c25 --- /dev/null +++ b/ui/src/app/metadata/hooks/utility.js @@ -0,0 +1,221 @@ +import { detailedDiff } from "deep-object-diff"; +import { removeNull } from "../../core/utility/remove_null"; + +export const checkChanges = (original, updates) => { + const diff = detailedDiff(removeNull(original, true), removeNull(updates, true)); + const hasChanges = Object.keys(diff).some(d => Object.keys(diff[d]).length > 0); + return hasChanges; +} + +export function getDefinition(path, definitions) { + let def = path.split('/').pop(); + return definitions[def]; +} + +export function getPropertyItemSchema(items, definitions) { + if (!items) { return null; } + return items.$ref ? getDefinition(items.$ref, definitions) : items; +} + +export function getStepProperty(property, model, definitions) { + if (!property) { return null; } + property = property.$ref ? { ...property, ...getDefinition(property.$ref, definitions) } : property; + return { + ...property, + name: property.title, + value: model, + type: property.type, + items: getPropertyItemSchema(property.items, definitions), + properties: getStepProperties( + property, + model, + definitions + ) + }; +} + + +export function getStepProperties(schema, model, definitions = {}) { + if (!schema || !schema.properties) { return []; } + return Object + .keys(schema.properties) + .map(property => { + return { + ...getStepProperty( + schema.properties[property], + model && model.hasOwnProperty(property) ? model[property] : null, + definitions + ), + id: property + }; + }); +} + + +function omit(key, obj) { + if (!obj) { + return obj; + } + const { [key]: omitted, ...rest } = obj; + return rest; +} + +export const rollupDifferences = (prop) => { + let updates = { + ...prop + }; + + if (prop.properties) { + updates = { + ...updates, + properties: [ + ...prop.properties.map(p => rollupDifferences(p)) + ] + }; + } + + prop.differences = prop.properties.some(p => p.differences); + + return updates; +}; + +export const getConfigurationSections = (models, definition, schema) => { + return !definition || !schema || !models ? null : + ({ + dates: models.map(m => m ? m.modifiedDate : null), + sections: definition.steps + .filter(step => step.id !== 'summary') + .map( + (step, num) => { + return ({ + id: step.id, + pageNumber: num + 1, + index: step.index, + label: step.label, + properties: getStepProperties( + getSplitSchema(schema, step), + definition.display({}), + schema.definitions || {} + ) + }); + } + ) + .map((section) => { + return { + ...section, + properties: assignValueToProperties(models, section.properties, definition, schema) + }; + }) + .map((section) => ({ + ...section, + differences: section.properties.some(prop => prop.differences) + })) + }); +}; + +const getDifferences = (models, prop) => { + return models.some((model, index, array) => { + if (!array) { + return false; + } + const prop1 = omit('modifiedDate', model[prop.id]); + const prop2 = omit('modifiedDate', array[0][prop.id]); + return JSON.stringify(prop1) !== JSON.stringify(prop2); + }); +}; + +export const assignValueToProperties = (models, properties, definition, schema) => { + return properties.map(prop => { + const differences = getDifferences(models, prop); + + const items = prop.type === 'array' && prop.items?.enum ? ({ + ...prop.items, + enum: prop.items.enum.map(item => ({ + key: item, + label: `label.attribute-${item}`, + differences: models + .map((model) => { + const value = model[prop.id]; + return value ? value.indexOf(item) > -1 : false; + }) + .reduce((current, val) => current !== val ? true : false, false) + })) + }) : null; + + switch (prop.type) { + case 'object': + return { + ...prop, + properties: assignValueToProperties( + models.map(model => definition.display(model, schema)[prop.id] || {}), + prop.properties, + definition, + schema + ), + differences: getDifferences(models, prop) + }; + default: + return { + ...prop, + differences, + value: models.map(model => { + return model[prop.id]; + }), + items: { + ...prop.items, + ...items + } + }; + } + }); +}; + +export const getLimitedPropertiesFn = (properties) => { + return ([ + ...properties + .filter(p => p.differences) + .map(p => { + const parsed = { ...p }; + if (p.properties) { + parsed.properties = getLimitedPropertiesFn(p.properties); + } + return parsed; + }) + ]); +}; + +export const getSplitSchema = (schema, step) => { + if (!schema || !step || !step.fields || !step.fields.length || !schema.properties) { + return schema; + } + const keys = Object.keys(schema.properties).filter(key => step.fields.indexOf(key) > -1); + const required = (schema.required || []).filter(val => keys.indexOf(val) > -1); + let s = { + type: schema.type, + properties: { + ...keys.reduce((properties, key) => ({ ...properties, [key]: schema.properties[key] }), {}) + } + }; + + if (step.override) { + Object.keys(step.override).forEach(key => { + let override = step.override[key]; + if (s.properties.hasOwnProperty(key)) { + s.properties[key] = { ...s.properties[key], ...override }; + } + }); + } + + if (step.order) { + s.order = step.order; + } + + if (schema.definitions) { + s.definitions = schema.definitions; + } + if (required && required.length) { + s.required = required; + } + + return s; +}; diff --git a/ui/src/app/metadata/domain/utility/configuration.spec.ts b/ui/src/app/metadata/hooks/utility.test.js similarity index 84% rename from ui/src/app/metadata/domain/utility/configuration.spec.ts rename to ui/src/app/metadata/hooks/utility.test.js index 336b71464..9faaebec2 100644 --- a/ui/src/app/metadata/domain/utility/configuration.spec.ts +++ b/ui/src/app/metadata/hooks/utility.test.js @@ -1,6 +1,5 @@ -import { getStepProperties, getDefinition, getPropertyItemSchema, getStepProperty } from './configuration'; -import * as utils from './configuration'; -import { SCHEMA } from '../../../../testing/form-schema.stub'; +import { getStepProperties, getDefinition, getPropertyItemSchema, getStepProperty } from './utility'; +import SCHEMA from '../../../testing/simpleSchema'; describe('domain utility functions', () => { describe('getStepProperties function', () => { @@ -22,7 +21,7 @@ describe('domain utility functions', () => { description: 'baz', type: 'string' }; - expect(getDefinition('/foo/bar', {bar: definition})).toBe(definition); + expect(getDefinition('/foo/bar', { bar: definition })).toBe(definition); }); }); @@ -31,7 +30,7 @@ describe('domain utility functions', () => { expect(getPropertyItemSchema(null, SCHEMA.definitions)).toBeNull(); }); it('should retrieve the definitions from the items schema', () => { - expect(getPropertyItemSchema({$ref: 'description'}, SCHEMA.definitions)).toBe(SCHEMA.definitions.description); + expect(getPropertyItemSchema({ $ref: 'description' }, SCHEMA.definitions)).toBe(SCHEMA.definitions.description); }); it('should return the item itself if no $ref', () => { let item = {}; diff --git a/ui/src/app/metadata/manager/action/search.action.ts b/ui/src/app/metadata/manager/action/search.action.ts deleted file mode 100644 index c10361a81..000000000 --- a/ui/src/app/metadata/manager/action/search.action.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Action, MemoizedSelector } from '@ngrx/store'; -import { Metadata } from '../../domain/domain.type'; - -export enum DashboardSearchActionTypes { - ENTITY_SEARCH_COMPLETE = '[Metadata Entity Search] Entity Search COMPLETE', - ENTITY_FILTER = '[Metadata Entity Filter] Entity Filter', - ENTITY_SEARCH = '[Metadata Entity Search] Entity Search', -} - -/** - * Add Resolver to Collection Actions - */ -export class SearchAction implements Action { - readonly type = DashboardSearchActionTypes.ENTITY_SEARCH; - - constructor(public payload: { query: string, selector: MemoizedSelector }) { } -} - -export class FilterAction implements Action { - readonly type = DashboardSearchActionTypes.ENTITY_FILTER; - - constructor(public payload: string) { } -} - -export class SearchCompleteAction implements Action { - readonly type = DashboardSearchActionTypes.ENTITY_SEARCH_COMPLETE; - - constructor(public payload: Array) { } -} - -export type DashboardSearchActionsUnion = - | SearchAction - | FilterAction - | SearchCompleteAction; diff --git a/ui/src/app/metadata/manager/component/delete-dialog.component.html b/ui/src/app/metadata/manager/component/delete-dialog.component.html deleted file mode 100644 index da1c2d8df..000000000 --- a/ui/src/app/metadata/manager/component/delete-dialog.component.html +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/ui/src/app/metadata/manager/component/delete-dialog.component.spec.ts b/ui/src/app/metadata/manager/component/delete-dialog.component.spec.ts deleted file mode 100644 index 4829741c6..000000000 --- a/ui/src/app/metadata/manager/component/delete-dialog.component.spec.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; - -import { NgbDropdownModule, NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; - -import { DeleteDialogComponent } from './delete-dialog.component'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(DeleteDialogComponent, { static: true }) - public componentUnderTest: DeleteDialogComponent; -} - -describe('Delete Dialog (modal) Component', () => { - - let app: DeleteDialogComponent; - let fixture: ComponentFixture; - let instance: TestHostComponent; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - RouterTestingModule - ], - declarations: [ - DeleteDialogComponent, - TestHostComponent - ], - providers: [ - { - provide: NgbActiveModal, - useValue: jasmine.createSpyObj('activeModal', [ - 'close', - 'dismiss' - ]) - } - ] - }).compileComponents(); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should compile without error', waitForAsync(() => { - expect(app).toBeTruthy(); - })); -}); diff --git a/ui/src/app/metadata/manager/component/delete-dialog.component.ts b/ui/src/app/metadata/manager/component/delete-dialog.component.ts deleted file mode 100644 index 0918addcd..000000000 --- a/ui/src/app/metadata/manager/component/delete-dialog.component.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Component, ChangeDetectionStrategy, Input, Output, EventEmitter } from '@angular/core'; - -import { MetadataProvider } from '../../domain/model/metadata-provider'; -import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; - -@Component({ - selector: 'delete-dialog', - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './delete-dialog.component.html' -}) -export class DeleteDialogComponent { - constructor( - public activeModal: NgbActiveModal - ) { } -} /* istanbul ignore next */ diff --git a/ui/src/app/metadata/manager/component/provider-search.component.html b/ui/src/app/metadata/manager/component/provider-search.component.html deleted file mode 100644 index 107d14797..000000000 --- a/ui/src/app/metadata/manager/component/provider-search.component.html +++ /dev/null @@ -1,25 +0,0 @@ -
-
- - -
- -
-
-
diff --git a/ui/src/app/metadata/manager/component/provider-search.component.ts b/ui/src/app/metadata/manager/component/provider-search.component.ts deleted file mode 100644 index c02932052..000000000 --- a/ui/src/app/metadata/manager/component/provider-search.component.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Component, Output, Input, EventEmitter, OnChanges } from '@angular/core'; -import { FormBuilder, FormGroup, FormControl, Validators } from '@angular/forms'; - -@Component({ - selector: 'provider-search', - templateUrl: './provider-search.component.html' -}) -export class ProviderSearchComponent implements OnChanges { - @Input() query = ''; - @Input() searching = false; - @Output() search = new EventEmitter(); - - searchForm: FormGroup; - - constructor(private fb: FormBuilder) { - this.searchForm = this.fb.group({ - search: [this.query] - }); - } - - ngOnChanges(): void { - this.searchForm.setValue({ - search: this.query - }); - } -} /* istanbul ignore next */ diff --git a/ui/src/app/metadata/manager/component/resolvers-list.component.html b/ui/src/app/metadata/manager/component/resolvers-list.component.html deleted file mode 100644 index 873ea754a..000000000 --- a/ui/src/app/metadata/manager/component/resolvers-list.component.html +++ /dev/null @@ -1,68 +0,0 @@ -
- - - - - - - - - - - - - - - - - - - - -
TitleEntity IDAuthorCreated DateEnabled
- {{ resolver.name }} - - {{ resolver.name }} - {{ resolver.getDisplayId() }}{{ resolver.createdBy ? resolver.createdBy : '—' }} - {{ resolver.getCreationDate() ? (resolver.getCreationDate() | customDate) : '—' }} - - - - - Incomplete Form - - - - - - - - - {{ (resolver.enabled ? 'value.enabled' : 'value.disabled') | translate }} - - - - -
-
\ No newline at end of file diff --git a/ui/src/app/metadata/manager/component/resolvers-list.component.spec.ts b/ui/src/app/metadata/manager/component/resolvers-list.component.spec.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/ui/src/app/metadata/manager/component/resolvers-list.component.ts b/ui/src/app/metadata/manager/component/resolvers-list.component.ts deleted file mode 100644 index dffee7c93..000000000 --- a/ui/src/app/metadata/manager/component/resolvers-list.component.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Component, ChangeDetectionStrategy, Input, Output, EventEmitter } from '@angular/core'; - -import { MetadataEntity } from '../../domain/model'; - -@Component({ - selector: 'resolvers-list', - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './resolvers-list.component.html', - styleUrls: [] -}) -export class ResolversListComponent { - @Input() entities: MetadataEntity[]; - - @Output() scroll: EventEmitter = new EventEmitter(); - @Output() delete: EventEmitter = new EventEmitter(); - - @Output() toggleEnabled: EventEmitter = new EventEmitter(); -} diff --git a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.html b/ui/src/app/metadata/manager/container/dashboard-providers-list.component.html deleted file mode 100644 index bacdb5f05..000000000 --- a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.html +++ /dev/null @@ -1,69 +0,0 @@ -
-
-
-
-
- Current Metadata Providers -
-
-
-
- - -
- - - - - - - - - - - - - - - - - - - -
OrderTitleProvider TypeAuthorCreated DateEnabled
-
-
{{ i + 1 }}
-
-   - - -
-
- {{ provider.name }} - {{ provider['@type'] }}{{ provider.createdBy }}{{ provider.createdDate | customDate }} - - {{ (provider.enabled ? 'value.enabled' : 'value.disabled') | translate }} - -
-
-
-
-
diff --git a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.spec.ts b/ui/src/app/metadata/manager/container/dashboard-providers-list.component.spec.ts deleted file mode 100644 index 9722eb24f..000000000 --- a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.spec.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { Router, RouterModule } from '@angular/router'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; -import { NgbPaginationModule, NgbModal, NgbModalModule } from '@ng-bootstrap/ng-bootstrap'; -import * as fromDashboard from '../reducer'; -import { ProviderSearchComponent } from '../component/provider-search.component'; -import { DeleteDialogComponent } from '../component/delete-dialog.component'; -import { RouterStub } from '../../../../testing/router.stub'; -import { NgbModalStub } from '../../../../testing/modal.stub'; -import { DashboardProvidersListComponent } from './dashboard-providers-list.component'; -import { MetadataProvider } from '../../domain/model'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { CustomDatePipe } from '../../../shared/pipe/date.pipe'; -import { of } from 'rxjs'; -import { InfiniteScrollModule } from 'ngx-infinite-scroll'; - - -describe('Dashboard Providers List Page', () => { - let fixture: ComponentFixture; - let store: Store; - let router: Router; - let modal: NgbModal; - let instance: DashboardProvidersListComponent; - - let provider = { - resourceId: 'foo', - name: 'bar' - }; - - let dispatchSpy, selectSpy; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - { provide: Router, useClass: RouterStub }, - { provide: NgbModal, useClass: NgbModalStub } - ], - imports: [ - NoopAnimationsModule, - StoreModule.forRoot({ - manager: combineReducers(fromDashboard.reducers), - }), - ReactiveFormsModule, - NgbPaginationModule, - NgbModalModule, - MockI18nModule, - InfiniteScrollModule, - RouterModule - ], - declarations: [ - DashboardProvidersListComponent, - ProviderSearchComponent, - DeleteDialogComponent, - CustomDatePipe - ], - }); - - fixture = TestBed.createComponent(DashboardProvidersListComponent); - instance = fixture.componentInstance; - store = TestBed.get(Store); - router = TestBed.get(Router); - modal = TestBed.get(NgbModal); - - dispatchSpy = spyOn(store, 'dispatch').and.callThrough(); - selectSpy = spyOn(store, 'select').and.returnValues(of([]), of({'foo': true})); - }); - - it('should compile', () => { - fixture.detectChanges(); - - expect(fixture).toBeDefined(); - }); - - describe('search method', () => { - it('should default to an empty string', () => { - instance.search(); - expect(store.dispatch).toHaveBeenCalled(); - const action = dispatchSpy.calls.mostRecent().args[0]; - expect(action.payload.query).toBe(''); - }); - - it('should search with the provided query string', () => { - instance.search('foo'); - expect(store.dispatch).toHaveBeenCalled(); - const action = dispatchSpy.calls.mostRecent().args[0]; - expect(action.payload.query).toBe('foo'); - }); - }); - - describe('edit method', () => { - it('should route to the edit page', () => { - const evt = new Event('a type'); - spyOn(router, 'navigate'); - spyOn(evt, 'preventDefault'); - instance.edit(provider, evt); - expect(evt.preventDefault).toHaveBeenCalled(); - expect(router.navigate).toHaveBeenCalledWith(['metadata', 'provider', provider.resourceId, 'edit']); - }); - }); - - describe('loadMore method', () => { - it('should call the page observable to emit the next value', (done: DoneFn) => { - instance.loadMore(5); - instance.page$.subscribe(val => { - expect(val).toBe(5); - expect(instance.page).toBe(5); - done(); - }); - }); - }); - - describe('onScroll method', () => { - it('should call the loadMore method', () => { - spyOn(instance, 'loadMore'); - instance.onScroll(new Event('scrolled')); - expect(instance.loadMore).toHaveBeenCalledWith(instance.page + 1); - }); - }); -}); diff --git a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.ts b/ui/src/app/metadata/manager/container/dashboard-providers-list.component.ts deleted file mode 100644 index 6a206d9a1..000000000 --- a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { Router } from '@angular/router'; -import { Observable, BehaviorSubject, combineLatest } from 'rxjs'; -import { Store } from '@ngrx/store'; - -import { ProviderState, getOrderedProvidersInSearch, getOrderedProviders } from '../../provider/reducer'; -import * as fromDashboard from '../reducer'; -import { map, startWith } from 'rxjs/operators'; -import { ChangeProviderOrderUp, ChangeProviderOrderDown } from '../../provider/action/collection.action'; -import { Metadata } from '../../domain/domain.type'; -import { MetadataProvider } from '../../domain/model'; -import { SearchAction } from '../action/search.action'; -import { withLatestFrom } from 'rxjs/operators'; - -@Component({ - selector: 'dashboard-providers-list', - templateUrl: './dashboard-providers-list.component.html', - styleUrls: ['./dashboard-providers-list.component.scss'] -}) - -export class DashboardProvidersListComponent implements OnInit { - - providers$: Observable; - searchQuery$: Observable; - loading$: Observable; - - total$: Observable; - page = 1; - limit = 20; - limited$: Observable; - - isSearching$: Observable; - - private subj: BehaviorSubject = new BehaviorSubject(this.page); - readonly page$: Observable = this.subj.asObservable(); - - constructor( - private store: Store, - private router: Router - ) { - const providers = this.store.select(fromDashboard.getSearchResults) as Observable; - this.providers$ = providers as Observable; - - this.searchQuery$ = store.select(fromDashboard.getSearchQuery); - this.loading$ = store.select(fromDashboard.getSearchLoading); - - this.total$ = this.providers$.pipe(map(list => list.length)); - - this.isSearching$ = this.searchQuery$.pipe(map(q => q.length > 0)); - - this.limited$ = combineLatest( - this.providers$, - this.page$ - ).pipe( - map(([list, page]) => { - let maxIndex = (page * this.limit) - 1, - minIndex = 0; - return list.filter((provider: Metadata, index: number) => (maxIndex >= index && index >= minIndex)); - }) - ); - } - - ngOnInit(): void { - this.search(); - } - - loadMore(index: number): void { - this.subj.next(index); - this.page = index; - } - - search(query: string = ''): void { - this.store.dispatch(new SearchAction({query, selector: getOrderedProviders})); - } - - onScroll(event: Event): void { - this.loadMore(this.page + 1); - } - - view(id: string, page: string): void { - this.router.navigate(['metadata', 'provider', id, page]); - } - - edit(provider: MetadataProvider, event: Event): void { - event.preventDefault(); - this.view(provider.resourceId, 'edit'); - } - - gotoFilters(provider: MetadataProvider): void { - this.view(provider.resourceId, 'filters'); - } - - updateOrderUp(provider: MetadataProvider): void { - this.store.dispatch(new ChangeProviderOrderUp(provider.resourceId)); - } - - updateOrderDown(provider: MetadataProvider): void { - this.store.dispatch(new ChangeProviderOrderDown(provider.resourceId)); - } -} diff --git a/ui/src/app/metadata/manager/container/dashboard-resolvers-list.component.html b/ui/src/app/metadata/manager/container/dashboard-resolvers-list.component.html deleted file mode 100644 index b9022c783..000000000 --- a/ui/src/app/metadata/manager/container/dashboard-resolvers-list.component.html +++ /dev/null @@ -1,19 +0,0 @@ -
-
-
- Current Metadata Sources -
-
- - - -
-
-
diff --git a/ui/src/app/metadata/manager/container/dashboard-resolvers-list.component.spec.ts b/ui/src/app/metadata/manager/container/dashboard-resolvers-list.component.spec.ts deleted file mode 100644 index 020734d76..000000000 --- a/ui/src/app/metadata/manager/container/dashboard-resolvers-list.component.spec.ts +++ /dev/null @@ -1,144 +0,0 @@ -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { Router, RouterModule } from '@angular/router'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; -import { InfiniteScrollModule } from 'ngx-infinite-scroll'; -import { NgbPaginationModule, NgbModal, NgbModalModule, NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; -import * as fromDashboard from '../reducer'; -import { ProviderSearchComponent } from '../component/provider-search.component'; -import { DeleteDialogComponent } from '../component/delete-dialog.component'; -import { RouterStub } from '../../../../testing/router.stub'; -import { NgbModalStub } from '../../../../testing/modal.stub'; -import { FileBackedHttpMetadataResolver } from '../../domain/entity'; -import { DashboardResolversListComponent } from './dashboard-resolvers-list.component'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { CustomDatePipe } from '../../../shared/pipe/date.pipe'; -import { MockModule } from '../../../../testing/mock-module.stub'; - - -describe('Dashboard Resolvers List Page', () => { - let fixture: ComponentFixture; - let store: Store; - let router: Router; - let modal: NgbModal; - let instance: DashboardResolversListComponent; - - let draft = new FileBackedHttpMetadataResolver({ - entityId: 'foo', - serviceProviderName: 'bar', - id: '1' - }), - resolver = new FileBackedHttpMetadataResolver({ - entityId: 'foo', - serviceProviderName: 'foo', - id: '1', - createdDate: new Date().toDateString() - }); - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - { provide: Router, useClass: RouterStub }, - { provide: NgbModal, useClass: NgbModalStub } - ], - imports: [ - NoopAnimationsModule, - StoreModule.forRoot({ - manager: combineReducers(fromDashboard.reducers), - }), - ReactiveFormsModule, - NgbPaginationModule, - NgbModalModule, - MockI18nModule, - InfiniteScrollModule, - RouterModule, - MockModule - ], - declarations: [ - DashboardResolversListComponent, - ProviderSearchComponent, - DeleteDialogComponent, - CustomDatePipe - ], - }); - - fixture = TestBed.createComponent(DashboardResolversListComponent); - instance = fixture.componentInstance; - store = TestBed.get(Store); - router = TestBed.get(Router); - modal = TestBed.get(NgbModal); - - spyOn(store, 'dispatch').and.callThrough(); - }); - - it('should compile', () => { - fixture.detectChanges(); - - expect(fixture).toBeDefined(); - }); - - describe('search method', () => { - it('should fire a redux action', () => { - instance.search(); - expect(store.dispatch).toHaveBeenCalled(); - }); - it('should reset the page number to 1', () => { - instance.search('foo'); - expect(instance.page).toBe(1); - }); - }); - - describe('edit method', () => { - it('should route to the wizard page', () => { - const evt = new Event('a type'); - spyOn(router, 'navigate'); - spyOn(evt, 'preventDefault'); - instance.edit(evt, draft); - expect(router.navigate).toHaveBeenCalledWith(['metadata', 'resolver', 'new', 'blank', 'common'], { - queryParams: { id: '1' } - }); - expect(evt.preventDefault).toHaveBeenCalled(); - }); - }); - - describe('loadMore method', () => { - it('should call the page observable to emit the next value', (done: DoneFn) => { - instance.loadMore(5); - instance.page$.subscribe(val => { - expect(val).toBe(5); - expect(instance.page).toBe(5); - done(); - }); - }); - }); - - describe('onScroll method', () => { - it('should call the loadMore method', () => { - spyOn(instance, 'loadMore'); - instance.onScroll(); - expect(instance.loadMore).toHaveBeenCalledWith(instance.page + 1); - }); - }); - - describe('deleteResolver method', () => { - it('should call the modal service', () => { - spyOn(modal, 'open').and.callFake(() => { - return { - result: Promise.resolve(true) - } as NgbModalRef; - }); - instance.deleteResolver({ entity: resolver, draft: false }); - expect(modal.open).toHaveBeenCalled(); - }); - it('should log an error to the console on failure', () => { - spyOn(modal, 'open').and.callFake(() => { - return { - result: Promise.reject(false) - } as NgbModalRef; - }); - instance.deleteResolver({ entity: resolver, draft: false }); - expect(modal.open).toHaveBeenCalled(); - }); - }); -}); diff --git a/ui/src/app/metadata/manager/container/dashboard-resolvers-list.component.ts b/ui/src/app/metadata/manager/container/dashboard-resolvers-list.component.ts deleted file mode 100644 index 91923dafc..000000000 --- a/ui/src/app/metadata/manager/container/dashboard-resolvers-list.component.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { Router } from '@angular/router'; -import { Store } from '@ngrx/store'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { Observable, BehaviorSubject, combineLatest } from 'rxjs'; -import { map } from 'rxjs/operators'; - -import { MetadataEntity, MetadataResolver } from '../../domain/model'; -import * as searchActions from '../action/search.action'; -import * as fromDashboard from '../reducer'; -import { DeleteDialogComponent } from '../component/delete-dialog.component'; -import { RemoveDraftRequest } from '../../resolver/action/draft.action'; -import { getAllResolvers } from '../../resolver/reducer'; -import { FileBackedHttpMetadataResolver } from '../../domain/entity'; -import { RemoveResolverRequest } from '../../resolver/action/collection.action'; - -@Component({ - selector: 'dashboard-resolvers-list', - templateUrl: './dashboard-resolvers-list.component.html' -}) - -export class DashboardResolversListComponent implements OnInit { - searchQuery$: Observable; - resolvers$: Observable; - loading$: Observable; - - total$: Observable; - page = 1; - limit = 20; - limited$: Observable; - - private subj: BehaviorSubject = new BehaviorSubject(this.page); - readonly page$: Observable = this.subj.asObservable(); - - constructor( - private store: Store, - private router: Router, - private modalService: NgbModal - ) { - const resolvers: unknown = store.select(fromDashboard.getSearchResults); - this.resolvers$ = (resolvers as Observable) - .pipe( - map(list => list.map(resolver => new FileBackedHttpMetadataResolver(resolver as MetadataResolver))) - ); - this.searchQuery$ = store.select(fromDashboard.getSearchQuery); - this.loading$ = store.select(fromDashboard.getSearchLoading); - - this.total$ = this.resolvers$.pipe(map(list => list.length)); - - this.limited$ = combineLatest(this.resolvers$, this.page$).pipe( - map(([providers, page]) => { - let maxIndex = (page * this.limit) - 1, - minIndex = 0; - return providers.filter((resolver: MetadataEntity, index: number) => (maxIndex >= index && index >= minIndex)); - }) - ); - } - - ngOnInit(): void { - this.search(); - } - - loadMore(index: number): void { - this.subj.next(index); - this.page = index; - } - - search(query: string = ''): void { - this.store.dispatch(new searchActions.SearchAction({query, selector: getAllResolvers})); - this.page = 1; - } - - onScroll(): void { - this.loadMore(this.page + 1); - } - - edit(evt: Event, entity: MetadataEntity): void { - evt.preventDefault(); - this.router.navigate(['metadata', 'resolver', 'new', 'blank', 'common'], { - queryParams: { - id: entity.getId() - } - }); - } - - viewMetadataHistory(entity: MetadataEntity): void { - this.router.navigate(['metadata', 'resolver', entity.getId(), 'versions']); - } - - deleteResolver({ entity, draft }: { entity: MetadataResolver, draft: boolean }): void { - this.modalService - .open(DeleteDialogComponent) - .result - .then( - success => { - if (draft) { - this.store.dispatch(new RemoveDraftRequest(entity)); - } else { - this.store.dispatch(new RemoveResolverRequest(entity.id)); - } - }, - err => { - console.log('Cancelled'); - } - ); - } -} diff --git a/ui/src/app/metadata/manager/container/manager.component.html b/ui/src/app/metadata/manager/container/manager.component.html deleted file mode 100644 index 0680b43f9..000000000 --- a/ui/src/app/metadata/manager/container/manager.component.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/ui/src/app/metadata/manager/container/manager.component.scss b/ui/src/app/metadata/manager/container/manager.component.scss deleted file mode 100644 index 4c063a6a6..000000000 --- a/ui/src/app/metadata/manager/container/manager.component.scss +++ /dev/null @@ -1,15 +0,0 @@ -@import '../../../../theme/palette'; - -:host { - .lead { - line-height: 36px; - } - - .nav-tabs, .nav-link.active { - border-color: $brand-primary; - } - - .nav-link:hover { - border-bottom-color: $brand-primary; - } -} \ No newline at end of file diff --git a/ui/src/app/metadata/manager/container/manager.component.spec.ts b/ui/src/app/metadata/manager/container/manager.component.spec.ts deleted file mode 100644 index d33c28860..000000000 --- a/ui/src/app/metadata/manager/container/manager.component.spec.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { StoreModule, combineReducers } from '@ngrx/store'; - -import { ManagerComponent } from './manager.component'; -import { Router } from '@angular/router'; -import { RouterStub, RouterLinkStubDirective, RouterOutletStubComponent } from '../../../../testing/router.stub'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import * as fromDashboard from '../reducer'; - -describe('Metadata Manager Parent Page', () => { - let fixture: ComponentFixture; - let instance: ManagerComponent; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - { provide: Router, useClass: RouterStub } - ], - imports: [ - NoopAnimationsModule, - MockI18nModule, - StoreModule.forRoot({ - manager: combineReducers(fromDashboard.reducers), - }) - ], - declarations: [ - ManagerComponent, - RouterLinkStubDirective, - RouterOutletStubComponent - ], - }); - - fixture = TestBed.createComponent(ManagerComponent); - instance = fixture.componentInstance; - }); - - it('should compile', () => { - fixture.detectChanges(); - - expect(fixture).toBeDefined(); - }); -}); diff --git a/ui/src/app/metadata/manager/container/manager.component.ts b/ui/src/app/metadata/manager/container/manager.component.ts deleted file mode 100644 index e6932a1bd..000000000 --- a/ui/src/app/metadata/manager/container/manager.component.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Component } from '@angular/core'; -import { Store } from '@ngrx/store'; -import { LoadResolverRequest } from '../../resolver/action/collection.action'; -import { LoadDraftRequest } from '../../resolver/action/draft.action'; -import * as fromRoot from '../../../app.reducer'; -import { LoadProviderRequest } from '../../provider/action/collection.action'; - -@Component({ - selector: 'manager-page', - templateUrl: './manager.component.html', - styleUrls: ['./manager.component.scss'] -}) -export class ManagerComponent { - constructor( - private store: Store - ) { - this.store.dispatch(new LoadResolverRequest()); - this.store.dispatch(new LoadDraftRequest()); - this.store.dispatch(new LoadProviderRequest()); - } -} diff --git a/ui/src/app/metadata/manager/effect/search.effects.ts b/ui/src/app/metadata/manager/effect/search.effects.ts deleted file mode 100644 index 81ce788c4..000000000 --- a/ui/src/app/metadata/manager/effect/search.effects.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { Store, MemoizedSelector } from '@ngrx/store'; -import { Observable, of } from 'rxjs'; -import { switchMap, map, combineLatest } from 'rxjs/operators'; - -import { - DashboardSearchActionTypes, - SearchAction, - DashboardSearchActionsUnion, - SearchCompleteAction -} from '../action/search.action'; -import * as fromManager from '../reducer'; -import { Metadata } from '../../domain/domain.type'; -import { MetadataResolver } from '../../domain/model'; - - -@Injectable() -export class SearchEffects { - @Effect() - searchResolvers$ = this.actions$.pipe( - ofType(DashboardSearchActionTypes.ENTITY_SEARCH), - map(action => action.payload), - switchMap(({ selector }) => this.performSearch(selector)) - ); - - matcher = (value, query) => value ? value.toLocaleLowerCase().match(query.toLocaleLowerCase()) : false; - - constructor( - private actions$: Actions, - private store: Store - ) { } - - private performSearch(selector: MemoizedSelector): Observable { - return of([]).pipe( - combineLatest( - this.store.select(selector), - (o: any[], p: Metadata[]): Array => o.concat(p) - ), - combineLatest( - this.store.select(fromManager.getSearchQuery), - (entities, term) => - entities.filter( - e => this.matcher(e.name, term) ? true : - ('entityId' in e) ? this.matcher((e as MetadataResolver).entityId, term) : this.matcher(e['@type'], term) - ) - ), - map(entities => new SearchCompleteAction(entities)) - ); - } -} /* istanbul ignore next */ diff --git a/ui/src/app/metadata/manager/manager.module.ts b/ui/src/app/metadata/manager/manager.module.ts deleted file mode 100644 index ff29ff372..000000000 --- a/ui/src/app/metadata/manager/manager.module.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { NgModule, ModuleWithProviders } from '@angular/core'; -import { HttpClientModule } from '@angular/common/http'; -import { RouterModule } from '@angular/router'; -import { CommonModule } from '@angular/common'; -import { ReactiveFormsModule } from '@angular/forms'; -import { NgbPaginationModule, NgbModalModule, NgbPopoverModule } from '@ng-bootstrap/ng-bootstrap'; -import { StoreModule } from '@ngrx/store'; -import { EffectsModule } from '@ngrx/effects'; -import { InfiniteScrollModule } from 'ngx-infinite-scroll'; - -import { ManagerComponent } from './container/manager.component'; -import { ProviderSearchComponent } from './component/provider-search.component'; -import { DashboardResolversListComponent } from './container/dashboard-resolvers-list.component'; -import { DashboardProvidersListComponent } from './container/dashboard-providers-list.component'; -import { reducers } from './reducer'; -import { SearchEffects } from './effect/search.effects'; -import { DeleteDialogComponent } from './component/delete-dialog.component'; -import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; -import { SharedModule } from '../../shared/shared.module'; -import { I18nModule } from '../../i18n/i18n.module'; -import { ResolversListComponent } from './component/resolvers-list.component'; - -@NgModule({ - declarations: [ - ManagerComponent, - ProviderSearchComponent, - DeleteDialogComponent, - DashboardResolversListComponent, - DashboardProvidersListComponent, - ResolversListComponent - ], - entryComponents: [ - DeleteDialogComponent - ], - imports: [ - CommonModule, - ReactiveFormsModule, - NgbPaginationModule, - RouterModule, - NgbModalModule, - NgbDropdownModule, - NgbPopoverModule, - HttpClientModule, - SharedModule, - I18nModule, - InfiniteScrollModule - ], - exports: [ - ResolversListComponent - ] -}) -export class ManagerModule { - static forRoot(): ModuleWithProviders { - return { - ngModule: RootManagerModule, - providers: [] - }; - } -} - -@NgModule({ - imports: [ - ManagerModule, - StoreModule.forFeature('manager', reducers), - EffectsModule.forFeature([SearchEffects]), - ], -}) -export class RootManagerModule { } diff --git a/ui/src/app/metadata/manager/manager.routing.ts b/ui/src/app/metadata/manager/manager.routing.ts deleted file mode 100644 index 67dbf9283..000000000 --- a/ui/src/app/metadata/manager/manager.routing.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { Routes } from '@angular/router'; - -export const ManagerRoutes: Routes = []; diff --git a/ui/src/app/metadata/manager/reducer/index.ts b/ui/src/app/metadata/manager/reducer/index.ts deleted file mode 100644 index 7c308183c..000000000 --- a/ui/src/app/metadata/manager/reducer/index.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { createSelector, createFeatureSelector } from '@ngrx/store'; -import * as fromRoot from '../../../core/reducer'; -import * as fromSearch from './search.reducer'; - -export interface DashboardState { - search: fromSearch.SearchState; -} - -export interface State extends fromRoot.State { - 'manager': DashboardState; -} - -export const reducers = { - search: fromSearch.reducer -}; - -export const getFeatureState = createFeatureSelector('manager'); - -export const getSearchState = createSelector(getFeatureState, - (state: DashboardState) => state.search -); - -export const getSearchResults = createSelector( - getSearchState, - fromSearch.getEntities -); -export const getSearchQuery = createSelector( - getSearchState, - fromSearch.getQuery -); -export const getSearchLoading = createSelector( - getSearchState, - fromSearch.getLoading -); diff --git a/ui/src/app/metadata/manager/reducer/search.reducer.ts b/ui/src/app/metadata/manager/reducer/search.reducer.ts deleted file mode 100644 index 38b6cf327..000000000 --- a/ui/src/app/metadata/manager/reducer/search.reducer.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { DashboardSearchActionTypes, DashboardSearchActionsUnion } from '../action/search.action'; -import { Metadata } from '../../domain/domain.type'; - -export interface SearchState { - entities: Metadata[]; - loading: boolean; - query: string; -} - -const initialState: SearchState = { - entities: [], - loading: false, - query: '' -}; - -export function reducer(state = initialState, action: DashboardSearchActionsUnion): SearchState { - switch (action.type) { - case DashboardSearchActionTypes.ENTITY_SEARCH: { - return { - ...state, - query: action.payload.query, - loading: true, - }; - } - - case DashboardSearchActionTypes.ENTITY_SEARCH_COMPLETE: { - return { - entities: action.payload, - loading: false, - query: state.query - }; - } - - default: { - return state; - } - } -} - -export const getEntities = (state: SearchState) => state.entities; - -export const getQuery = (state: SearchState) => state.query; - -export const getLoading = (state: SearchState) => state.loading; diff --git a/ui/src/app/metadata/metadata.component.html b/ui/src/app/metadata/metadata.component.html deleted file mode 100644 index 90c6b6463..000000000 --- a/ui/src/app/metadata/metadata.component.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/src/app/metadata/metadata.component.spec.ts b/ui/src/app/metadata/metadata.component.spec.ts deleted file mode 100644 index ae37f90f7..000000000 --- a/ui/src/app/metadata/metadata.component.spec.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; -import { MetadataPageComponent } from './metadata.component'; - -import * as fromRoot from '../core/reducer'; -import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(MetadataPageComponent, {static: true}) - public componentUnderTest: MetadataPageComponent; -} - -describe('Metadata Root Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: MetadataPageComponent; - let store: Store; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - RouterTestingModule, - StoreModule.forRoot({ - core: combineReducers(fromRoot.reducers) - }) - ], - declarations: [ - MetadataPageComponent, - TestHostComponent - ], - }).compileComponents(); - - store = TestBed.get(Store); - spyOn(store, 'dispatch'); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should load metadata objects', waitForAsync(() => { - expect(app).toBeTruthy(); - })); -}); diff --git a/ui/src/app/metadata/metadata.component.ts b/ui/src/app/metadata/metadata.component.ts deleted file mode 100644 index 70c094645..000000000 --- a/ui/src/app/metadata/metadata.component.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Component, ChangeDetectionStrategy } from '@angular/core'; - -@Component({ - selector: 'metadata-page', - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './metadata.component.html', - styleUrls: [] -}) -export class MetadataPageComponent { - constructor() {} -} diff --git a/ui/src/app/metadata/metadata.module.ts b/ui/src/app/metadata/metadata.module.ts deleted file mode 100644 index 3ae18c5bd..000000000 --- a/ui/src/app/metadata/metadata.module.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { NgModule } from '@angular/core'; -import { Store } from '@ngrx/store'; - -import { ResolverModule } from './resolver/resolver.module'; -import { FilterModule } from './filter/filter.module'; -import { DomainModule } from './domain/domain.module'; -import { MetadataPageComponent } from './metadata.component'; -import { ManagerModule } from './manager/manager.module'; -import { MetadataRoutingModule } from './metadata.routing'; -import { ProviderModule } from './provider/provider.module'; -import { I18nModule } from '../i18n/i18n.module'; -import { CustomWidgetRegistry } from '../schema-form/registry'; -import { WidgetRegistry } from 'ngx-schema-form'; -import { MetadataConfigurationModule } from './configuration/configuration.module'; -import { NavigationService } from '../core/service/navigation.service'; -import { MetadataResolver } from './domain/model'; -import { AddDraftRequest } from './resolver/action/draft.action'; -import * as fromResolver from './resolver/reducer'; -import { Router } from '@angular/router'; - -@NgModule({ - imports: [ - ResolverModule.forRoot(), - FilterModule.forRoot(), - DomainModule.forRoot(), - ManagerModule.forRoot(), - ProviderModule.forRoot(), - MetadataConfigurationModule.forRoot(), - MetadataRoutingModule, - I18nModule - ], - providers: [ - { provide: WidgetRegistry, useClass: CustomWidgetRegistry } - ], - declarations: [ - MetadataPageComponent - ] -}) -export class MetadataModule { - constructor( - private navService: NavigationService, - private store: Store, - private router: Router - ) { - this.navService.addAction('add-md-source', { - content: 'label.metadata-source', - label: 'action.add-new-source', - action: (event) => { - event.preventDefault(); - const resolver = { - id: `r-${Date.now()}` - }; - this.store.dispatch(new AddDraftRequest(resolver)); - this.router.navigate(['/metadata', 'resolver', 'new'], {queryParams: { id: resolver.id}}); - }, - category: 'metadata', - icon: 'fa-cube' - }); - - this.navService.addAction('add-md-provider', { - content: 'label.metadata-provider', - label: 'action.add-new-provider', - action: (event) => { - event.preventDefault(); - this.router.navigate(['/metadata', 'provider', 'wizard']); - }, - category: 'metadata', - icon: 'fa-cubes', - restrict: ['ROLE_ADMIN'] - }); - } -} diff --git a/ui/src/app/metadata/metadata.routing.ts b/ui/src/app/metadata/metadata.routing.ts deleted file mode 100644 index a2ef97557..000000000 --- a/ui/src/app/metadata/metadata.routing.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { NgModule } from '@angular/core'; -import { Routes, RouterModule } from '@angular/router'; -import { MetadataPageComponent } from './metadata.component'; - -import { ResolverRoutes } from './resolver/resolver.routing'; -import { ProviderRoutes } from './provider/provider.routing'; -import { ManagerRoutes } from './manager/manager.routing'; -import { ConfigurationRoutes } from './configuration/configuration.routing'; - -const routes: Routes = [ - { - path: '', - component: MetadataPageComponent, - children: [ - ...ManagerRoutes, - ...ResolverRoutes, - ...ProviderRoutes, - ...ConfigurationRoutes - ], - }, -]; - -@NgModule({ - imports: [ - RouterModule.forChild(routes), - ], - exports: [RouterModule] -}) -export class MetadataRoutingModule { } diff --git a/ui/src/app/metadata/new/NewAttribute.js b/ui/src/app/metadata/new/NewAttribute.js new file mode 100644 index 000000000..41d7ace0e --- /dev/null +++ b/ui/src/app/metadata/new/NewAttribute.js @@ -0,0 +1,84 @@ +import React from 'react'; +import { faSave, faSpinner } from '@fortawesome/free-solid-svg-icons'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import Button from 'react-bootstrap/Button'; + +import { Prompt, useHistory } from 'react-router'; +import Translate from '../../i18n/components/translate'; +import { MetadataAttributeEditor } from '../editor/MetadataAttributeEditor'; +import { useMetadataAttribute } from '../hooks/api'; + +import {CustomAttributeDefinition} from '../domain/attribute/CustomAttributeDefinition'; +import MetadataSchema from '../hoc/MetadataSchema'; +import { MetadataForm } from '../hoc/MetadataFormContext'; + +export function NewAttribute() { + const history = useHistory(); + + const definition = CustomAttributeDefinition; + + const { post, response, loading } = useMetadataAttribute({}); + + const [blocking, setBlocking] = React.useState(false); + + async function save(metadata) { + await post(``, definition.parser(metadata)); + if (response.ok) { + gotoDetail({ refresh: true }); + } + }; + + const cancel = () => { + gotoDetail(); + }; + + const gotoDetail = (state = null) => { + setBlocking(false); + history.push(`/metadata/attributes`, state); + }; + + return ( +
+ + `message.unsaved-editor` + } + /> +
+
+
+
+ Add a new metadata attribute +
+
+
+
+ + + + {(filter, errors) => + + + + + } + + + +
+
+
+ ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/new/NewFilter.js b/ui/src/app/metadata/new/NewFilter.js new file mode 100644 index 000000000..5fce5d31f --- /dev/null +++ b/ui/src/app/metadata/new/NewFilter.js @@ -0,0 +1,96 @@ +import React from 'react'; +import { faSave, faSpinner } from '@fortawesome/free-solid-svg-icons'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import Button from 'react-bootstrap/Button'; +import { Prompt, useHistory, useParams } from 'react-router'; +import Translate from '../../i18n/components/translate'; +import { MetadataFilterEditor } from '../editor/MetadataFilterEditor'; +import { MetadataForm } from '../hoc/MetadataFormContext'; +import { MetadataSchema } from '../hoc/MetadataSchema'; +import { useMetadataFilters, useMetadataFilterTypes } from '../hooks/api'; +import { MetadataFilterTypeSelector } from '../wizard/MetadataFilterTypeSelector'; + +export function NewFilter() { + + const { id, section } = useParams(); + const history = useHistory(); + const types = useMetadataFilterTypes(); + + const { post, response, loading } = useMetadataFilters(id, {}); + + const [blocking, setBlocking] = React.useState(false); + + + async function save(metadata) { + await post(``, metadata); + if (response.ok) { + gotoDetail({ refresh: true }); + } + }; + + const cancel = () => { + gotoDetail(); + }; + + const gotoDetail = (state = null) => { + setBlocking(false); + history.push(`/metadata/provider/${id}`, state); + }; + + const onNavigate = (path) => { + const resetBlock = blocking; + setBlocking(false); + setTimeout(() => { + history.push(path); + setBlocking(resetBlock); + }); + }; + + return ( +
+ + `message.unsaved-editor` + } + /> +
+
+
+
+ Add a new metadata filter +
+
+
+
+ + {(type, base) => + + + setBlocking(b)}> + {(filter, isInvalid) => +
+ + +
} +
+
+
+ } +
+
+
+
+ ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/new/NewProvider.js b/ui/src/app/metadata/new/NewProvider.js new file mode 100644 index 000000000..400e12021 --- /dev/null +++ b/ui/src/app/metadata/new/NewProvider.js @@ -0,0 +1,39 @@ +import React from 'react'; +import Translate from '../../i18n/components/translate'; +import { MetadataSchema } from '../hoc/MetadataSchema'; +import { useMetadataProviderTypes } from '../hooks/api'; +import { MetadataWizard } from '../view/MetadataWizard'; +import { MetadataProviderTypeSelector } from '../wizard/MetadataProviderTypeSelector'; + +export function NewProvider() { + + const { data } = useMetadataProviderTypes({}, []); + + return ( +
+
+
+
+
+ Add a new metadata provider +
+
+
+
+ + {(data, onRestart) => + + + + } + +
+
+
+ ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/new/NewSource.js b/ui/src/app/metadata/new/NewSource.js new file mode 100644 index 000000000..bd9f0c6fb --- /dev/null +++ b/ui/src/app/metadata/new/NewSource.js @@ -0,0 +1,96 @@ +import React from 'react'; +import { NavLink, Redirect, Route, Switch, useRouteMatch } from 'react-router-dom'; +import Translate from '../../i18n/components/translate'; +import { MetadataSchema } from '../hoc/MetadataSchema'; +import { MetadataWizard } from '../view/MetadataWizard'; +import { MetadataCopy } from '../view/MetadataCopy'; +import { MetadataUpload } from '../view/MetadataUpload'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { faCopy, faLink, faPlusSquare } from '@fortawesome/free-solid-svg-icons'; + +export function NewSource() { + + const { path } = useRouteMatch(); + + const [showNav, setShowNav] = React.useState(true); + + return ( +
+
+
+
+
+ Add a new metadata source +
+
+
+
+ {showNav && <> +

How are you adding the metadata information?

+
+
+
+
+
+ + Upload/URL + + +
+
+  or  +
+
+ + Create + + +
+
+  or  +
+
+ + Copy + + +
+
+
+
+
+ } + + + + { setShowNav(s) }} /> + } /> + + + } /> + + { setShowNav(s) } } /> + } /> + + + +
+
+
+ ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/provider/action/collection.action.ts b/ui/src/app/metadata/provider/action/collection.action.ts deleted file mode 100644 index 163a58c98..000000000 --- a/ui/src/app/metadata/provider/action/collection.action.ts +++ /dev/null @@ -1,214 +0,0 @@ -import { Action } from '@ngrx/store'; -import { MetadataProvider } from '../../domain/model/metadata-provider'; -import { Update } from '@ngrx/entity'; - -export enum ProviderCollectionActionTypes { - UPDATE_PROVIDER_REQUEST = '[Metadata Provider] Update Request', - UPDATE_PROVIDER_SUCCESS = '[Metadata Provider] Update Success', - UPDATE_PROVIDER_FAIL = '[Metadata Provider] Update Fail', - UPDATE_PROVIDER_CONFLICT = '[Metadata Provider] Update Conflict', - - LOAD_PROVIDER_REQUEST = '[Metadata Provider Collection] Provider Load REQUEST', - LOAD_PROVIDER_SUCCESS = '[Metadata Provider Collection] Provider Load SUCCESS', - LOAD_PROVIDER_ERROR = '[Metadata Provider Collection] Provider Load ERROR', - - SELECT_PROVIDER_REQUEST = '[Metadata Provider Collection] Provider SELECT REQUEST', - SELECT_PROVIDER_SUCCESS = '[Metadata Provider Collection] Provider SELECT SUCCESS', - SELECT_PROVIDER_ERROR = '[Metadata Provider Collection] Provider SELECT ERROR', - - ADD_PROVIDER_REQUEST = '[Metadata Provider Collection] Add Provider', - ADD_PROVIDER_SUCCESS = '[Metadata Provider Collection] Add Provider Success', - ADD_PROVIDER_FAIL = '[Metadata Provider Collection] Add Provider Fail', - - REMOVE_PROVIDER_REQUEST = '[Metadata Provider Collection] Remove Provider Request', - REMOVE_PROVIDER_SUCCESS = '[Metadata Provider Collection] Remove Provider Success', - REMOVE_PROVIDER_FAIL = '[Metadata Provider Collection] Remove Provider Fail', - - SET_ORDER_PROVIDER_REQUEST = '[Metadata Provider Collection] Set Order Provider Request', - SET_ORDER_PROVIDER_SUCCESS = '[Metadata Provider Collection] Set Order Provider Success', - SET_ORDER_PROVIDER_FAIL = '[Metadata Provider Collection] Set Order Provider Fail', - - GET_ORDER_PROVIDER_REQUEST = '[Metadata Provider Collection] Get Order Provider Request', - GET_ORDER_PROVIDER_SUCCESS = '[Metadata Provider Collection] Get Order Provider Success', - GET_ORDER_PROVIDER_FAIL = '[Metadata Provider Collection] Get Order Provider Fail', - - CHANGE_PROVIDER_ORDER_UP = '[Metadata Provider Collection] Change Order Up', - CHANGE_PROVIDER_ORDER_DOWN = '[Metadata Provider Collection] Change Order Down', - - CLEAR_SELECTION = '[Metadata Provider Collection] Clear Provider Selection' -} - -export class LoadProviderRequest implements Action { - readonly type = ProviderCollectionActionTypes.LOAD_PROVIDER_REQUEST; - - constructor() { } -} - -export class LoadProviderSuccess implements Action { - readonly type = ProviderCollectionActionTypes.LOAD_PROVIDER_SUCCESS; - - constructor(public payload: MetadataProvider[]) { } -} - -export class LoadProviderError implements Action { - readonly type = ProviderCollectionActionTypes.LOAD_PROVIDER_ERROR; - - constructor(public payload: any) { } -} - -export class SelectProviderRequest implements Action { - readonly type = ProviderCollectionActionTypes.SELECT_PROVIDER_REQUEST; - - constructor(public payload: string) { } -} - -export class SelectProviderSuccess implements Action { - readonly type = ProviderCollectionActionTypes.SELECT_PROVIDER_SUCCESS; - - constructor(public payload: MetadataProvider) { } -} - -export class SelectProviderError implements Action { - readonly type = ProviderCollectionActionTypes.SELECT_PROVIDER_ERROR; - - constructor(public payload: any) { } -} - -export class UpdateProviderRequest implements Action { - readonly type = ProviderCollectionActionTypes.UPDATE_PROVIDER_REQUEST; - - constructor(public payload: MetadataProvider) { } -} - -export class UpdateProviderSuccess implements Action { - readonly type = ProviderCollectionActionTypes.UPDATE_PROVIDER_SUCCESS; - - constructor(public payload: Update) { } -} - -export class UpdateProviderFail implements Action { - readonly type = ProviderCollectionActionTypes.UPDATE_PROVIDER_FAIL; - - constructor(public payload: any) { } -} - -export class UpdateProviderConflict implements Action { - readonly type = ProviderCollectionActionTypes.UPDATE_PROVIDER_CONFLICT; - - constructor(public payload: MetadataProvider) { } -} - -export class AddProviderRequest implements Action { - readonly type = ProviderCollectionActionTypes.ADD_PROVIDER_REQUEST; - - constructor(public payload: MetadataProvider) { } -} - -export class AddProviderSuccess implements Action { - readonly type = ProviderCollectionActionTypes.ADD_PROVIDER_SUCCESS; - - constructor(public payload: MetadataProvider) { } -} - -export class AddProviderFail implements Action { - readonly type = ProviderCollectionActionTypes.ADD_PROVIDER_FAIL; - - constructor(public payload: any) { } -} - -export class RemoveProviderRequest implements Action { - readonly type = ProviderCollectionActionTypes.REMOVE_PROVIDER_REQUEST; - - constructor(public payload: MetadataProvider) { } -} - -export class RemoveProviderSuccess implements Action { - readonly type = ProviderCollectionActionTypes.REMOVE_PROVIDER_SUCCESS; - - constructor(public payload: MetadataProvider) { } -} - -export class RemoveProviderFail implements Action { - readonly type = ProviderCollectionActionTypes.REMOVE_PROVIDER_FAIL; - - constructor(public payload: MetadataProvider) { } -} - -export class SetOrderProviderRequest implements Action { - readonly type = ProviderCollectionActionTypes.SET_ORDER_PROVIDER_REQUEST; - - constructor(public payload: string[]) { } -} - -export class SetOrderProviderSuccess implements Action { - readonly type = ProviderCollectionActionTypes.SET_ORDER_PROVIDER_SUCCESS; - - constructor() { } -} - -export class SetOrderProviderFail implements Action { - readonly type = ProviderCollectionActionTypes.SET_ORDER_PROVIDER_FAIL; - - constructor(public payload: Error) { } -} - -export class GetOrderProviderRequest implements Action { - readonly type = ProviderCollectionActionTypes.GET_ORDER_PROVIDER_REQUEST; - - constructor() { } -} - -export class GetOrderProviderSuccess implements Action { - readonly type = ProviderCollectionActionTypes.GET_ORDER_PROVIDER_SUCCESS; - - constructor(public payload: string[]) { } -} - -export class GetOrderProviderFail implements Action { - readonly type = ProviderCollectionActionTypes.GET_ORDER_PROVIDER_FAIL; - - constructor(public payload: Error) { } -} - -export class ChangeProviderOrderUp implements Action { - readonly type = ProviderCollectionActionTypes.CHANGE_PROVIDER_ORDER_UP; - - constructor(public payload: string) { } -} - -export class ChangeProviderOrderDown implements Action { - readonly type = ProviderCollectionActionTypes.CHANGE_PROVIDER_ORDER_DOWN; - - constructor(public payload: string) { } -} - -export class ClearProviderSelection implements Action { - readonly type = ProviderCollectionActionTypes.CLEAR_SELECTION; -} - -export type ProviderCollectionActionsUnion = - | LoadProviderRequest - | LoadProviderSuccess - | LoadProviderError - | SelectProviderRequest - | SelectProviderSuccess - | SelectProviderError - | AddProviderRequest - | AddProviderSuccess - | AddProviderFail - | RemoveProviderRequest - | RemoveProviderSuccess - | RemoveProviderFail - | UpdateProviderRequest - | UpdateProviderSuccess - | UpdateProviderFail - | UpdateProviderConflict - | SetOrderProviderRequest - | SetOrderProviderSuccess - | SetOrderProviderFail - | GetOrderProviderRequest - | GetOrderProviderSuccess - | GetOrderProviderFail - | ChangeProviderOrderUp - | ChangeProviderOrderDown - | ClearProviderSelection; diff --git a/ui/src/app/metadata/provider/action/editor.action.ts b/ui/src/app/metadata/provider/action/editor.action.ts deleted file mode 100644 index 37a99c98b..000000000 --- a/ui/src/app/metadata/provider/action/editor.action.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Action } from '@ngrx/store'; - -export enum EditorActionTypes { - UPDATE_STATUS = '[Provider Editor] Update Status', - SELECT_PROVIDER_TYPE = '[Provider Editor] Select Provider Type', - CLEAR = '[Provider Editor] Clear' -} - -export class UpdateStatus implements Action { - readonly type = EditorActionTypes.UPDATE_STATUS; - - constructor(public payload: { [key: string]: string }) { } -} - -export class SelectProviderType implements Action { - readonly type = EditorActionTypes.SELECT_PROVIDER_TYPE; - - constructor(public payload: string) { } -} - -export class ClearEditor implements Action { - readonly type = EditorActionTypes.CLEAR; -} - -export type EditorActionUnion = - | UpdateStatus - | SelectProviderType - | ClearEditor; diff --git a/ui/src/app/metadata/provider/action/entity.action.ts b/ui/src/app/metadata/provider/action/entity.action.ts deleted file mode 100644 index 44c2ca90d..000000000 --- a/ui/src/app/metadata/provider/action/entity.action.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Action } from '@ngrx/store'; -import { MetadataProvider } from '../../domain/model'; - -export enum EntityActionTypes { - UPDATE_PROVIDER = '[Provider Entity] Update Provider', - CLEAR_PROVIDER = '[Provider Entity] Clear', - RESET_CHANGES = '[Provider Entity] Reset Changes' -} - -export class UpdateProvider implements Action { - readonly type = EntityActionTypes.UPDATE_PROVIDER; - - constructor(public payload: Partial) { } -} - -export class ClearProvider implements Action { - readonly type = EntityActionTypes.CLEAR_PROVIDER; -} - -export class ResetChanges implements Action { - readonly type = EntityActionTypes.RESET_CHANGES; -} - -export type EntityActionUnion = - | UpdateProvider - | ClearProvider - | ResetChanges; diff --git a/ui/src/app/metadata/provider/component/delete-filter.component.html b/ui/src/app/metadata/provider/component/delete-filter.component.html deleted file mode 100644 index 519e0c662..000000000 --- a/ui/src/app/metadata/provider/component/delete-filter.component.html +++ /dev/null @@ -1,10 +0,0 @@ - - - \ No newline at end of file diff --git a/ui/src/app/metadata/provider/component/delete-filter.component.spec.ts b/ui/src/app/metadata/provider/component/delete-filter.component.spec.ts deleted file mode 100644 index 837ca2047..000000000 --- a/ui/src/app/metadata/provider/component/delete-filter.component.spec.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; - -import { NgbDropdownModule, NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; - -import { DeleteFilterComponent } from './delete-filter.component'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(DeleteFilterComponent, { static: true }) - public componentUnderTest: DeleteFilterComponent; -} - -describe('Delete Filter (modal) Component', () => { - - let app: DeleteFilterComponent; - let fixture: ComponentFixture; - let instance: TestHostComponent; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - RouterTestingModule - ], - declarations: [ - DeleteFilterComponent, - TestHostComponent - ], - providers: [ - { - provide: NgbActiveModal, - useValue: jasmine.createSpyObj('activeModal', [ - 'close', - 'dismiss' - ]) - } - ] - }).compileComponents(); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should compile without error', waitForAsync(() => { - expect(app).toBeTruthy(); - })); -}); diff --git a/ui/src/app/metadata/provider/component/delete-filter.component.ts b/ui/src/app/metadata/provider/component/delete-filter.component.ts deleted file mode 100644 index b1da35392..000000000 --- a/ui/src/app/metadata/provider/component/delete-filter.component.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Component, ChangeDetectionStrategy } from '@angular/core'; - -import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; - -@Component({ - selector: 'delete-filter-dialog', - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './delete-filter.component.html' -}) -export class DeleteFilterComponent { - constructor( - public activeModal: NgbActiveModal - ) { } -} diff --git a/ui/src/app/metadata/provider/container/provider-edit-step.component.html b/ui/src/app/metadata/provider/container/provider-edit-step.component.html deleted file mode 100644 index ad969fd9e..000000000 --- a/ui/src/app/metadata/provider/container/provider-edit-step.component.html +++ /dev/null @@ -1,16 +0,0 @@ - -
- - - {{ lock.value ? 'Locked' : 'Unlocked' }} - - For Advanced Knowledge Only -
- -
\ No newline at end of file diff --git a/ui/src/app/metadata/provider/container/provider-edit-step.component.spec.ts b/ui/src/app/metadata/provider/container/provider-edit-step.component.spec.ts deleted file mode 100644 index 0e6b88854..000000000 --- a/ui/src/app/metadata/provider/container/provider-edit-step.component.spec.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, fakeAsync, tick, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; -import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; -import { ProviderEditStepComponent } from './provider-edit-step.component'; -import * as fromRoot from '../reducer'; -import * as fromWizard from '../../../wizard/reducer'; -import { SchemaFormModule, WidgetRegistry, DefaultWidgetRegistry } from 'ngx-schema-form'; -import { SharedModule } from '../../../shared/shared.module'; -import { FileBackedHttpMetadataProviderEditor } from '../model'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(ProviderEditStepComponent, {static: true}) - public componentUnderTest: ProviderEditStepComponent; -} - -describe('Provider Edit Step Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: ProviderEditStepComponent; - let store: Store; - let storeSpy: any; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - RouterTestingModule, - SchemaFormModule.forRoot(), - SharedModule, - StoreModule.forRoot({ - provider: combineReducers(fromRoot.reducers), - wizard: combineReducers(fromWizard.reducers, { - wizard: { - index: 'common', - disabled: false, - definition: FileBackedHttpMetadataProviderEditor, - schemaPath: '', - loading: false, - schema: { - type: 'object', - properties: { - foo: { - type: 'string' - } - } - }, - locked: false - } - }) - }) - ], - declarations: [ - ProviderEditStepComponent, - TestHostComponent - ], - providers: [ - { provide: WidgetRegistry, useClass: DefaultWidgetRegistry } - ] - }).compileComponents(); - - store = TestBed.get(Store); - storeSpy = spyOn(store, 'dispatch'); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should instantiate the component', waitForAsync(() => { - expect(app).toBeTruthy(); - })); - - describe('updateStatus method', () => { - it('should update the status with provided errors', () => { - storeSpy.calls.reset(); - app.currentPage = 'common'; - app.updateStatus({value: 'common'}); - expect(store.dispatch).toHaveBeenCalledTimes(1); - }); - }); - - describe('valueChangeEmitted$ subject', () => { - it('should update the provider', fakeAsync(() => { - app.valueChangeSubject.next({value: { name: 'foo' } }); - fixture.detectChanges(); - tick(); - fixture.detectChanges(); - expect(store.dispatch).toHaveBeenCalled(); - })); - }); -}); diff --git a/ui/src/app/metadata/provider/container/provider-edit-step.component.ts b/ui/src/app/metadata/provider/container/provider-edit-step.component.ts deleted file mode 100644 index 0a8e1e5ef..000000000 --- a/ui/src/app/metadata/provider/container/provider-edit-step.component.ts +++ /dev/null @@ -1,145 +0,0 @@ -import { Component, OnDestroy } from '@angular/core'; -import { Observable, Subject } from 'rxjs'; -import { Store } from '@ngrx/store'; -import { FormControl } from '@angular/forms'; - -import * as fromProvider from '../reducer'; -import { UpdateStatus } from '../action/editor.action'; -import { Wizard, WizardStep } from '../../../wizard/model'; -import { MetadataProvider } from '../../domain/model'; -import { LockEditor, UnlockEditor } from '../../../wizard/action/wizard.action'; - -import * as fromWizard from '../../../wizard/reducer'; -import { withLatestFrom, map, distinctUntilChanged, filter } from 'rxjs/operators'; -import { UpdateProvider } from '../action/entity.action'; - -@Component({ - selector: 'provider-edit-step', - templateUrl: './provider-edit-step.component.html', - styleUrls: [] -}) -export class ProviderEditStepComponent implements OnDestroy { - private ngUnsubscribe: Subject = new Subject(); - - valueChangeSubject = new Subject>(); - private valueChangeEmitted$ = this.valueChangeSubject.asObservable(); - - statusChangeSubject = new Subject>(); - private statusChangeEmitted$ = this.statusChangeSubject.asObservable(); - - currentPage: string; - - namesList: string[] = []; - - schema$: Observable; - provider$: Observable; - model$: Observable; - definition$: Observable>; - changes$: Observable; - step$: Observable; - bindings$: Observable; - - validators$: Observable<{ [key: string]: any }>; - - lock: FormControl = new FormControl(true); - - constructor( - private store: Store - ) { - this.definition$ = this.store.select(fromWizard.getWizardDefinition); - this.changes$ = this.store.select(fromProvider.getEntityChanges); - this.provider$ = this.store.select(fromProvider.getSelectedProvider); - this.step$ = this.store.select(fromWizard.getCurrent); - this.schema$ = this.store.select(fromWizard.getSchema); - this.bindings$ = this.definition$.pipe(map(d => d.bindings)); - - this.step$.subscribe(s => { - if (s && s.locked) { - this.store.dispatch(new LockEditor()); - } else { - this.store.dispatch(new UnlockEditor()); - } - }); - - this.lock.valueChanges.subscribe(locked => this.store.dispatch(locked ? new LockEditor() : new UnlockEditor())); - - this.validators$ = this.definition$.pipe( - withLatestFrom( - this.store.select(fromProvider.getProviderNames), - this.store.select(fromProvider.getProviderXmlIds), - this.provider$ - ), - filter(([def, names, ids, provider]) => !!def), - map(([def, names, ids, provider]) => def.getValidators( - names.filter(n => n !== provider.name), - ids.filter(id => id !== provider.xmlId) - )) - ); - - this.model$ = this.schema$.pipe( - withLatestFrom( - this.store.select(fromProvider.getSelectedProvider), - this.store.select(fromWizard.getModel), - this.changes$, - this.definition$ - ), - map(([schema, provider, model, changes, definition]) => { - return ({ - model: { - ...model, - ...provider, - ...changes - }, - definition - }); - }), - filter(({ model, definition }) => definition && model), - map(({ model, definition }) => definition ? definition.formatter(model) : {}) - ); - - this.valueChangeEmitted$.pipe( - map(changes => changes.value), - withLatestFrom( - this.definition$, - this.store.select(fromProvider.getSelectedProvider) - ), - filter(([ changes, definition, provider ]) => definition && changes && provider), - map(([ changes, definition, provider ]) => { - const staticFilterTypes = Object.keys(changes.metadataFilters); - const appliedFilters = changes && changes.metadataFilters ? { - ...changes, - metadataFilters: staticFilterTypes.reduce((filters, filterType) => ({ - ...filters, - [filterType]: { - ...provider.metadataFilters.find(f => f['@type'] === filterType) || {}, - ...changes.metadataFilters[filterType] - } - }), {}) - } : changes; - const parsed = definition.parser(appliedFilters, provider); - return parsed; - }) - ) - .subscribe(changes => this.store.dispatch(new UpdateProvider(changes))); - - this.statusChangeEmitted$ - .pipe(distinctUntilChanged()) - .subscribe(errors => { - this.updateStatus(errors); - }); - - this.store.select(fromWizard.getWizardIndex).subscribe(i => this.currentPage = i); - } - - updateStatus(errors: any): void { - const status = { [this.currentPage]: !(errors.value) ? 'VALID' : 'INVALID' }; - this.store.dispatch(new UpdateStatus(status)); - } - - ngOnDestroy() { - this.valueChangeSubject.complete(); - this.statusChangeSubject.complete(); - this.ngUnsubscribe.unsubscribe(); - } -} - diff --git a/ui/src/app/metadata/provider/container/provider-edit.component.html b/ui/src/app/metadata/provider/container/provider-edit.component.html deleted file mode 100644 index 514fc1c48..000000000 --- a/ui/src/app/metadata/provider/container/provider-edit.component.html +++ /dev/null @@ -1,74 +0,0 @@ -
-
-
-
- - Edit Metadata Provider - {{ (provider$ | async).name }} -
-
-
-
-
-
- - - - - -
-
- -   - -
-
-
- - All forms must be valid before changes can be saved! -
-
-
-
-
-
- - - - - -
-
- -
-
-
-
\ No newline at end of file diff --git a/ui/src/app/metadata/provider/container/provider-edit.component.spec.ts b/ui/src/app/metadata/provider/container/provider-edit.component.spec.ts deleted file mode 100644 index 7ae7516e2..000000000 --- a/ui/src/app/metadata/provider/container/provider-edit.component.spec.ts +++ /dev/null @@ -1,151 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { ActivatedRoute, Router, ActivatedRouteSnapshot } from '@angular/router'; -import { APP_BASE_HREF } from '@angular/common'; -import { TestBed, ComponentFixture, fakeAsync, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; -import { NgbDropdownModule, NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; -import { ProviderEditComponent } from './provider-edit.component'; -import * as fromRoot from '../reducer'; -import * as fromWizard from '../../../wizard/reducer'; -import { SharedModule } from '../../../shared/shared.module'; -import { ActivatedRouteStub } from '../../../../testing/activated-route.stub'; -import { FileBackedHttpMetadataProviderEditor } from '../model'; -import { EditorNavComponent } from '../../domain/component/editor-nav.component'; -import { NgbModalStub } from '../../../../testing/modal.stub'; -import { MetadataProvider } from '../../domain/model'; -import { of } from 'rxjs'; -import { DifferentialService } from '../../../core/service/differential.service'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(ProviderEditComponent, {static: true}) - public componentUnderTest: ProviderEditComponent; -} - -describe('Provider Edit Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: ProviderEditComponent; - let store: Store; - let router: Router; - let activatedRoute: ActivatedRouteStub = new ActivatedRouteStub(); - let child: ActivatedRouteStub = new ActivatedRouteStub(); - let modal: NgbModal; - child.testParamMap = { form: 'common' }; - activatedRoute.firstChild = child; - - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - RouterTestingModule.withRoutes([ - {path: 'edit', children: []}, - {path: 'foo', children: []}, - {path: '', children: []} - ]), - SharedModule, - StoreModule.forRoot({ - provider: combineReducers(fromRoot.reducers), - wizard: combineReducers(fromWizard.reducers, { - wizard: { - index: 'common', - disabled: false, - definition: FileBackedHttpMetadataProviderEditor, - schemaPath: '', - loading: false, - schema: {}, - locked: false - } - }) - }), - MockI18nModule - ], - declarations: [ - ProviderEditComponent, - TestHostComponent, - EditorNavComponent - ], - providers: [ - DifferentialService, - { provide: NgbModal, useClass: NgbModalStub }, - { provide: ActivatedRoute, useValue: activatedRoute }, - { provide: APP_BASE_HREF, useValue: '/' } - ] - }).compileComponents(); - - store = TestBed.get(Store); - router = TestBed.get(Router); - modal = TestBed.get(NgbModal); - spyOn(store, 'dispatch'); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should instantiate the component', waitForAsync(() => { - expect(app).toBeTruthy(); - })); - - describe('save method', () => { - it('should route to the given child form', () => { - app.save(); - expect(store.dispatch).toHaveBeenCalled(); - }); - }); - - describe('cancel method', () => { - it('should route to the provider', () => { - spyOn(router, 'navigate'); - spyOn(app, 'clear'); - app.cancel('foo'); - expect(router.navigate).toHaveBeenCalled(); - expect(app.clear).toHaveBeenCalled(); - }); - }); - - describe('clear method', () => { - it('should dispatch actions to clear the reducer state', () => { - app.clear(); - expect(store.dispatch).toHaveBeenCalled(); - }); - }); - - describe('canDeactivate method', () => { - it('should check if the current route is another edit page', (done) => { - let route = new ActivatedRouteStub(), - snapshot = route.snapshot; - let result = app.canDeactivate(null, { url: 'edit', root: null }, { url: 'edit', root: null }); - result.subscribe(can => { - expect(can).toBe(true); - done(); - }); - fixture.detectChanges(); - }); - - it('should open a modal', (done) => { - app.latest = { name: 'bar' }; - spyOn(store, 'select').and.returnValue(of(false)); - spyOn(modal, 'open').and.returnValue({ result: Promise.resolve('closed') } as NgbModalRef); - fixture.detectChanges(); - let route = new ActivatedRouteStub(), - snapshot = route.snapshot; - let result = app.canDeactivate(null, { url: 'edit', root: null }, { url: 'foo', root: null }); - result.subscribe(can => { - expect(can).toBe(false); - expect(modal.open).toHaveBeenCalled(); - done(); - }); - fixture.detectChanges(); - }); - }); -}); diff --git a/ui/src/app/metadata/provider/container/provider-edit.component.ts b/ui/src/app/metadata/provider/container/provider-edit.component.ts deleted file mode 100644 index d577fe3a0..000000000 --- a/ui/src/app/metadata/provider/container/provider-edit.component.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { Component, OnDestroy } from '@angular/core'; -import { Router, ActivatedRoute, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; -import { Observable, of, Subject } from 'rxjs'; -import { map, filter } from 'rxjs/operators'; -import { Store } from '@ngrx/store'; -import * as fromWizard from '../../../wizard/reducer'; -import * as fromProvider from '../reducer'; -import { SetIndex, LoadSchemaRequest } from '../../../wizard/action/wizard.action'; -import { ClearEditor } from '../action/editor.action'; -import { MetadataProvider } from '../../domain/model'; -import { ClearProvider } from '../action/entity.action'; -import { Wizard } from '../../../wizard/model'; -import { UpdateProviderRequest } from '../action/collection.action'; -import { NgbModal } from '../../../../../node_modules/@ng-bootstrap/ng-bootstrap'; -import { UnsavedEntityComponent } from '../../domain/component/unsaved-entity.dialog'; -import { CanComponentDeactivate } from '../../../core/service/can-deactivate.guard'; -import { DifferentialService } from '../../../core/service/differential.service'; -import { NAV_FORMATS } from '../../domain/component/editor-nav.component'; -import { FilterableProviders } from '../model'; - -@Component({ - selector: 'provider-edit', - templateUrl: './provider-edit.component.html', - styleUrls: [] -}) - -export class ProviderEditComponent implements OnDestroy, CanComponentDeactivate { - private ngUnsubscribe: Subject = new Subject(); - - provider$: Observable; - definition$: Observable>; - index$: Observable; - - valid$: Observable; - isInvalid$: Observable; - status$: Observable; - isSaving$: Observable; - canFilter$: Observable; - - latest: MetadataProvider; - provider: MetadataProvider; - - formats = NAV_FORMATS; - - latest$: Observable; - - constructor( - private store: Store, - private router: Router, - private route: ActivatedRoute, - private modalService: NgbModal, - private diffService: DifferentialService - ) { - this.provider$ = this.store.select(fromProvider.getSelectedProvider).pipe(filter(d => !!d)); - this.definition$ = this.store.select(fromWizard.getWizardDefinition).pipe(filter(d => !!d)); - this.index$ = this.store.select(fromWizard.getWizardIndex).pipe(filter(i => !!i)); - this.valid$ = this.store.select(fromProvider.getEditorIsValid); - this.isInvalid$ = this.valid$.pipe(map(v => !v)); - this.status$ = this.store.select(fromProvider.getInvalidEditorForms); - this.isSaving$ = this.store.select(fromProvider.getEntityIsSaving); - - let startIndex$ = this.route.firstChild.params.pipe(map(p => p.form || 'filters')); - startIndex$.subscribe(index => this.store.dispatch(new SetIndex(index))); - - this.store - .select(fromWizard.getCurrentWizardSchema) - .pipe(filter(s => !!s)) - .subscribe(s => { - if (s) { - this.store.dispatch(new LoadSchemaRequest(s)); - } - }); - - this.provider$.subscribe(p => this.provider = p); - this.latest$ = this.store.select(fromProvider.getEntityChanges); - this.latest$.subscribe(changes => this.latest = changes); - - this.canFilter$ = this.definition$.pipe(map(def => FilterableProviders.indexOf(def.type) > -1)); - } - - ngOnDestroy() { - this.clear(); - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - } - - clear(): void { - this.store.dispatch(new ClearProvider()); - this.store.dispatch(new ClearEditor()); - } - - save(): void { - this.store.dispatch(new UpdateProviderRequest(this.latest)); - } - - cancel(id): void { - this.clear(); - this.router.navigate(['/', 'metadata', 'provider', id, 'configuration', 'options']); - } - - canDeactivate( - currentRoute: ActivatedRouteSnapshot, - currentState: RouterStateSnapshot, - nextState: RouterStateSnapshot - ): Observable { - if (nextState.url.match('edit')) { - return of(true); - } - const diff = this.diffService.updatedDiff(this.provider, this.latest); - if (diff && Object.keys(diff).length > 0) { - let modal = this.modalService.open(UnsavedEntityComponent); - modal.result.then( - () => { - this.clear(); - this.router.navigate([nextState.url]); - }, - () => console.warn('denied') - ); - return this.store.select(fromProvider.getEntityIsSaved); - } - return of(true); - } -} - diff --git a/ui/src/app/metadata/provider/container/provider-filter-list.component.html b/ui/src/app/metadata/provider/container/provider-filter-list.component.html deleted file mode 100644 index f38e66d7b..000000000 --- a/ui/src/app/metadata/provider/container/provider-filter-list.component.html +++ /dev/null @@ -1,67 +0,0 @@ -
-
-
-
- - Edit Metadata Provider - {{ (provider$ | async).name }} - -
-
-
-
- -
-
-
- - - - - -
-
- - -
-
-
-
diff --git a/ui/src/app/metadata/provider/container/provider-filter-list.component.scss b/ui/src/app/metadata/provider/container/provider-filter-list.component.scss deleted file mode 100644 index e1a2e17b9..000000000 --- a/ui/src/app/metadata/provider/container/provider-filter-list.component.scss +++ /dev/null @@ -1,17 +0,0 @@ -:host { - .table { - .td-sm { - max-width: 100px; - } - .td-xs { - max-width: 20px; - } - .td-lg { - width: 30%; - } - - td { - vertical-align: middle; - } - } -} \ No newline at end of file diff --git a/ui/src/app/metadata/provider/container/provider-filter-list.component.spec.ts b/ui/src/app/metadata/provider/container/provider-filter-list.component.spec.ts deleted file mode 100644 index f427ce535..000000000 --- a/ui/src/app/metadata/provider/container/provider-filter-list.component.spec.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { Component, ViewChild, Input, Output, EventEmitter } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; -import { NgbDropdownModule, NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { ProviderFilterListComponent } from './provider-filter-list.component'; -import * as fromRoot from '../reducer'; -import * as fromWizard from '../../../wizard/reducer'; -import { EditorNavComponent, NAV_FORMATS } from '../../domain/component/editor-nav.component'; -import { ValidFormIconComponent } from '../../../shared/component/valid-form-icon.component'; -import { DeleteFilterComponent } from '../component/delete-filter.component'; -import { NgbModalStub } from '../../../../testing/modal.stub'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { FilterListComponentStub } from '../../../../testing/filter-list.stub'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(ProviderFilterListComponent, {static: true}) - public componentUnderTest: ProviderFilterListComponent; -} - -describe('Provider Filter List Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: ProviderFilterListComponent; - let store: Store; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - RouterTestingModule, - StoreModule.forRoot({ - provider: combineReducers(fromRoot.reducers), - wizard: combineReducers(fromWizard.reducers) - }), - MockI18nModule - ], - declarations: [ - ProviderFilterListComponent, - EditorNavComponent, - ValidFormIconComponent, - DeleteFilterComponent, - TestHostComponent, - FilterListComponentStub - ], - providers: [ - { provide: NgbModal, useClass: NgbModalStub } - ] - }).compileComponents(); - - store = TestBed.get(Store); - spyOn(store, 'dispatch'); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should instantiate the component', waitForAsync(() => { - expect(app).toBeTruthy(); - })); - - describe('remove method', () => { - it('should dispatch an action to the store', () => { - app.remove('foo'); - expect(store.dispatch).toHaveBeenCalled(); - }); - }); -}); diff --git a/ui/src/app/metadata/provider/container/provider-filter-list.component.ts b/ui/src/app/metadata/provider/container/provider-filter-list.component.ts deleted file mode 100644 index 5b92e0651..000000000 --- a/ui/src/app/metadata/provider/container/provider-filter-list.component.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { Component, OnDestroy } from '@angular/core'; -import { Store } from '@ngrx/store'; -import { Observable, Subject } from 'rxjs'; -import { skipWhile, takeUntil } from 'rxjs/operators'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; - -import * as fromProvider from '../reducer'; -import * as fromFilter from '../../filter/reducer'; -import { MetadataFilter, MetadataProvider } from '../../domain/model'; -import { SetIndex } from '../../../wizard/action/wizard.action'; - -import { - UpdateFilterRequest, - LoadFilterRequest, - ChangeFilterOrderUp, - ChangeFilterOrderDown, - RemoveFilterRequest, - ClearFilters -} from '../../filter/action/collection.action'; -import { DeleteFilterComponent } from '../component/delete-filter.component'; -import { NAV_FORMATS } from '../../domain/component/editor-nav.component'; - -@Component({ - selector: 'provider-filter-list', - templateUrl: './provider-filter-list.component.html', - styleUrls: ['./provider-filter-list.component.scss'] -}) -export class ProviderFilterListComponent implements OnDestroy { - - private ngUnsubscribe: Subject = new Subject(); - - filters$: Observable; - provider$: Observable; - isSaving$: Observable; - - provider: MetadataProvider; - - formats = NAV_FORMATS; - - constructor( - private store: Store, - private modalService: NgbModal - ) { - - console.log('filter list') - this.filters$ = this.store.select(fromFilter.getAdditionalFilters) as Observable; - this.provider$ = this.store.select(fromProvider.getSelectedProvider).pipe(skipWhile(p => !p)); - this.provider$ - .pipe( - takeUntil(this.ngUnsubscribe) - ) - .subscribe(p => { - this.store.dispatch(new LoadFilterRequest(p.resourceId)); - this.provider = p; - }); - - this.store.dispatch(new SetIndex('filters')); - - this.isSaving$ = this.store.select(fromFilter.getCollectionSaving); - } - - toggleEnabled(filter: MetadataFilter): void { - this.store.dispatch(new UpdateFilterRequest({ - filter: { ...filter, filterEnabled: !filter.filterEnabled }, - providerId: this.provider.resourceId - })); - } - - updateOrderUp(filter: MetadataFilter): void { - this.store.dispatch(new ChangeFilterOrderUp({ id: filter.resourceId, providerId: this.provider.resourceId })); - } - - updateOrderDown(filter: MetadataFilter): void { - this.store.dispatch(new ChangeFilterOrderDown({ id: filter.resourceId, providerId: this.provider.resourceId })); - } - - remove(id: string): void { - this.modalService - .open(DeleteFilterComponent) - .result - .then( - success => { - this.store.dispatch(new RemoveFilterRequest(id)); - }, - err => { - console.log('Cancelled'); - } - ); - } - - ngOnDestroy(): void { - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - - this.store.dispatch(new ClearFilters()); - } -} diff --git a/ui/src/app/metadata/provider/container/provider-select.component.html b/ui/src/app/metadata/provider/container/provider-select.component.html deleted file mode 100644 index 5389bd7e9..000000000 --- a/ui/src/app/metadata/provider/container/provider-select.component.html +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/ui/src/app/metadata/provider/container/provider-select.component.spec.ts b/ui/src/app/metadata/provider/container/provider-select.component.spec.ts deleted file mode 100644 index e4b9accc3..000000000 --- a/ui/src/app/metadata/provider/container/provider-select.component.spec.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; -import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; -import { ProviderSelectComponent } from './provider-select.component'; -import * as fromRoot from '../reducer'; -import * as fromWizard from '../../../wizard/reducer'; -import { MetadataProvider } from '../../domain/model'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(ProviderSelectComponent, {static: true}) - public componentUnderTest: ProviderSelectComponent; -} - -describe('Provider Select Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: ProviderSelectComponent; - let store: Store; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - RouterTestingModule, - StoreModule.forRoot({ - provider: combineReducers(fromRoot.reducers), - wizard: combineReducers(fromWizard.reducers) - }) - ], - declarations: [ - ProviderSelectComponent, - TestHostComponent - ], - providers: [] - }).compileComponents(); - - store = TestBed.get(Store); - spyOn(store, 'dispatch'); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should instantiate the component', waitForAsync(() => { - expect(app).toBeTruthy(); - })); - - describe('setDefinition method', () => { - it('should not dispatch an action if no provider is defined', () => { - app.setDefinition(null); - expect(store.dispatch).not.toHaveBeenCalled(); - }); - it('should dispatch an action if a provider is defined', () => { - app.setDefinition({} as MetadataProvider); - expect(store.dispatch).toHaveBeenCalled(); - }); - }); -}); diff --git a/ui/src/app/metadata/provider/container/provider-select.component.ts b/ui/src/app/metadata/provider/container/provider-select.component.ts deleted file mode 100644 index 6e300d302..000000000 --- a/ui/src/app/metadata/provider/container/provider-select.component.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { Component, OnDestroy } from '@angular/core'; -import { Subscription, Observable } from 'rxjs'; -import { Store } from '@ngrx/store'; - -import { ActivatedRoute } from '@angular/router'; -import { map, filter } from 'rxjs/operators'; -import { SelectProviderRequest, ClearProviderSelection } from '../action/collection.action'; -import * as fromProviders from '../reducer'; -import { MetadataProvider } from '../../domain/model'; -import { SetDefinition, ClearWizard } from '../../../wizard/action/wizard.action'; -import { MetadataProviderEditorTypes } from '../model'; -import { ClearProvider } from '../action/entity.action'; -import { ClearEditor } from '../action/editor.action'; - -@Component({ - selector: 'provider-select', - templateUrl: './provider-select.component.html', - styleUrls: [] -}) - -export class ProviderSelectComponent implements OnDestroy { - actionsSubscription: Subscription; - providerSubscription: Subscription; - - provider$: Observable; - - constructor( - private store: Store, - private route: ActivatedRoute - ) { - this.actionsSubscription = this.route.params.pipe( - map(params => new SelectProviderRequest(params.providerId)) - ).subscribe(store); - - this.provider$ = this.store.select(fromProviders.getSelectedProvider).pipe(filter(p => !!p)); - - this.providerSubscription = this.provider$.subscribe(provider => { - this.setDefinition(provider); - }); - } - - setDefinition(provider: MetadataProvider): void { - if (provider) { - this.store.dispatch(new SetDefinition({ - ...MetadataProviderEditorTypes.find(def => def.type === provider['@type']) - })); - } - } - - ngOnDestroy() { - this.actionsSubscription.unsubscribe(); - this.providerSubscription.unsubscribe(); - this.store.dispatch(new ClearProvider()); - this.store.dispatch(new ClearWizard()); - this.store.dispatch(new ClearEditor()); - this.store.dispatch(new ClearProviderSelection()); - } -} - diff --git a/ui/src/app/metadata/provider/container/provider-wizard-step.component.html b/ui/src/app/metadata/provider/container/provider-wizard-step.component.html deleted file mode 100644 index a9a3be2e4..000000000 --- a/ui/src/app/metadata/provider/container/provider-wizard-step.component.html +++ /dev/null @@ -1,9 +0,0 @@ - - - \ No newline at end of file diff --git a/ui/src/app/metadata/provider/container/provider-wizard-step.component.spec.ts b/ui/src/app/metadata/provider/container/provider-wizard-step.component.spec.ts deleted file mode 100644 index 883b9f793..000000000 --- a/ui/src/app/metadata/provider/container/provider-wizard-step.component.spec.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; - -import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; - -import { ProviderWizardStepComponent } from './provider-wizard-step.component'; -import * as fromRoot from '../reducer'; -import { SchemaFormModule, WidgetRegistry, DefaultWidgetRegistry } from 'ngx-schema-form'; -import * as fromWizard from '../../../wizard/reducer'; -import { SCHEMA } from '../../../../testing/form-schema.stub'; -import { MetadataProviderWizard } from '../model'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(ProviderWizardStepComponent, {static: true}) - public componentUnderTest: ProviderWizardStepComponent; -} - -describe('Provider Wizard Step Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: ProviderWizardStepComponent; - let store: Store; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - RouterTestingModule, - SchemaFormModule.forRoot(), - StoreModule.forRoot({ - provider: combineReducers(fromRoot.reducers), - wizard: combineReducers(fromWizard.reducers) - }) - ], - declarations: [ - ProviderWizardStepComponent, - TestHostComponent - ], - providers: [ - { provide: WidgetRegistry, useClass: DefaultWidgetRegistry } - ] - }).compileComponents(); - - store = TestBed.get(Store); - spyOn(store, 'dispatch'); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should instantiate the component', waitForAsync(() => { - expect(app).toBeTruthy(); - })); - - describe('resetSelectedType method', () => { - it('should dispatch a SetDefinition action if the type has changed', () => { - app.resetSelectedType({ value: { name: 'foo', '@type': 'FileBackedHttpMetadataResolver' } }, SCHEMA, MetadataProviderWizard); - expect(store.dispatch).toHaveBeenCalled(); - }); - - it('should NOT dispatch a SetDefinition action if the type hasn\'t changed', () => { - app.resetSelectedType({ value: { name: 'foo', '@type': 'MetadataProvider' } }, SCHEMA, MetadataProviderWizard); - expect(store.dispatch).not.toHaveBeenCalled(); - }); - - it('should NOT dispatch a SetDefinition action if the type isn\'t found', () => { - app.resetSelectedType({ value: { name: 'foo', '@type': 'FooProvider' } }, SCHEMA, MetadataProviderWizard); - expect(store.dispatch).not.toHaveBeenCalled(); - }); - - it('should return changes and definition if no type supplied', () => { - app.resetSelectedType({ value: { name: 'foo' } }, SCHEMA, MetadataProviderWizard); - expect(store.dispatch).not.toHaveBeenCalled(); - }); - }); - - describe('updateStatus method', () => { - it('should dispatch an UpdateStatus action', () => { - app.updateStatus({value: { name: 'notfound'} }); - expect(store.dispatch).toHaveBeenCalled(); - }); - - it('should NOT dispatch a SetDefinition action if the type hasn\'t changed', () => { - app.updateStatus({ value: null }); - expect(store.dispatch).toHaveBeenCalled(); - }); - }); -}); diff --git a/ui/src/app/metadata/provider/container/provider-wizard-step.component.ts b/ui/src/app/metadata/provider/container/provider-wizard-step.component.ts deleted file mode 100644 index a78f76db0..000000000 --- a/ui/src/app/metadata/provider/container/provider-wizard-step.component.ts +++ /dev/null @@ -1,130 +0,0 @@ -import { Component, OnDestroy } from '@angular/core'; -import { Observable, Subject } from 'rxjs'; -import { withLatestFrom, map, distinctUntilChanged, skipWhile, filter, takeUntil } from 'rxjs/operators'; -import { Store } from '@ngrx/store'; - -import * as fromProvider from '../reducer'; -import * as fromWizard from '../../../wizard/reducer'; - -import { SetDefinition } from '../../../wizard/action/wizard.action'; -import { UpdateStatus } from '../action/editor.action'; -import { Wizard } from '../../../wizard/model'; -import { MetadataProvider } from '../../domain/model'; -import { MetadataProviderWizardTypes, MetadataProviderWizard } from '../model'; -import { UpdateProvider } from '../action/entity.action'; -import { pick } from '../../../shared/util'; - -@Component({ - selector: 'provider-wizard-step', - templateUrl: './provider-wizard-step.component.html', - styleUrls: [] -}) - -export class ProviderWizardStepComponent implements OnDestroy { - private ngUnsubscribe: Subject = new Subject(); - - valueChangeSubject = new Subject>(); - private valueChangeEmitted$ = this.valueChangeSubject.asObservable(); - - statusChangeSubject = new Subject>(); - private statusChangeEmitted$ = this.statusChangeSubject.asObservable(); - - schema$: Observable; - bindings$: Observable; - schema: any; - definition$: Observable>; - changes$: Observable; - currentPage: string; - valid$: Observable; - model$: Observable; - - namesList: string[] = []; - - validators$: Observable<{ [key: string]: any }>; - - constructor( - private store: Store, - ) { - this.schema$ = this.store.select(fromWizard.getSchema).pipe( - filter(s => s && Object.keys(s.properties).length > 0) - ); - this.definition$ = this.store.select(fromWizard.getWizardDefinition); - this.bindings$ = this.definition$.pipe(map(d => d.bindings)); - this.changes$ = this.store.select(fromProvider.getEntityChanges); - - this.validators$ = this.definition$.pipe( - withLatestFrom( - this.store.select(fromProvider.getProviderNames), - this.store.select(fromProvider.getProviderXmlIds), - ), - map(([def, names, ids]) => def.getValidators( - names, - ids - )) - ); - - this.model$ = this.schema$.pipe( - withLatestFrom( - this.store.select(fromWizard.getModel), - this.changes$, - this.definition$ - ), - map(([schema, model, changes, definition]) => ({ - model: { - ...model, - ...changes - }, - definition - })), - skipWhile(({ model, definition }) => !definition || !model), - map(({ model, definition }) => definition.formatter(model)) - ); - - this.valueChangeEmitted$.pipe( - takeUntil(this.ngUnsubscribe), - withLatestFrom(this.schema$, this.definition$), - map(([changes, schema, definition]) => this.resetSelectedType(changes, schema, definition)), - skipWhile(({ changes, definition }) => !definition || !changes), - map(({ changes, definition }) => definition.parser(changes)) - ) - .subscribe(changes => this.store.dispatch(new UpdateProvider(changes))); - - this.statusChangeEmitted$.pipe( - takeUntil(this.ngUnsubscribe), - distinctUntilChanged()) - .subscribe(errors => this.updateStatus(errors)); - - this.store.select(fromWizard.getWizardIndex).pipe(takeUntil(this.ngUnsubscribe)).subscribe(i => this.currentPage = i); - } - - resetSelectedType(changes: any, schema: any, definition: any): { changes: any, definition: any } { - const type = changes.value['@type']; - if (type && type !== definition.type) { - const newDefinition = MetadataProviderWizardTypes.find(def => def.type === type); - if (newDefinition) { - this.store.dispatch(new SetDefinition({ - ...MetadataProviderWizard, - ...newDefinition, - steps: [ - ...MetadataProviderWizard.steps, - ...newDefinition.steps - ] - })); - changes = { value: pick(Object.keys(schema.properties))(changes.value) }; - } - } - return { changes: changes.value, definition }; - } - - updateStatus(errors: any): void { - const status = { [this.currentPage]: !(errors.value) ? 'VALID' : 'INVALID' }; - this.store.dispatch(new UpdateStatus(status)); - } - - ngOnDestroy() { - this.valueChangeSubject.complete(); - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - } -} - diff --git a/ui/src/app/metadata/provider/container/provider-wizard.component.html b/ui/src/app/metadata/provider/container/provider-wizard.component.html deleted file mode 100644 index bb0f77f1f..000000000 --- a/ui/src/app/metadata/provider/container/provider-wizard.component.html +++ /dev/null @@ -1,31 +0,0 @@ -
-
-
-
- Add a new metadata provider -
-
-
-
-
- -
-
-
- -
-
-
- -
-
-
-
- diff --git a/ui/src/app/metadata/provider/container/provider-wizard.component.spec.ts b/ui/src/app/metadata/provider/container/provider-wizard.component.spec.ts deleted file mode 100644 index 055a97714..000000000 --- a/ui/src/app/metadata/provider/container/provider-wizard.component.spec.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; - -import { NgbDropdownModule, NgbPopoverModule } from '@ng-bootstrap/ng-bootstrap'; - -import { ProviderWizardComponent } from './provider-wizard.component'; -import * as fromRoot from '../reducer'; -import { WizardModule } from '../../../wizard/wizard.module'; -import { SummaryPropertyComponent } from '../../domain/component/summary-property.component'; -import * as fromWizard from '../../../wizard/reducer'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { MetadataConfigurationComponentStub } from '../../../../testing/metadata-configuration.stub'; -import { WizardComponent } from '../../../wizard/component/wizard.component'; -import { EffectsModule } from '@ngrx/effects'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(ProviderWizardComponent, {static: true}) - public componentUnderTest: ProviderWizardComponent; -} - -describe('Provider Wizard Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: ProviderWizardComponent; - let store: Store; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - WizardModule.forRoot(), - WizardModule, - NgbDropdownModule, - NgbPopoverModule, - RouterTestingModule, - StoreModule.forRoot({ - provider: combineReducers(fromRoot.reducers), - wizard: combineReducers(fromWizard.reducers) - }), - EffectsModule.forRoot([]), - MockI18nModule - ], - declarations: [ - ProviderWizardComponent, - SummaryPropertyComponent, - MetadataConfigurationComponentStub, - TestHostComponent - ] - }).compileComponents(); - - store = TestBed.get(Store); - spyOn(store, 'dispatch'); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should instantiate the component', waitForAsync(() => { - expect(app).toBeTruthy(); - })); -}); diff --git a/ui/src/app/metadata/provider/container/provider-wizard.component.ts b/ui/src/app/metadata/provider/container/provider-wizard.component.ts deleted file mode 100644 index c17ae03f2..000000000 --- a/ui/src/app/metadata/provider/container/provider-wizard.component.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { Component, OnDestroy } from '@angular/core'; -import { Observable, Subject } from 'rxjs'; -import { Store } from '@ngrx/store'; - -import * as fromProvider from '../reducer'; -import * as fromWizard from '../../../wizard/reducer'; -import { SetIndex, SetDisabled, ClearWizard, SetDefinition } from '../../../wizard/action/wizard.action'; -import { ClearEditor } from '../action/editor.action'; -import { LoadSchemaRequest } from '../../../wizard/action/wizard.action'; -import { startWith, takeUntil } from 'rxjs/operators'; -import { Wizard, WizardStep } from '../../../wizard/model'; -import { MetadataProvider } from '../../domain/model'; -import { ClearProvider } from '../action/entity.action'; -import { AddProviderRequest } from '../action/collection.action'; -import { MetadataProviderWizard } from '../model'; -import { MetadataConfiguration } from '../../configuration/model/metadata-configuration'; - -@Component({ - selector: 'provider-wizard', - templateUrl: './provider-wizard.component.html', - styleUrls: [] -}) - -export class ProviderWizardComponent implements OnDestroy { - private ngUnsubscribe: Subject = new Subject(); - - definition$: Observable>; - changes$: Observable; - model$: Observable; - currentPage: string; - valid$: Observable; - - nextStep: WizardStep; - previousStep: WizardStep; - - summary$: Observable = this.store.select(fromProvider.getProviderConfiguration); - - provider: MetadataProvider; - - constructor( - private store: Store - ) { - this.store - .select(fromWizard.getCurrentWizardSchema) - .pipe(takeUntil(this.ngUnsubscribe)) - .subscribe(s => { - if (s) { - this.store.dispatch(new LoadSchemaRequest(s)); - } - }); - this.valid$ = this.store.select(fromProvider.getEditorIsValid); - this.changes$ = this.store.select(fromProvider.getEntityChanges); - - this.store.select(fromWizard.getNext).subscribe(n => this.nextStep = n); - this.store.select(fromWizard.getPrevious).subscribe(p => this.previousStep = p); - this.store.select(fromWizard.getWizardIndex).subscribe(i => this.currentPage = i); - - this.valid$ - .pipe(startWith(false), takeUntil(this.ngUnsubscribe)) - .subscribe((valid) => { - this.store.dispatch(new SetDisabled(!valid)); - }); - - this.changes$.pipe(takeUntil(this.ngUnsubscribe)).subscribe(c => this.provider = c); - - this.store.dispatch(new SetDefinition(MetadataProviderWizard)); - this.store.dispatch(new SetIndex(MetadataProviderWizard.steps[0].id)); - } - - ngOnDestroy() { - this.store.dispatch(new ClearProvider()); - this.store.dispatch(new ClearWizard()); - this.store.dispatch(new ClearEditor()); - - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - } - - next(): void { - this.store.dispatch(new SetIndex(this.nextStep.id)); - } - - previous(): void { - this.store.dispatch(new SetIndex(this.previousStep.id)); - } - - save(): void { - this.store.dispatch(new SetDisabled(true)); - this.store.dispatch(new AddProviderRequest(this.provider)); - } - - gotoPage(page: string): void { - this.store.dispatch(new SetIndex(page)); - } -} - diff --git a/ui/src/app/metadata/provider/effect/collection.effect.ts b/ui/src/app/metadata/provider/effect/collection.effect.ts deleted file mode 100644 index 04d296c7e..000000000 --- a/ui/src/app/metadata/provider/effect/collection.effect.ts +++ /dev/null @@ -1,282 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { Store } from '@ngrx/store'; -import { Router } from '@angular/router'; - -import { of } from 'rxjs'; -import { map, catchError, switchMap, tap, withLatestFrom, debounceTime } from 'rxjs/operators'; -import { - ProviderCollectionActionTypes, - AddProviderRequest, - AddProviderSuccess, - AddProviderFail, - LoadProviderRequest, - LoadProviderSuccess, - LoadProviderError, - SelectProviderRequest, - SelectProviderSuccess, - SelectProviderError, - UpdateProviderRequest, - UpdateProviderSuccess, - UpdateProviderFail, - UpdateProviderConflict, - GetOrderProviderRequest, - GetOrderProviderSuccess, - GetOrderProviderFail, - SetOrderProviderRequest, - SetOrderProviderSuccess, - SetOrderProviderFail, - ChangeProviderOrderUp, - ChangeProviderOrderDown -} from '../action/collection.action'; -import { MetadataProviderService } from '../../domain/service/provider.service'; -import * as fromProvider from '../reducer'; -import * as fromRoot from '../../../app.reducer'; -import { array_move } from '../../../shared/util'; -import { ClearProvider } from '../action/entity.action'; -import { ShowContentionAction } from '../../../contention/action/contention.action'; -import { ContentionService } from '../../../contention/service/contention.service'; -import { MetadataProvider } from '../../domain/model'; -import { AddNotification } from '../../../notification/action/notification.action'; -import { Notification, NotificationType } from '../../../notification/model/notification'; -import { SetDisabled } from '../../../wizard/action/wizard.action'; -import { I18nService } from '../../../i18n/service/i18n.service'; -import * as fromI18n from '../../../i18n/reducer'; -import { ClearEditor } from '../action/editor.action'; - - -/* istanbul ignore next */ -@Injectable() -export class CollectionEffects { - - @Effect() - openContention$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.UPDATE_PROVIDER_CONFLICT), - map(action => action.payload), - withLatestFrom(this.store.select(fromProvider.getSelectedProvider)), - switchMap(([changes, current]) => - this.providerService.find(current.resourceId).pipe( - map(data => new ShowContentionAction(this.contentionService.getContention(current, changes, data, { - resolve: (obj) => this.store.dispatch(new UpdateProviderRequest({ ...obj })), - reject: (obj) => this.gotoConfiguration(current) - }))) - ) - ) - ); - - - @Effect() - loadProviders$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.LOAD_PROVIDER_REQUEST), - switchMap(() => - this.providerService - .query() - .pipe( - map(providers => new LoadProviderSuccess(providers)), - catchError(error => of(new LoadProviderError(error))) - ) - ) - ); - - @Effect() - selectProviders$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.SELECT_PROVIDER_REQUEST), - map(action => action.payload), - debounceTime(500), - switchMap(id => { - return this.providerService - .find(id) - .pipe( - map(provider => new SelectProviderSuccess(provider)), - catchError(error => of(new SelectProviderError(error))) - ); - }) - ); - - @Effect() - createProvider$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.ADD_PROVIDER_REQUEST), - map(action => action.payload), - switchMap(provider => - this.providerService - .save(provider) - .pipe( - map(p => new AddProviderSuccess(p)), - catchError((e) => { - return of(new AddProviderFail(e.error)); - }) - ) - ) - ); - - @Effect() - createProviderFailDispatchNotification$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.ADD_PROVIDER_FAIL), - map(action => action.payload), - withLatestFrom(this.store.select(fromI18n.getMessages)), - map(([error, messages]) => { - let message = `${error.errorCode}: ${this.i18nService.translate(error.errorMessage, null, messages)}`; - message = error.cause ? `${message} - ${error.cause}` : message; - return new AddNotification( - new Notification( - NotificationType.Danger, - message, - 8000 - ) - ); - }) - ); - @Effect() - createProviderFailEnableForm$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.ADD_PROVIDER_FAIL), - map(action => action.payload), - map(error => new SetDisabled(false)) - ); - - @Effect({ dispatch: false }) - createProviderSuccessRedirect$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.ADD_PROVIDER_SUCCESS), - map(action => action.payload), - tap(provider => this.navigateToProvider(provider.resourceId)) - ); - - @Effect() - updateProvider$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.UPDATE_PROVIDER_REQUEST), - map(action => action.payload), - withLatestFrom(this.store.select(fromProvider.getSelectedProvider)), - map(([updates, original]) => ({ ...original, ...updates })), - switchMap(provider => - this.providerService - .update(provider) - .pipe( - map(p => new UpdateProviderSuccess({id: p.resourceId, changes: p})), - catchError((e) => e.status === 409 ? of(new UpdateProviderConflict(provider)) : of(new UpdateProviderFail(e.error))) - ) - ) - ); - - @Effect({ dispatch: false }) - updateProviderSuccessReload$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.UPDATE_PROVIDER_SUCCESS), - map(action => action.payload), - tap(provider => this.store.dispatch(new LoadProviderRequest())) - ); - - @Effect({ dispatch: false }) - updateProviderSuccessRedirect$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.UPDATE_PROVIDER_SUCCESS), - map(action => action.payload), - tap(provider => { - this.store.dispatch(new ClearProvider()); - this.navigateToProvider(provider.id); - }) - ); - - @Effect() - updateProviderFailDispatchNotification$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.UPDATE_PROVIDER_FAIL), - map(action => action.payload), - withLatestFrom(this.store.select(fromI18n.getMessages)), - map(([error, messages]) => new AddNotification( - new Notification( - NotificationType.Danger, - `${error.errorCode}: ${this.i18nService.translate(error.errorMessage, null, messages)}`, - 8000 - ) - )) - ); - - @Effect() - addProviderSuccessReload$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.ADD_PROVIDER_SUCCESS), - map(action => action.payload), - map(provider => new LoadProviderRequest()) - ); - - @Effect() - getOrderWithLoad$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.LOAD_PROVIDER_SUCCESS), - map(() => new GetOrderProviderRequest()) - ); - - @Effect() - getProviderOrder$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.GET_ORDER_PROVIDER_REQUEST), - switchMap(() => - this.providerService.getOrder().pipe( - map(order => new GetOrderProviderSuccess(order)), - catchError(err => of(new GetOrderProviderFail(err))) - ) - ) - ); - - @Effect() - reloadProviderOrderAfterChange$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.SET_ORDER_PROVIDER_SUCCESS), - map(() => new GetOrderProviderRequest()) - ); - - @Effect() - setProviderOrder$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.SET_ORDER_PROVIDER_REQUEST), - map(action => action.payload), - switchMap(order => - this.providerService.setOrder(order).pipe( - map(() => new SetOrderProviderSuccess()), - catchError(err => of(new SetOrderProviderFail(err))) - ) - ) - ); - - @Effect() - changeOrderUp$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.CHANGE_PROVIDER_ORDER_UP), - map(action => action.payload), - withLatestFrom(this.store.select(fromProvider.getProviderOrder)), - map(([id, order]) => { - const index = order.indexOf(id); - if (index > 0) { - const newOrder = array_move(order, index, index - 1); - return new SetOrderProviderRequest(newOrder); - } else { - return new SetOrderProviderFail(new Error(`could not change order: ${ id }`)); - } - }) - ); - - @Effect() - changeOrderDown$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.CHANGE_PROVIDER_ORDER_DOWN), - map(action => action.payload), - withLatestFrom(this.store.select(fromProvider.getProviderOrder)), - map(([id, order]) => { - const index = order.indexOf(id); - if (index < order.length - 1) { - const newOrder = array_move(order, index, index + 1); - return new SetOrderProviderRequest(newOrder); - } else { - return new SetOrderProviderFail(new Error(`could not change order: ${id}`)); - } - }) - ); - - constructor( - private actions$: Actions, - private router: Router, - private store: Store, - private providerService: MetadataProviderService, - private contentionService: ContentionService, - private i18nService: I18nService - ) { } - - navigateToProvider(id) { - this.router.navigate(['/', 'metadata', 'provider', id, 'configuration', 'options']); - } - - gotoConfiguration(provider) { - this.store.dispatch(new ClearProvider()); - this.store.dispatch(new ClearEditor()); - this.navigateToProvider(provider.resourceId); - } -} diff --git a/ui/src/app/metadata/provider/effect/editor.effect.ts b/ui/src/app/metadata/provider/effect/editor.effect.ts deleted file mode 100644 index 28a134724..000000000 --- a/ui/src/app/metadata/provider/effect/editor.effect.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { SchemaService } from '../../../schema-form/service/schema.service'; - -import { map, switchMap, catchError, debounceTime } from 'rxjs/operators'; -import { of } from 'rxjs'; -import { - LoadSchemaRequest, - LoadSchemaSuccess, - LoadSchemaFail, - SetDefinition, - WizardActionTypes -} from '../../../wizard/action/wizard.action'; -import { ResetChanges } from '../action/entity.action'; - -import * as fromWizard from '../../../wizard/reducer'; -import { Store } from '@ngrx/store'; -import { CancelContentionAction, ContentionActionTypes } from '../../../contention/action/contention.action'; - -@Injectable() -export class EditorEffects { - - @Effect() - $loadSchemaRequest = this.actions$.pipe( - ofType(WizardActionTypes.LOAD_SCHEMA_REQUEST), - map(action => action.payload), - debounceTime(100), - switchMap((schemaPath: string) => - this.schemaService - .get(schemaPath) - .pipe( - map(schema => new LoadSchemaSuccess(schema)), - catchError(error => of(new LoadSchemaFail(error))) - ) - ) - ); - - @Effect() - $resetChanges = this.actions$.pipe( - ofType(WizardActionTypes.SET_DEFINITION), - map(() => new ResetChanges()) - ); - - @Effect() - $resetChangesOnContentionFail = this.actions$.pipe( - ofType(ContentionActionTypes.CANCEL_CONTENTION), - map(() => new ResetChanges()) - ); - - constructor( - private schemaService: SchemaService, - private actions$: Actions - ) { } -} /* istanbul ignore next */ diff --git a/ui/src/app/metadata/provider/model/base.provider.form.spec.ts b/ui/src/app/metadata/provider/model/base.provider.form.spec.ts deleted file mode 100644 index 99adaa6fa..000000000 --- a/ui/src/app/metadata/provider/model/base.provider.form.spec.ts +++ /dev/null @@ -1,143 +0,0 @@ -import { BaseMetadataProviderEditor } from './base.provider.form'; - -describe('BaseMetadataProviderForm', () => { - - const parser = BaseMetadataProviderEditor.parser; - const formatter = BaseMetadataProviderEditor.formatter; - - const requiredValidUntilFilter = { - maxValidityInterval: 1, - '@type': 'RequiredValidUntil' - }; - - const signatureValidationFilter = { - requireSignedRoot: true, - certificateFile: 'foo', - '@type': 'SignatureValidation' - }; - - const entityRoleWhiteListFilter = { - retainedRoles: ['foo', 'bar'], - removeRolelessEntityDescriptors: true, - removeEmptyEntitiesDescriptors: true, - '@type': 'EntityRoleWhiteList' - }; - - describe('parser', () => { - it('should transform the filters object to an array', () => { - let model = { - name: 'foo', - '@type': 'FileBackedHttpMetadataProvider', - enabled: true, - resourceId: 'foo', - metadataFilters: { - RequiredValidUntil: requiredValidUntilFilter, - SignatureValidation: signatureValidationFilter, - EntityRoleWhiteList: entityRoleWhiteListFilter - } - }; - expect( - parser(model) - ).toEqual( - { - ...model, - metadataFilters: [ - requiredValidUntilFilter, - signatureValidationFilter, - entityRoleWhiteListFilter - ] - } - ); - }); - - it('should return the object if metadataFilters is not provided', () => { - let model = { - name: 'foo', - '@type': 'FileBackedHttpMetadataProvider', - enabled: true, - resourceId: 'foo' - }; - expect( - parser(model) - ).toEqual( - model - ); - }); - }); - - describe('formatter', () => { - it('should transform the filters object to an array', () => { - let model = { - name: 'foo', - '@type': 'FileBackedHttpMetadataProvider', - enabled: true, - resourceId: 'foo', - metadataFilters: [ - requiredValidUntilFilter, - signatureValidationFilter, - entityRoleWhiteListFilter - ] - }; - expect( - formatter(model) - ).toEqual( - { - ...model, - metadataFilters: { - RequiredValidUntil: requiredValidUntilFilter, - SignatureValidation: signatureValidationFilter, - EntityRoleWhiteList: entityRoleWhiteListFilter - } - } - ); - }); - - it('should return the object if metadataFilters is not provided', () => { - let model = { - name: 'foo', - '@type': 'FileBackedHttpMetadataProvider', - enabled: true, - resourceId: 'foo' - }; - expect( - formatter(model) - ).toEqual( - model - ); - }); - }); - - describe('getValidators', () => { - it('should return a set of validator functions for the provider type', () => { - const validators = BaseMetadataProviderEditor.getValidators([]); - expect(validators).toBeDefined(); - expect(validators['/']).toBeDefined(); - expect(validators['/name']).toBeDefined(); - }); - - describe('name `/name` validator', () => { - const validators = BaseMetadataProviderEditor.getValidators(['foo', 'bar']); - - it('should return an invalid object when provided values are invalid based on name', () => { - expect(validators['/name']('foo', { path: '/name' })).toBeDefined(); - }); - - it('should return null when provided values are valid based on name', () => { - expect(validators['/name']('baz', { path: '/name' })).toBeNull(); - }); - }); - - describe('parent `/` validator', () => { - const validators = BaseMetadataProviderEditor.getValidators(['foo', 'bar']); - const prop = { path: '/name', properties: { name: { type: 'string' } } }; - - it('should return a list of child errors', () => { - expect(validators['/']({name: 'foo'}, prop, {}).length).toBe(1); - }); - - it('should ignore properties that don\'t exist a list of child errors', () => { - expect(validators['/']({ foo: 'bar' }, prop, {})).toBeUndefined(); - }); - }); - }); -}); diff --git a/ui/src/app/metadata/provider/model/base.provider.form.ts b/ui/src/app/metadata/provider/model/base.provider.form.ts deleted file mode 100644 index 8152faa79..000000000 --- a/ui/src/app/metadata/provider/model/base.provider.form.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { Wizard } from '../../../wizard/model'; -import { BaseMetadataProvider } from '../../domain/model/providers'; -import { filterTypeFn } from '../../filter/reducer'; -import { getFilteredProviderNames, getFilteredProviderXmlIds } from '../reducer'; - -export const BaseMetadataProviderEditor: Wizard = { - label: 'BaseMetadataProvider', - type: 'BaseMetadataResolver', - schema: '', - validatorParams: [getFilteredProviderNames, getFilteredProviderXmlIds], - getValidators(namesList: string[], xmlIdList: string[]): any { - const validators = { - '/': (value, property, form_current) => { - let errors; - Object.keys(value).forEach((key) => { - const item = value[key]; - const validatorKey = `/${key}`; - const validator = validators.hasOwnProperty(validatorKey) ? validators[validatorKey] : null; - const error = validator ? validator(item, property.properties[key], form_current) : null; - if (error) { - errors = errors || []; - errors.push(error); - } - }); - return errors; - }, - '/name': (value, property, form) => { - const err = namesList.indexOf(value) > -1 ? { - code: 'INVALID_NAME', - path: `#${property.path}`, - message: 'message.name-must-be-unique', - params: [value] - } : null; - return err; - }, - '/xmlId': (value, property, form) => { - const err = xmlIdList.indexOf(value) > -1 ? { - code: 'INVALID_ID', - path: `#${property.path}`, - message: 'message.id-unique', - params: [value] - } : null; - return err; - } - }; - return validators; - }, - parser: (changes: any, provider: any): BaseMetadataProvider => { - if (!changes.metadataFilters) { - return changes; - } - const staticFilterTypes = Object.keys(changes.metadataFilters); - const filterList = filterTypeFn(provider.metadataFilters); - return { - ...changes, - metadataFilters: [ - ...staticFilterTypes.reduce((collection, filterName) => ([ - ...collection, - { - ...changes.metadataFilters[filterName], - '@type': filterName - } - ]), []), - ...filterList - ] - }; - }, - formatter: (changes: BaseMetadataProvider): any => { - if (!changes.metadataFilters) { - return changes; - } - return { - ...changes, - metadataFilters: { - ...(changes.metadataFilters || []).reduce((collection, filter) => ({ - ...collection, - [filter['@type']]: filter - }), {}) - } - }; - }, - steps: [] -}; diff --git a/ui/src/app/metadata/provider/model/dynamic-http.provider.form.spec.ts b/ui/src/app/metadata/provider/model/dynamic-http.provider.form.spec.ts deleted file mode 100644 index f561b4e99..000000000 --- a/ui/src/app/metadata/provider/model/dynamic-http.provider.form.spec.ts +++ /dev/null @@ -1,210 +0,0 @@ -import { DynamicHttpMetadataProviderWizard } from './dynamic-http.provider.form'; - -const schema = { - 'type': 'object', - 'required': [ - '@type', - 'content' - ], - 'properties': { - '@type': { - 'title': 'label.md-request-type', - 'description': 'tooltip.md-request-type', - 'type': 'string', - 'widget': { - 'id': 'select' - }, - 'oneOf': [ - { - 'enum': [ - 'MetadataQueryProtocol' - ], - 'description': 'value.md-query-protocol' - }, - { - 'enum': [ - 'Regex' - ], - 'description': 'value.regex' - } - ] - }, - 'content': { - 'title': 'label.md-request-value', - 'description': 'tooltip.md-request-value', - 'type': 'string' - }, - 'match': { - 'title': 'label.match', - 'description': 'tooltip.match', - 'type': 'string', - 'visibleIf': { - '@type': [ - 'Regex' - ] - } - } - } -}; - -describe('DynamicHttpMetadataProviderWizard', () => { - - const parser = DynamicHttpMetadataProviderWizard.parser; - const formatter = DynamicHttpMetadataProviderWizard.formatter; - const getValidators = DynamicHttpMetadataProviderWizard.getValidators; - - const requiredValidUntilFilter = { - maxValidityInterval: 1, - '@type': 'RequiredValidUntil' - }; - - const signatureValidationFilter = { - requireSignedRoot: true, - certificateFile: 'foo', - '@type': 'SignatureValidation' - }; - - const entityRoleWhiteListFilter = { - retainedRoles: ['foo', 'bar'], - removeRolelessEntityDescriptors: true, - removeEmptyEntitiesDescriptors: true, - '@type': 'EntityRoleWhiteList' - }; - - describe('parser', () => { - it('should transform the filters object to an array', () => { - let model = { - name: 'foo', - '@type': 'DynamicHttpMetadataResolver', - enabled: true, - resourceId: 'foo', - metadataFilters: { - RequiredValidUntil: requiredValidUntilFilter, - SignatureValidation: signatureValidationFilter, - EntityRoleWhiteList: entityRoleWhiteListFilter - } - }; - expect( - parser(model) - ).toEqual( - { - ...model, - metadataFilters: [ - requiredValidUntilFilter, - signatureValidationFilter, - entityRoleWhiteListFilter - ] - } - ); - }); - - it('should return the object if metadataFilters is not provided', () => { - let model = { - name: 'foo', - '@type': 'DynamicHttpMetadataResolver', - enabled: true, - resourceId: 'foo' - }; - expect( - parser(model) - ).toEqual( - model - ); - }); - }); - - describe('formatter', () => { - it('should transform the filters object to an array', () => { - let model = { - name: 'foo', - '@type': 'DynamicHttpMetadataResolver', - enabled: true, - resourceId: 'foo', - metadataFilters: [ - requiredValidUntilFilter, - signatureValidationFilter, - entityRoleWhiteListFilter - ] - }; - expect( - formatter(model) - ).toEqual( - { - ...model, - metadataFilters: { - RequiredValidUntil: requiredValidUntilFilter, - SignatureValidation: signatureValidationFilter, - EntityRoleWhiteList: entityRoleWhiteListFilter - } - } - ); - }); - - it('should return the object if metadataFilters is not provided', () => { - let model = { - name: 'foo', - '@type': 'DynamicHttpMetadataResolver', - enabled: true, - resourceId: 'foo' - }; - expect( - formatter(model) - ).toEqual( - model - ); - }); - }); - - describe('getValidators method', () => { - it('should return a list of validators for the ngx-schema-form', () => { - expect(Object.keys(getValidators([]))).toEqual([ - '/', - '/name', - '/xmlId', - '/metadataRequestURLConstructionScheme', - '/metadataRequestURLConstructionScheme/content', - '/metadataRequestURLConstructionScheme/@type', - '/metadataRequestURLConstructionScheme/match' - ]); - }); - }); - - describe('validators', () => { - let validators, - metadataRequestURLConstructionScheme, - metadataRequestURLConstructionSchemeContent, - metadataRequestURLConstructionSchemeType, - metadataRequestURLConstructionSchemeMatch; - - beforeEach(() => { - validators = getValidators([], []); - }); - - describe('metadataRequestURLConstructionScheme', () => { - it('should check other validators and propagate those errors up', () => { - const value = { - content: null, - '@type': null, - match: 'foo' - }; - const property = { value, schema, properties: null }; - property.properties = { - content: { - path: 'content', - parent: property - }, - '@type': { - path: '@type', - parent: property - }, - match: { - path: 'match', - parent: property - } - }; - const validator = validators['/metadataRequestURLConstructionScheme']; - expect(validator(value, property, null).length).toBe(2); - }); - }); - }); -}); diff --git a/ui/src/app/metadata/provider/model/dynamic-http.provider.form.ts b/ui/src/app/metadata/provider/model/dynamic-http.provider.form.ts deleted file mode 100644 index ac09ed7ac..000000000 --- a/ui/src/app/metadata/provider/model/dynamic-http.provider.form.ts +++ /dev/null @@ -1,208 +0,0 @@ -import { Wizard } from '../../../wizard/model'; -import { DynamicHttpMetadataProvider } from '../../domain/model/providers/dynamic-http-metadata-provider'; -import { BaseMetadataProviderEditor } from './base.provider.form'; -import { metadataFilterProcessor } from './utilities'; -import RegexValidator from '../../../shared/validation/regex.validator'; -import { memoize } from '../../../shared/memo'; -import API_BASE_PATH from '../../../app.constant'; - -const checkRegex = memoize(RegexValidator.isValidRegex); - -export const DynamicHttpMetadataProviderWizard: Wizard = { - ...BaseMetadataProviderEditor, - label: 'DynamicHttpMetadataProvider', - type: 'DynamicHttpMetadataResolver', - schemaPreprocessor: metadataFilterProcessor, - getValidators(namesList: string[] = [], xmlIdList: string[] = []): any { - const validators = BaseMetadataProviderEditor.getValidators(namesList, xmlIdList); - - validators['/metadataRequestURLConstructionScheme'] = (value, property, form) => { - let errors; - let keys = Object.keys(property.schema.properties); - - keys.forEach((item) => { - const path = `/metadataRequestURLConstructionScheme/${item}`; - const error = validators[path](value[item], property.properties[item], form); - if (error) { - errors = errors || []; - errors.push(error); - } - }); - return errors; - }; - - validators['/metadataRequestURLConstructionScheme/content'] = (value, property, form) => { - const err = !value ? { - code: 'REQUIRED', - path: `#${property.path}`, - message: 'message.value-required', - params: [value] - } : null; - return err; - }; - - validators['/metadataRequestURLConstructionScheme/@type'] = (value, property, form) => { - const err = !value ? { - code: 'REQUIRED', - path: `#${property.path}`, - message: 'message.type-required', - params: [value] - } : null; - return err; - }; - - validators['/metadataRequestURLConstructionScheme/match'] = (value, property, form) => { - if (!property.parent || !property.parent.value) { - return null; - } - - const error = { - path: `#${property.path}`, - params: [value] - }; - - const isRegex = property.parent.value['@type'] === 'Regex'; - let err = null; - if (isRegex) { - if (!value) { - err = { - ...error, - code: 'REQUIRED', - message: 'message.match-required' - }; - } - if (!checkRegex(value)) { - err = { - ...error, - code: 'INVALID_REGEX', - message: 'message.invalid-regex-pattern' - }; - } - } - return err; - }; - - return validators; - }, - schema: `${API_BASE_PATH}/ui/MetadataResolver/DynamicHttpMetadataResolver`, - steps: [ - { - id: 'common', - label: 'label.common-attributes', - index: 2, - initialValues: [], - fields: [ - 'xmlId', - 'requireValidMetadata', - 'failFastInitialization', - 'metadataRequestURLConstructionScheme' - ] - }, - { - id: 'dynamic', - label: 'label.dynamic-attributes', - index: 3, - initialValues: [], - fields: [ - 'dynamicMetadataResolverAttributes' - ] - }, - { - id: 'plugins', - label: 'label.metadata-filter-plugins', - index: 4, - initialValues: [], - fields: [ - 'metadataFilters' - ] - }, - { - id: 'summary', - label: 'label.finished', - index: 5, - initialValues: [], - fields: [ - 'enabled' - ] - } - ] -}; - - -export const DynamicHttpMetadataProviderEditor: Wizard = { - ...DynamicHttpMetadataProviderWizard, - steps: [ - { - id: 'common', - label: 'label.common-attributes', - index: 1, - initialValues: [], - fields: [ - 'name', - '@type', - 'xmlId', - 'metadataRequestURLConstructionScheme', - 'enabled', - 'requireValidMetadata', - 'failFastInitialization' - ], - fieldsets: [ - { - type: 'section', - class: ['mb-3'], - fields: [ - 'name', - '@type' - ] - }, - { - type: 'group-lg', - class: ['col-12'], - fields: [ - 'xmlId', - 'metadataRequestURLConstructionScheme', - 'enabled', - 'requireValidMetadata', - 'failFastInitialization' - ] - } - ], - override: { - '@type': { - type: 'string', - readOnly: true, - widget: 'string', - oneOf: [{ enum: ['DynamicHttpMetadataResolver'], description: 'value.dynamic-http-metadata-provider' }] - } - } - }, - { - id: 'dynamic', - label: 'label.dynamic-attributes', - index: 3, - initialValues: [], - fields: [ - 'dynamicMetadataResolverAttributes' - ] - }, - { - id: 'plugins', - label: 'label.metadata-filter-plugins', - index: 4, - initialValues: [], - fields: [ - 'metadataFilters' - ] - }, - { - id: 'advanced', - label: 'label.http-settings-advanced', - index: 4, - initialValues: [], - locked: true, - fields: [ - 'httpMetadataResolverAttributes' - ] - } - ] -}; diff --git a/ui/src/app/metadata/provider/model/file-backed-http.provider.form.spec.ts b/ui/src/app/metadata/provider/model/file-backed-http.provider.form.spec.ts deleted file mode 100644 index 4176905de..000000000 --- a/ui/src/app/metadata/provider/model/file-backed-http.provider.form.spec.ts +++ /dev/null @@ -1,130 +0,0 @@ -import { FileBackedHttpMetadataProviderWizard } from './file-backed-http.provider.form'; - -describe('FileBackedHttpMetadataProviderWizard', () => { - - const parser = FileBackedHttpMetadataProviderWizard.parser; - const formatter = FileBackedHttpMetadataProviderWizard.formatter; - const getValidators = FileBackedHttpMetadataProviderWizard.getValidators; - - const requiredValidUntilFilter = { - maxValidityInterval: 1, - '@type': 'RequiredValidUntil' - }; - - const signatureValidationFilter = { - requireSignedRoot: true, - certificateFile: 'foo', - '@type': 'SignatureValidation' - }; - - const entityRoleWhiteListFilter = { - retainedRoles: ['foo', 'bar'], - removeRolelessEntityDescriptors: true, - removeEmptyEntitiesDescriptors: true, - '@type': 'EntityRoleWhiteList' - }; - - describe('parser', () => { - it('should transform the filters object to an array', () => { - let model = { - name: 'foo', - '@type': 'FileBackedHttpMetadataProvider', - enabled: true, - resourceId: 'foo', - metadataFilters: { - RequiredValidUntil: requiredValidUntilFilter, - SignatureValidation: signatureValidationFilter, - EntityRoleWhiteList: entityRoleWhiteListFilter - } - }; - expect( - parser(model) - ).toEqual( - { - ...model, - metadataFilters: [ - requiredValidUntilFilter, - signatureValidationFilter, - entityRoleWhiteListFilter - ] - } - ); - }); - - it('should return the object if metadataFilters is not provided', () => { - let model = { - name: 'foo', - '@type': 'FileBackedHttpMetadataProvider', - enabled: true, - resourceId: 'foo' - }; - expect( - parser(model) - ).toEqual( - model - ); - }); - }); - - describe('formatter', () => { - it('should transform the filters object to an array', () => { - let model = { - name: 'foo', - '@type': 'FileBackedHttpMetadataProvider', - enabled: true, - resourceId: 'foo', - metadataFilters: [ - requiredValidUntilFilter, - signatureValidationFilter, - entityRoleWhiteListFilter - ] - }; - expect( - formatter(model) - ).toEqual( - { - ...model, - metadataFilters: { - RequiredValidUntil: requiredValidUntilFilter, - SignatureValidation: signatureValidationFilter, - EntityRoleWhiteList: entityRoleWhiteListFilter - } - } - ); - }); - - it('should return the object if metadataFilters is not provided', () => { - let model = { - name: 'foo', - '@type': 'FileBackedHttpMetadataProvider', - enabled: true, - resourceId: 'foo' - }; - expect( - formatter(model) - ).toEqual( - model - ); - }); - }); - - describe('getValidators method', () => { - it('should return a list of validators for the ngx-schema-form', () => { - expect(Object.keys(getValidators([]))).toEqual([ - '/', - '/name', - '/xmlId', - '/metadataURL' - ]); - }); - - it('should validate the metadataUrl format', () => { - const validators = getValidators(); - const path = '/metadataURL'; - const validator = validators[path]; - - expect(validator('foo', { path })).toBeDefined(); - expect(validator('http://foo.com', { path })).toBeNull(); - }); - }); -}); diff --git a/ui/src/app/metadata/provider/model/file-backed-http.provider.form.ts b/ui/src/app/metadata/provider/model/file-backed-http.provider.form.ts deleted file mode 100644 index 15064bd64..000000000 --- a/ui/src/app/metadata/provider/model/file-backed-http.provider.form.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { Wizard } from '../../../wizard/model'; -import { FileBackedHttpMetadataProvider } from '../../domain/model/providers/file-backed-http-metadata-provider'; -import { BaseMetadataProviderEditor } from './base.provider.form'; -import { UriValidator } from '../../../shared/validation/uri.validator'; - -import { metadataFilterProcessor } from './utilities'; - -export const FileBackedHttpMetadataProviderWizard: Wizard = { - ...BaseMetadataProviderEditor, - label: 'FileBackedHttpMetadataProvider', - type: 'FileBackedHttpMetadataResolver', - schemaPreprocessor: metadataFilterProcessor, - getValidators(namesList: string[] = [], xmlIdList: string[] = []): any { - const validators = BaseMetadataProviderEditor.getValidators(namesList, xmlIdList); - validators['/metadataURL'] = (value, property, form) => { - return !UriValidator.isUri(value) ? { - code: 'INVALID_URI', - path: `#${property.path}`, - message: 'message.uri-valid-format', - params: [value] - } : null; - }; - return validators; - }, - schema: 'assets/schema/provider/filebacked-http.schema.json', - steps: [ - { - id: 'common', - label: 'label.common-attributes', - index: 2, - initialValues: [], - fields: [ - 'xmlId', - 'metadataURL', - 'initializeFromBackupFile', - 'backingFile', - 'backupFileInitNextRefreshDelay', - 'requireValidMetadata', - 'failFastInitialization', - 'useDefaultPredicateRegistry', - 'satisfyAnyPredicates' - ] - }, - { - id: 'reloading', - label: 'label.reloading-attributes', - index: 3, - initialValues: [], - fields: [ - 'reloadableMetadataResolverAttributes' - ] - }, - { - id: 'plugins', - label: 'label.metadata-filter-plugins', - index: 4, - initialValues: [ - { key: 'metadataFilters', value: [] } - ], - fields: [ - 'metadataFilters' - ] - }, - { - id: 'summary', - label: 'label.finished', - index: 5, - initialValues: [], - fields: [ - 'enabled' - ] - } - ] -}; - - -export const FileBackedHttpMetadataProviderEditor: Wizard = { - ...FileBackedHttpMetadataProviderWizard, - schema: 'assets/schema/provider/filebacked-http.schema.json', - steps: [ - { - id: 'common', - label: 'label.common-attributes', - index: 1, - initialValues: [], - fields: [ - 'name', - '@type', - 'enabled', - 'xmlId', - 'metadataURL', - 'initializeFromBackupFile', - 'backingFile', - 'backupFileInitNextRefreshDelay', - 'requireValidMetadata', - 'failFastInitialization', - 'useDefaultPredicateRegistry', - 'satisfyAnyPredicates' - ] - }, - { - id: 'reloading', - label: 'label.reloading-attributes', - index: 2, - initialValues: [], - fields: [ - 'reloadableMetadataResolverAttributes' - ] - }, - { - id: 'plugins', - label: 'label.metadata-filter-plugins', - index: 3, - initialValues: [ - { key: 'metadataFilters', value: [] } - ], - fields: [ - 'metadataFilters' - ] - }, - { - id: 'advanced', - label: 'label.advanced-settings', - index: 4, - initialValues: [], - locked: true, - fields: [ - 'httpMetadataResolverAttributes' - ] - } - ] -}; diff --git a/ui/src/app/metadata/provider/model/file-system.provider.form.spec.ts b/ui/src/app/metadata/provider/model/file-system.provider.form.spec.ts deleted file mode 100644 index ae8fb4a9a..000000000 --- a/ui/src/app/metadata/provider/model/file-system.provider.form.spec.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { FileSystemMetadataProviderWizard } from './file-system.provider.form'; - -describe('FileSystemMetadataProviderWizard', () => { - - const parser = FileSystemMetadataProviderWizard.parser; - const formatter = FileSystemMetadataProviderWizard.formatter; - const getValidators = FileSystemMetadataProviderWizard.getValidators; - - const requiredValidUntilFilter = { - maxValidityInterval: 1, - '@type': 'RequiredValidUntil' - }; - - const signatureValidationFilter = { - requireSignedRoot: true, - certificateFile: 'foo', - '@type': 'SignatureValidation' - }; - - const entityRoleWhiteListFilter = { - retainedRoles: ['foo', 'bar'], - removeRolelessEntityDescriptors: true, - removeEmptyEntitiesDescriptors: true, - '@type': 'EntityRoleWhiteList' - }; - - describe('parser', () => { - it('should transform the filters object to an array', () => { - let model = { - name: 'foo', - '@type': 'FileSystemMetadataProvider', - enabled: true, - resourceId: 'foo', - metadataFilters: { - RequiredValidUntil: requiredValidUntilFilter, - SignatureValidation: signatureValidationFilter, - EntityRoleWhiteList: entityRoleWhiteListFilter - } - }; - expect( - parser(model) - ).toEqual( - { - ...model, - metadataFilters: [ - requiredValidUntilFilter, - signatureValidationFilter, - entityRoleWhiteListFilter - ] - } - ); - }); - - it('should return the object if metadataFilters is not provided', () => { - let model = { - name: 'foo', - '@type': 'FileSystemMetadataProvider', - enabled: true, - resourceId: 'foo' - }; - expect( - parser(model) - ).toEqual( - model - ); - }); - }); - - describe('formatter', () => { - it('should transform the filters object to an array', () => { - let model = { - name: 'foo', - '@type': 'FileSystemMetadataProvider', - enabled: true, - resourceId: 'foo', - metadataFilters: [ - requiredValidUntilFilter, - signatureValidationFilter, - entityRoleWhiteListFilter - ] - }; - expect( - formatter(model) - ).toEqual( - { - ...model, - metadataFilters: { - RequiredValidUntil: requiredValidUntilFilter, - SignatureValidation: signatureValidationFilter, - EntityRoleWhiteList: entityRoleWhiteListFilter - } - } - ); - }); - - it('should return the object if metadataFilters is not provided', () => { - let model = { - name: 'foo', - '@type': 'FileSystemMetadataProvider', - enabled: true, - resourceId: 'foo' - }; - expect( - formatter(model) - ).toEqual( - model - ); - }); - }); - - describe('getValidators method', () => { - it('should return a list of validators for the ngx-schema-form', () => { - expect(Object.keys(getValidators([]))).toEqual([ - '/', - '/name', - '/xmlId' - ]); - }); - }); -}); diff --git a/ui/src/app/metadata/provider/model/local-dynamic.provider.form.spec.ts b/ui/src/app/metadata/provider/model/local-dynamic.provider.form.spec.ts deleted file mode 100644 index 3275f2f31..000000000 --- a/ui/src/app/metadata/provider/model/local-dynamic.provider.form.spec.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { LocalDynamicMetadataProviderWizard } from './local-dynamic.provider.form'; - -describe('LocalDynamicMetadataProviderWizard', () => { - - const parser = LocalDynamicMetadataProviderWizard.parser; - const formatter = LocalDynamicMetadataProviderWizard.formatter; - const getValidators = LocalDynamicMetadataProviderWizard.getValidators; - - const requiredValidUntilFilter = { - maxValidityInterval: 1, - '@type': 'RequiredValidUntil' - }; - - const signatureValidationFilter = { - requireSignedRoot: true, - certificateFile: 'foo', - '@type': 'SignatureValidation' - }; - - const entityRoleWhiteListFilter = { - retainedRoles: ['foo', 'bar'], - removeRolelessEntityDescriptors: true, - removeEmptyEntitiesDescriptors: true, - '@type': 'EntityRoleWhiteList' - }; - - describe('parser', () => { - it('should transform the filters object to an array', () => { - let model = { - name: 'foo', - '@type': 'LocalDynamicMetadataResolver', - enabled: true, - resourceId: 'foo', - metadataFilters: { - RequiredValidUntil: requiredValidUntilFilter, - SignatureValidation: signatureValidationFilter, - EntityRoleWhiteList: entityRoleWhiteListFilter - } - }; - expect( - parser(model) - ).toEqual( - { - ...model, - metadataFilters: [ - requiredValidUntilFilter, - signatureValidationFilter, - entityRoleWhiteListFilter - ] - } - ); - }); - - it('should return the object if metadataFilters is not provided', () => { - let model = { - name: 'foo', - '@type': 'LocalDynamicMetadataResolver', - enabled: true, - resourceId: 'foo' - }; - expect( - parser(model) - ).toEqual( - model - ); - }); - }); - - describe('formatter', () => { - it('should transform the filters object to an array', () => { - let model = { - name: 'foo', - '@type': 'LocalDynamicMetadataResolver', - enabled: true, - resourceId: 'foo', - metadataFilters: [ - requiredValidUntilFilter, - signatureValidationFilter, - entityRoleWhiteListFilter - ] - }; - expect( - formatter(model) - ).toEqual( - { - ...model, - metadataFilters: { - RequiredValidUntil: requiredValidUntilFilter, - SignatureValidation: signatureValidationFilter, - EntityRoleWhiteList: entityRoleWhiteListFilter - } - } - ); - }); - - it('should return the object if metadataFilters is not provided', () => { - let model = { - name: 'foo', - '@type': 'LocalDynamicMetadataResolver', - enabled: true, - resourceId: 'foo' - }; - expect( - formatter(model) - ).toEqual( - model - ); - }); - }); - - describe('getValidators method', () => { - it('should return a list of validators for the ngx-schema-form', () => { - expect(Object.keys(getValidators([]))).toEqual([ - '/', - '/name', - '/xmlId' - ]); - }); - }); -}); diff --git a/ui/src/app/metadata/provider/model/provider.form.ts b/ui/src/app/metadata/provider/model/provider.form.ts deleted file mode 100644 index 4377d1083..000000000 --- a/ui/src/app/metadata/provider/model/provider.form.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Wizard, WizardStep } from '../../../wizard/model'; -import { MetadataProvider } from '../../domain/model'; -import { BaseMetadataProviderEditor } from './base.provider.form'; - -export const MetadataProviderWizard: Wizard = { - ...BaseMetadataProviderEditor, - label: 'MetadataProvider', - type: 'MetadataProvider', - schema: 'assets/schema/provider/metadata-provider.schema.json', - steps: [ - { - id: 'new', - label: 'label.select-metadata-provider-type', - index: 1, - initialValues: [], - fields: [ - 'name', - '@type' - ], - fieldsets: [ - { - type: 'section', - class: ['col-12'], - fields: [ - 'name', - '@type' - ] - } - ] - } - ] as WizardStep[], -}; diff --git a/ui/src/app/metadata/provider/model/utilities.spec.ts b/ui/src/app/metadata/provider/model/utilities.spec.ts deleted file mode 100644 index 5affea1ae..000000000 --- a/ui/src/app/metadata/provider/model/utilities.spec.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { metadataFilterProcessor } from './utilities'; - -describe('provider model utilities', () => { - describe('metadata filter processor function', () => { - it('should return null if no schema provided', () => { - expect(metadataFilterProcessor(null)).toBe(null); - }); - - it('should return the schema if no properties are detected', () => { - const schema = {}; - expect(metadataFilterProcessor(schema)).toBe(schema); - }); - - it('should return the schema if no metadataFilters property exists in the schema', () => { - const schema = { properties: { foo: 'bar' } }; - expect(metadataFilterProcessor(schema)).toBe(schema); - }); - - it('should turn the filters into an object if provided ', () => { - const schema = { properties: { metadataFilters: { - type: 'array', - items: [ - { - $id: 'foo', - type: 'string' - } - ] - } } }; - const processed = metadataFilterProcessor(schema); - expect(processed.properties.metadataFilters.properties.foo.type).toBe('string'); - }); - }); -}); diff --git a/ui/src/app/metadata/provider/provider.component.ts b/ui/src/app/metadata/provider/provider.component.ts deleted file mode 100644 index 3572b8642..000000000 --- a/ui/src/app/metadata/provider/provider.component.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Component, ChangeDetectionStrategy } from '@angular/core'; -import { Store } from '@ngrx/store'; - -import { LoadProviderRequest } from './action/collection.action'; -import * as fromRoot from '../../app.reducer'; - -@Component({ - selector: 'metadata-provider-page', - changeDetection: ChangeDetectionStrategy.OnPush, - template: '
', - styleUrls: [] -}) -export class MetadataProviderPageComponent { - - constructor( - private store: Store - ) { - // this.store.dispatch(new LoadProviderRequest()); - } -} diff --git a/ui/src/app/metadata/provider/provider.module.ts b/ui/src/app/metadata/provider/provider.module.ts deleted file mode 100644 index 25f4a13d2..000000000 --- a/ui/src/app/metadata/provider/provider.module.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { NgModule, ModuleWithProviders } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { CommonModule } from '@angular/common'; -import { RouterModule } from '@angular/router'; -import { StoreModule } from '@ngrx/store'; - -import { EffectsModule } from '@ngrx/effects'; -import { NgbDropdownModule, NgbModalModule } from '@ng-bootstrap/ng-bootstrap'; - -import { ProviderWizardComponent } from './container/provider-wizard.component'; -import { ProviderWizardStepComponent } from './container/provider-wizard-step.component'; -import { WizardModule } from '../../wizard/wizard.module'; -import * as fromProvider from './reducer'; -import { EditorEffects } from './effect/editor.effect'; - -import { FormModule } from '../../schema-form/schema-form.module'; -import { CollectionEffects } from './effect/collection.effect'; -import { SharedModule } from '../../shared/shared.module'; -import { ProviderEditComponent } from './container/provider-edit.component'; -import { ProviderSelectComponent } from './container/provider-select.component'; -import { ProviderEditStepComponent } from './container/provider-edit-step.component'; -import { ProviderFilterListComponent } from './container/provider-filter-list.component'; - -import { ContentionModule } from '../../contention/contention.module'; -import { DeleteFilterComponent } from './component/delete-filter.component'; -import { I18nModule } from '../../i18n/i18n.module'; -import { DomainModule } from '../domain/domain.module'; -import { MetadataProviderPageComponent } from './provider.component'; -import { FilterModule } from '../filter/filter.module'; -import { MetadataConfigurationModule } from '../configuration/configuration.module'; - -@NgModule({ - declarations: [ - ProviderWizardComponent, - ProviderWizardStepComponent, - ProviderEditComponent, - ProviderEditStepComponent, - ProviderSelectComponent, - ProviderFilterListComponent, - DeleteFilterComponent, - MetadataProviderPageComponent - ], - entryComponents: [ - DeleteFilterComponent - ], - imports: [ - ReactiveFormsModule, - CommonModule, - WizardModule, - RouterModule, - SharedModule, - FormModule, - RouterModule, - ContentionModule, - NgbDropdownModule, - NgbModalModule, - I18nModule, - DomainModule, - FilterModule, - MetadataConfigurationModule - ], - exports: [] -}) -export class ProviderModule { - static forRoot(): ModuleWithProviders { - return { - ngModule: RootProviderModule - }; - } -} - -@NgModule({ - imports: [ - ProviderModule, - StoreModule.forFeature('provider', fromProvider.reducers), - EffectsModule.forFeature([EditorEffects, CollectionEffects]) - ] -}) -export class RootProviderModule { } diff --git a/ui/src/app/metadata/provider/provider.routing.ts b/ui/src/app/metadata/provider/provider.routing.ts deleted file mode 100644 index 635edc45f..000000000 --- a/ui/src/app/metadata/provider/provider.routing.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { Routes } from '@angular/router'; - -import { ProviderWizardComponent } from './container/provider-wizard.component'; -import { ProviderWizardStepComponent } from './container/provider-wizard-step.component'; -import { ProviderEditComponent } from './container/provider-edit.component'; -import { ProviderEditStepComponent } from './container/provider-edit-step.component'; -import { ProviderSelectComponent } from './container/provider-select.component'; -import { ProviderFilterListComponent } from './container/provider-filter-list.component'; -import { NewFilterComponent } from '../filter/container/new-filter.component'; -import { SelectFilterComponent } from '../filter/container/select-filter.component'; -import { EditFilterComponent } from '../filter/container/edit-filter.component'; -import { EditFilterStepComponent } from '../filter/container/edit-filter-step.component'; -import { CanDeactivateGuard } from '../../core/service/can-deactivate.guard'; -import { FilterComponent } from '../filter/container/filter.component'; -import { AdminGuard } from '../../core/service/admin.guard'; -import { MetadataProviderPageComponent } from './provider.component'; -import { NewFilterStepComponent } from '../filter/container/new-filter-step.component'; - -export const ProviderRoutes: Routes = [ - { - path: 'provider', - component: MetadataProviderPageComponent, - canActivate: [AdminGuard], - children: [ - { - path: 'wizard', - redirectTo: `wizard/new` - }, - { - path: 'wizard', - component: ProviderWizardComponent, - canActivate: [], - children: [ - { - path: 'new', - component: ProviderWizardStepComponent, - data: { title: `Create Provider`, subtitle: true }, - } - ] - }, - { - path: ':providerId', - component: ProviderSelectComponent, - children: [ - { - path: 'edit', - component: ProviderEditComponent, - children: [ - { path: '', redirectTo: 'common', pathMatch: 'prefix' }, - { - path: ':form', - component: ProviderEditStepComponent, - data: { title: `Edit Metadata Provider`, subtitle: true } - } - ], - canDeactivate: [ - CanDeactivateGuard - ] - }, - { - path: 'filters', - component: ProviderFilterListComponent, - data: { title: `Metadata Filter List` } - } - ] - }, - { - path: ':providerId/filter', - component: FilterComponent, - children: [ - { - path: 'new', - component: NewFilterComponent, - data: { title: `Create New Filter` }, - children: [ - { path: '', redirectTo: 'common', pathMatch: 'prefix' }, - { - path: ':form', - component: NewFilterStepComponent, - data: { title: `Create Filter`, subtitle: true } - } - ] - }, - { - path: ':filterId', - component: SelectFilterComponent, - canActivate: [], - children: [ - { - path: 'edit', - component: EditFilterComponent, - data: { title: `Edit Metadata Filter` }, - children: [ - { path: '', redirectTo: 'common', pathMatch: 'prefix' }, - { - path: ':form', - component: EditFilterStepComponent, - data: { title: `Edit Metadata Filter`, subtitle: true } - } - ] - } - ] - } - ] - } - ] - } -]; diff --git a/ui/src/app/metadata/provider/reducer/collection.reducer.spec.ts b/ui/src/app/metadata/provider/reducer/collection.reducer.spec.ts deleted file mode 100644 index 75dbac2c2..000000000 --- a/ui/src/app/metadata/provider/reducer/collection.reducer.spec.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { reducer, initialState as snapshot } from './collection.reducer'; -import * as fromProvider from './collection.reducer'; -import { - ProviderCollectionActionTypes, - LoadProviderSuccess, - UpdateProviderSuccess -} from '../action/collection.action'; - -describe('Provider Collection Reducer', () => { - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(snapshot, {} as any); - - expect(result).toEqual(snapshot); - }); - }); - - describe(`${ProviderCollectionActionTypes.LOAD_PROVIDER_SUCCESS}`, () => { - it('should add the loaded providers to the collection', () => { - spyOn(fromProvider.adapter, 'addAll').and.callThrough(); - const providers = [ - { - resourceId: 'foo', - name: 'name', - '@type': 'foo', - enabled: true, - createdBy: 'admin', - createdDate: new Date().toLocaleDateString(), - sortKey: 1, - xmlId: 'foo', - metadataFilters: [] - }, - { - resourceId: 'bar', - name: 'bar', - '@type': 'bar', - enabled: false, - createdBy: 'admin', - createdDate: new Date().toLocaleDateString(), - sortKey: 2, - xmlId: 'bar', - metadataFilters: [] - } - ]; - const action = new LoadProviderSuccess(providers); - const result = reducer(snapshot, action); - expect(fromProvider.adapter.addAll).toHaveBeenCalled(); - }); - }); - - describe(`${ProviderCollectionActionTypes.UPDATE_PROVIDER_SUCCESS}`, () => { - it('should add the loaded providers to the collection', () => { - spyOn(fromProvider.adapter, 'updateOne').and.callThrough(); - const update = { - id: 'foo', - changes: { resourceId: 'foo', name: 'bar', createdDate: new Date().toLocaleDateString() }, - }; - const action = new UpdateProviderSuccess(update); - const result = reducer(snapshot, action); - expect(fromProvider.adapter.updateOne).toHaveBeenCalled(); - }); - }); -}); diff --git a/ui/src/app/metadata/provider/reducer/collection.reducer.ts b/ui/src/app/metadata/provider/reducer/collection.reducer.ts deleted file mode 100644 index cecd944b0..000000000 --- a/ui/src/app/metadata/provider/reducer/collection.reducer.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { EntityState, EntityAdapter, createEntityAdapter } from '@ngrx/entity'; -import { ProviderCollectionActionTypes, ProviderCollectionActionsUnion } from '../action/collection.action'; -import { MetadataProvider } from '../../domain/model'; - -export interface CollectionState extends EntityState { - selectedProviderId: string | null; - loaded: boolean; - order: string[]; -} - -export const adapter: EntityAdapter = createEntityAdapter({ - selectId: (model: MetadataProvider) => model.resourceId -}); - -export const initialState: CollectionState = adapter.getInitialState({ - selectedProviderId: null, - loaded: false, - order: [] -}); - -export function reducer(state = initialState, action: ProviderCollectionActionsUnion): CollectionState { - switch (action.type) { - case ProviderCollectionActionTypes.SELECT_PROVIDER_SUCCESS: { - return adapter.upsertOne(action.payload, { - ...state, - selectedProviderId: action.payload.resourceId - }); - } - case ProviderCollectionActionTypes.LOAD_PROVIDER_SUCCESS: { - return adapter.addAll(action.payload, { - ...state, - selectedProviderId: state.selectedProviderId, - loaded: true - }); - } - - case ProviderCollectionActionTypes.UPDATE_PROVIDER_SUCCESS: { - return adapter.updateOne(action.payload, state); - } - - case ProviderCollectionActionTypes.GET_ORDER_PROVIDER_SUCCESS: { - return { - ...state, - order: action.payload - }; - } - - case ProviderCollectionActionTypes.CLEAR_SELECTION: { - return { - ...state, - selectedProviderId: null - }; - } - - default: { - return state; - } - } -} - -export const getSelectedProviderId = (state: CollectionState) => state.selectedProviderId; -export const getIsLoaded = (state: CollectionState) => state.loaded; -export const { - selectIds: selectProviderIds, - selectEntities: selectProviderEntities, - selectAll: selectAllProviders, - selectTotal: selectProviderTotal -} = adapter.getSelectors(); - -export const getProviderOrder = (state: CollectionState) => state.order; diff --git a/ui/src/app/metadata/provider/reducer/editor.reducer.spec.ts b/ui/src/app/metadata/provider/reducer/editor.reducer.spec.ts deleted file mode 100644 index 37c32302a..000000000 --- a/ui/src/app/metadata/provider/reducer/editor.reducer.spec.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { reducer, initialState as snapshot } from './editor.reducer'; -import { - EditorActionTypes, - ClearEditor, - SelectProviderType -} from '../action/editor.action'; - -describe('Provider Editor Reducer', () => { - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(snapshot, {} as any); - - expect(result).toEqual(snapshot); - }); - }); - - describe(`${EditorActionTypes.CLEAR}`, () => { - it('should reset to initial state', () => { - expect(reducer(snapshot, new ClearEditor())).toEqual(snapshot); - }); - }); - - describe(`${EditorActionTypes.SELECT_PROVIDER_TYPE}`, () => { - it('should reset to initial state', () => { - expect(reducer(snapshot, new SelectProviderType('foo'))).toEqual({ ...snapshot, type: 'foo' }); - }); - }); -}); diff --git a/ui/src/app/metadata/provider/reducer/editor.reducer.ts b/ui/src/app/metadata/provider/reducer/editor.reducer.ts deleted file mode 100644 index 0d56550b7..000000000 --- a/ui/src/app/metadata/provider/reducer/editor.reducer.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { EditorActionTypes, EditorActionUnion } from '../action/editor.action'; - -export interface EditorState { - status: { [key: string]: string }; - type: string; -} - -export const initialState: EditorState = { - status: {}, - type: null -}; - -export function reducer(state = initialState, action: EditorActionUnion): EditorState { - switch (action.type) { - case EditorActionTypes.SELECT_PROVIDER_TYPE: { - return { - ...state, - type: action.payload - }; - } - case EditorActionTypes.CLEAR: { - return { - ...initialState - }; - } - case EditorActionTypes.UPDATE_STATUS: { - return { - ...state, - status: { - ...state.status, - ...action.payload - } - }; - } - default: { - return state; - } - } -} - - - -export const isEditorValid = (state: EditorState) => - !Object.keys(state.status).some(key => state.status[key] === ('INVALID')); -export const getFormStatus = (state: EditorState) => state.status; -export const getInvalidForms = (state: EditorState) => - Object.keys(state.status).filter(key => state.status[key] === 'INVALID'); diff --git a/ui/src/app/metadata/provider/reducer/entity.reducer.spec.ts b/ui/src/app/metadata/provider/reducer/entity.reducer.spec.ts deleted file mode 100644 index 2f1bcff62..000000000 --- a/ui/src/app/metadata/provider/reducer/entity.reducer.spec.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { reducer, initialState as snapshot, isEntitySaved } from './entity.reducer'; -import { EntityActionTypes, ClearProvider } from '../action/entity.action'; -import { MetadataProvider } from '../../domain/model'; -import { - ProviderCollectionActionTypes, - UpdateProviderRequest, - AddProviderRequest, - UpdateProviderSuccess, - UpdateProviderFail, - AddProviderFail, - AddProviderSuccess -} from '../action/collection.action'; - -describe('Provider Editor Reducer', () => { - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(snapshot, {} as any); - - expect(result).toEqual(snapshot); - }); - }); - - describe(`${EntityActionTypes.CLEAR_PROVIDER}`, () => { - it('should reset to initial state', () => { - expect(reducer(snapshot, new ClearProvider())).toEqual(snapshot); - }); - }); - - describe(`${ProviderCollectionActionTypes.UPDATE_PROVIDER_REQUEST}`, () => { - it('should set to `saving`', () => { - expect(reducer(snapshot, new UpdateProviderRequest({})).saving).toBe(true); - }); - }); - - describe(`${ProviderCollectionActionTypes.ADD_PROVIDER_REQUEST}`, () => { - it('should set to `saving`', () => { - expect(reducer(snapshot, new AddProviderRequest({})).saving).toBe(true); - }); - }); - - describe(`${ProviderCollectionActionTypes.UPDATE_PROVIDER_SUCCESS}`, () => { - it('should set to not `saving`', () => { - expect(reducer(snapshot, new UpdateProviderSuccess({id: 'foo', changes: {} })).saving).toBe(false); - }); - }); - - describe(`${ProviderCollectionActionTypes.ADD_PROVIDER_FAIL}`, () => { - it('should set to not `saving`', () => { - expect(reducer(snapshot, new AddProviderFail({})).saving).toBe(false); - }); - }); - - describe(`${ProviderCollectionActionTypes.ADD_PROVIDER_SUCCESS}`, () => { - it('should set to not `saving`', () => { - expect(reducer(snapshot, new AddProviderSuccess({})).saving).toBe(false); - }); - }); - - describe(`${ProviderCollectionActionTypes.UPDATE_PROVIDER_FAIL}`, () => { - it('should set to not `saving`', () => { - expect(reducer(snapshot, new UpdateProviderFail({})).saving).toBe(false); - }); - }); - - describe(`isEntitySaved method`, () => { - it('should return false if there are changes', () => { - expect(isEntitySaved({ - ...snapshot, - changes: { - name: 'bar' - } - })).toBe(false); - }); - - it('should return true if there are no changes', () => { - expect(isEntitySaved({ - ...snapshot, - changes: {} - })).toBe(true); - }); - }); -}); diff --git a/ui/src/app/metadata/provider/reducer/entity.reducer.ts b/ui/src/app/metadata/provider/reducer/entity.reducer.ts deleted file mode 100644 index b47600d94..000000000 --- a/ui/src/app/metadata/provider/reducer/entity.reducer.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { MetadataProvider } from '../../domain/model'; -import { EntityActionTypes, EntityActionUnion } from '../action/entity.action'; -import { ProviderCollectionActionsUnion, ProviderCollectionActionTypes } from '../action/collection.action'; - -export interface EntityState { - saving: boolean; - changes: MetadataProvider; -} - -export const initialState: EntityState = { - saving: false, - changes: null -}; - -export function reducer(state = initialState, action: EntityActionUnion | ProviderCollectionActionsUnion): EntityState { - switch (action.type) { - case ProviderCollectionActionTypes.ADD_PROVIDER_REQUEST: - case ProviderCollectionActionTypes.UPDATE_PROVIDER_REQUEST: { - return { - ...state, - saving: true - }; - } - - case ProviderCollectionActionTypes.UPDATE_PROVIDER_FAIL: - case ProviderCollectionActionTypes.UPDATE_PROVIDER_SUCCESS: - case ProviderCollectionActionTypes.ADD_PROVIDER_FAIL: - case ProviderCollectionActionTypes.ADD_PROVIDER_SUCCESS: { - return { - ...state, - saving: false - }; - } - case EntityActionTypes.CLEAR_PROVIDER: { - return { - ...initialState - }; - } - case EntityActionTypes.RESET_CHANGES: { - return { - ...state, - changes: { - ...initialState.changes - }, - saving: false - }; - } - case EntityActionTypes.UPDATE_PROVIDER: { - return { - ...state, - changes: { - ...state.changes, - ...action.payload - } - }; - } - default: { - return state; - } - } -} - -export const isEntitySaved = (state: EntityState) => state.changes ? !Object.keys(state.changes).length && !state.saving : true; -export const getEntityChanges = (state: EntityState) => state.changes; -export const isEditorSaving = (state: EntityState) => state.saving; -export const getUpdatedEntity = (state: EntityState) => state.changes; diff --git a/ui/src/app/metadata/provider/reducer/index.spec.ts b/ui/src/app/metadata/provider/reducer/index.spec.ts deleted file mode 100644 index 7ffb3e9db..000000000 --- a/ui/src/app/metadata/provider/reducer/index.spec.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { getFilteredListFn } from './'; - -describe('Provider Reducer selectors', () => { - describe(`getFilteredListFn method`, () => { - it('should return a list without the provider`s property', () => { - - const fn = getFilteredListFn('name'); - const name = 'foo'; - const collection = ['foo', 'bar', 'baz']; - const provider = { name }; - - expect(fn(collection, provider)).toEqual(['bar', 'baz']); - }); - - it('should return the list if the provider passed is null', () => { - - const fn = getFilteredListFn('name'); - const name = 'foo'; - const collection = ['foo', 'bar', 'baz']; - - expect(fn(collection, null)).toEqual(['foo', 'bar', 'baz']); - }); - }); -}); diff --git a/ui/src/app/metadata/provider/reducer/index.ts b/ui/src/app/metadata/provider/reducer/index.ts deleted file mode 100644 index ce8a2813e..000000000 --- a/ui/src/app/metadata/provider/reducer/index.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { createSelector, createFeatureSelector } from '@ngrx/store'; -import * as fromRoot from '../../../app.reducer'; -import * as fromEditor from './editor.reducer'; -import * as fromEntity from './entity.reducer'; -import * as fromCollection from './collection.reducer'; -import * as utils from '../../domain/domain.util'; - -import * as fromWizard from '../../../wizard/reducer'; - -import { MetadataProvider } from '../../domain/model'; -import { getConfigurationSectionsFn } from '../../configuration/reducer/utilities'; - -export interface ProviderState { - editor: fromEditor.EditorState; - entity: fromEntity.EntityState; - collection: fromCollection.CollectionState; -} - -export const reducers = { - editor: fromEditor.reducer, - entity: fromEntity.reducer, - collection: fromCollection.reducer -}; - -export interface State extends fromRoot.State { - provider: ProviderState; -} - -export const getProviderState = createFeatureSelector('provider'); - -export const getEditorStateFn = (state: ProviderState) => state.editor; -export const getEntityStateFn = (state: ProviderState) => state.entity; -export const getCollectionStateFn = (state: ProviderState) => state.collection; - -export const getEditorState = createSelector(getProviderState, getEditorStateFn); -export const getEntityState = createSelector(getProviderState, getEntityStateFn); -export const getCollectionState = createSelector(getProviderState, getCollectionStateFn); - -/* -Editor State -*/ - -export const getEditorIsValid = createSelector(getEditorState, fromEditor.isEditorValid); - -export const getFormStatus = createSelector(getEditorState, fromEditor.getFormStatus); -export const getInvalidEditorForms = createSelector(getEditorState, fromEditor.getInvalidForms); - - -/* -Entity State -*/ - -export const getEntityIsSaved = createSelector(getEntityState, fromEntity.isEntitySaved); -export const getEntityChanges = createSelector(getEntityState, fromEntity.getEntityChanges); -export const getEntityIsSaving = createSelector(getEntityState, fromEntity.isEditorSaving); -export const getUpdatedEntity = createSelector(getEntityState, fromEntity.getUpdatedEntity); - -/* - * Select pieces of Provider Collection -*/ -export const getProviderOrder = createSelector(getCollectionState, fromCollection.getProviderOrder); -export const getAllProviders = createSelector(getCollectionState, fromCollection.selectAllProviders); -export const getProviderEntities = createSelector(getCollectionState, fromCollection.selectProviderEntities); -export const getSelectedProviderId = createSelector(getCollectionState, fromCollection.getSelectedProviderId); -export const getSelectedProvider = createSelector(getProviderEntities, getSelectedProviderId, utils.getInCollectionFn); -export const getProviderIds = createSelector(getCollectionState, fromCollection.selectProviderIds); -export const getProviderCollectionIsLoaded = createSelector(getCollectionState, fromCollection.getIsLoaded); - -export const getProviderNames = createSelector(getAllProviders, (providers: MetadataProvider[]) => providers.map(p => p.name)); - -export const getFilteredListFn = (property: string) => - (collection, provider) => !provider ? collection : collection.filter(val => val !== provider[property]); - -export const getFilteredProviderNames = createSelector(getProviderNames, getSelectedProvider, getFilteredListFn('name')); - -export const getProviderFilters = createSelector(getSelectedProvider, provider => provider.metadataFilters); - -export const getProviderXmlIds = createSelector(getAllProviders, (providers: MetadataProvider[]) => providers.map(p => p.xmlId)); -export const getOrderedProviders = createSelector(getAllProviders, getProviderOrder, utils.mergeOrderFn); -export const getOrderedProvidersInSearch = createSelector(getAllProviders, getProviderOrder, utils.mergeOrderFn); - -export const getFilteredProviderXmlIds = createSelector(getProviderXmlIds, getSelectedProvider, getFilteredListFn('xmlId')); - -export const getProviderModelList = createSelector(getEntityChanges, (model) => [model]); - -export const getProviderConfiguration = createSelector( - getProviderModelList, - fromWizard.getWizardDefinition, - fromWizard.getProcessedSchema, - getConfigurationSectionsFn -); diff --git a/ui/src/app/metadata/resolver/action/collection.action.ts b/ui/src/app/metadata/resolver/action/collection.action.ts deleted file mode 100644 index 5ad95b7cd..000000000 --- a/ui/src/app/metadata/resolver/action/collection.action.ts +++ /dev/null @@ -1,172 +0,0 @@ -import { Action } from '@ngrx/store'; -import { MetadataResolver } from '../../domain/model'; -import { Update } from '@ngrx/entity'; - -export enum ResolverCollectionActionTypes { - FIND = '[Metadata Resolver] Find', - SELECT = '[Metadata Resolver] Select', - SELECT_SUCCESS = '[Metadata Resolver] Select Success', - - CLEAR_SELECTION = '[Metadata Resolver] Selection Clear', - - UPDATE_RESOLVER_REQUEST = '[Metadata Resolver] Update Request', - UPDATE_RESOLVER_SUCCESS = '[Metadata Resolver] Update Success', - UPDATE_RESOLVER_FAIL = '[Metadata Resolver] Update Fail', - UPDATE_RESOLVER_CONFLICT = '[Metadata Resolver] Update Conflict', - - LOAD_RESOLVER_REQUEST = '[Metadata Resolver Collection] Load Resolver REQUEST', - LOAD_RESOLVER_SUCCESS = '[Metadata Resolver Collection] Load Resolver SUCCESS', - LOAD_RESOLVER_ERROR = '[Metadata Resolver Collection] Load Resolver ERROR', - LOAD_ADMIN_RESOLVERS_REQUEST = '[Metadata Resolver Collection] Load Admin Resolver REQUEST', - - ADD_RESOLVER = '[Metadata Resolver Collection] Add Resolver', - ADD_RESOLVER_SUCCESS = '[Metadata Resolver Collection] Add Resolver Success', - ADD_RESOLVER_FAIL = '[Metadata Resolver Collection] Add Resolver Fail', - - REMOVE_RESOLVER = '[Metadata Resolver Collection] Remove Resolver', - REMOVE_RESOLVER_SUCCESS = '[Metadata Resolver Collection] Remove Resolver Success', - REMOVE_RESOLVER_FAIL = '[Metadata Resolver Collection] Remove Resolver Fail', - - UPLOAD_RESOLVER_REQUEST = '[Metadata Resolver Collection] Upload Resolver Request', - CREATE_RESOLVER_FROM_URL_REQUEST = '[Metadata Resolver Collection] Create Resolver From URL Request', -} - -export class FindResolver implements Action { - readonly type = ResolverCollectionActionTypes.FIND; - - constructor(public payload: string) { } -} - -export class SelectResolver implements Action { - readonly type = ResolverCollectionActionTypes.SELECT; - - constructor(public payload: string) { } -} - -export class SelectResolverSuccess implements Action { - readonly type = ResolverCollectionActionTypes.SELECT_SUCCESS; - - constructor(public payload: MetadataResolver) { } -} - -export class LoadResolverRequest implements Action { - readonly type = ResolverCollectionActionTypes.LOAD_RESOLVER_REQUEST; - - constructor() { } -} - -export class LoadAdminResolverRequest implements Action { - readonly type = ResolverCollectionActionTypes.LOAD_ADMIN_RESOLVERS_REQUEST; - - constructor() { } -} - -export class LoadResolverSuccess implements Action { - readonly type = ResolverCollectionActionTypes.LOAD_RESOLVER_SUCCESS; - - constructor(public payload: MetadataResolver[]) { } -} - -export class LoadResolverError implements Action { - readonly type = ResolverCollectionActionTypes.LOAD_RESOLVER_ERROR; - - constructor(public payload: any) { } -} - -export class UpdateResolverRequest implements Action { - readonly type = ResolverCollectionActionTypes.UPDATE_RESOLVER_REQUEST; - - constructor(public payload: MetadataResolver) { } -} - -export class UpdateResolverSuccess implements Action { - readonly type = ResolverCollectionActionTypes.UPDATE_RESOLVER_SUCCESS; - - constructor(public payload: Update) { } -} - -export class UpdateResolverFail implements Action { - readonly type = ResolverCollectionActionTypes.UPDATE_RESOLVER_FAIL; - - constructor(public payload: any) { } -} - -export class UpdateResolverConflict implements Action { - readonly type = ResolverCollectionActionTypes.UPDATE_RESOLVER_CONFLICT; - - constructor(public payload: MetadataResolver) { } -} - -export class AddResolverRequest implements Action { - readonly type = ResolverCollectionActionTypes.ADD_RESOLVER; - - constructor(public payload: MetadataResolver) { } -} - -export class AddResolverSuccess implements Action { - readonly type = ResolverCollectionActionTypes.ADD_RESOLVER_SUCCESS; - - constructor(public payload: MetadataResolver) { } -} - -export class AddResolverFail implements Action { - readonly type = ResolverCollectionActionTypes.ADD_RESOLVER_FAIL; - - constructor(public payload: any) { } -} - -export class RemoveResolverRequest implements Action { - readonly type = ResolverCollectionActionTypes.REMOVE_RESOLVER; - - constructor(public payload: string) { } -} - -export class RemoveResolverSuccess implements Action { - readonly type = ResolverCollectionActionTypes.REMOVE_RESOLVER_SUCCESS; - - constructor(public payload: string) { } -} - -export class RemoveResolverFail implements Action { - readonly type = ResolverCollectionActionTypes.REMOVE_RESOLVER_FAIL; - - constructor(public payload: MetadataResolver) { } -} - -export class UploadResolverRequest implements Action { - readonly type = ResolverCollectionActionTypes.UPLOAD_RESOLVER_REQUEST; - - constructor(public payload: { name: string, body: string }) { } -} - -export class CreateResolverFromUrlRequest implements Action { - readonly type = ResolverCollectionActionTypes.CREATE_RESOLVER_FROM_URL_REQUEST; - - constructor(public payload: { name: string, url: string }) { } -} - -export class ClearResolverSelection implements Action { - readonly type = ResolverCollectionActionTypes.CLEAR_SELECTION; -} - -export type ResolverCollectionActionsUnion = - | LoadResolverRequest - | LoadResolverSuccess - | LoadResolverError - | LoadAdminResolverRequest - | AddResolverRequest - | AddResolverSuccess - | AddResolverFail - | RemoveResolverRequest - | RemoveResolverSuccess - | RemoveResolverFail - | FindResolver - | SelectResolver - | SelectResolverSuccess - | UpdateResolverRequest - | UpdateResolverSuccess - | UpdateResolverFail - | UpdateResolverConflict - | UploadResolverRequest - | CreateResolverFromUrlRequest - | ClearResolverSelection; diff --git a/ui/src/app/metadata/resolver/action/copy.action.ts b/ui/src/app/metadata/resolver/action/copy.action.ts deleted file mode 100644 index 8d70af76c..000000000 --- a/ui/src/app/metadata/resolver/action/copy.action.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { Action } from '@ngrx/store'; -import { MetadataResolver } from '../../domain/model'; - -export enum CopySourceActionTypes { - CREATE_RESOLVER_COPY_REQUEST = '[Copy Resolver] Create Resolver Copy Request', - CREATE_RESOLVER_COPY_SUCCESS = '[Copy Resolver] Create Resolver Copy Success', - CREATE_RESOLVER_COPY_ERROR = '[Copy Resolver] Create Resolver Copy Error', - - UPDATE_RESOLVER_COPY = '[Copy Resolver] Update Resolver Copy Request', - - UPDATE_RESOLVER_COPY_SECTIONS = '[Copy Resolver] Update Resolver Sections', - - SAVE_RESOLVER_COPY_REQUEST = '[Copy Resolver] Save Resolver Copy Request', - SAVE_RESOLVER_COPY_SUCCESS = '[Copy Resolver] Save Resolver Copy Request', - SAVE_RESOLVER_COPY_ERROR = '[Copy Resolver] Save Resolver Copy Request', -} - -export class CreateResolverCopyRequest implements Action { - readonly type = CopySourceActionTypes.CREATE_RESOLVER_COPY_REQUEST; - - constructor(public payload: { entityId: string, serviceProviderName: string, target: string }) { } -} - -export class CreateResolverCopySuccess implements Action { - readonly type = CopySourceActionTypes.CREATE_RESOLVER_COPY_SUCCESS; - - constructor(public payload: MetadataResolver) { } -} - -export class CreateResolverCopyError implements Action { - readonly type = CopySourceActionTypes.CREATE_RESOLVER_COPY_ERROR; - - constructor(public payload: Error) { } -} - -export class UpdateResolverCopy implements Action { - readonly type = CopySourceActionTypes.UPDATE_RESOLVER_COPY; - - constructor(public payload: Partial) { } -} - -export class UpdateResolverCopySections implements Action { - readonly type = CopySourceActionTypes.UPDATE_RESOLVER_COPY_SECTIONS; - - constructor(public payload: string[]) { } -} - -export type CopySourceActionUnion = - | CreateResolverCopyRequest - | CreateResolverCopySuccess - | CreateResolverCopyError - | UpdateResolverCopy - | UpdateResolverCopySections; diff --git a/ui/src/app/metadata/resolver/action/draft.action.ts b/ui/src/app/metadata/resolver/action/draft.action.ts deleted file mode 100644 index c64c370df..000000000 --- a/ui/src/app/metadata/resolver/action/draft.action.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { Action } from '@ngrx/store'; -import { Update } from '@ngrx/entity'; -import { MetadataResolver } from '../../domain/model'; - -export enum DraftActionTypes { - FIND = '[Metadata Draft] Find', - SELECT_REQUEST = '[Metadata Draft] Select Request', - SELECT_SUCCESS = '[Metadata Draft] Select Success', - SELECT_ERROR = '[Metadata Draft] Select Error', - UPDATE_DRAFT_REQUEST = '[Metadata Draft] Update Request', - UPDATE_DRAFT_SUCCESS = '[Metadata Draft] Update Success', - UPDATE_DRAFT_FAIL = '[Metadata Draft] Update Fail', - LOAD_DRAFT_REQUEST = '[Metadata Draft Collection] Draft REQUEST', - LOAD_DRAFT_SUCCESS = '[Metadata Draft Collection] Draft SUCCESS', - LOAD_DRAFT_ERROR = '[Metadata Draft Collection] Draft ERROR', - ADD_DRAFT = '[Metadata Draft Collection] Add Draft', - ADD_DRAFT_SUCCESS = '[Metadata Draft Collection] Add Draft Success', - ADD_DRAFT_FAIL = '[Metadata Draft Collection] Add Draft Fail', - REMOVE_DRAFT = '[Metadata Draft Collection] Remove Draft', - REMOVE_DRAFT_SUCCESS = '[Metadata Draft Collection] Remove Draft Success', - REMOVE_DRAFT_FAIL = '[Metadata Draft Collection] Remove Draft Fail' -} - -export class SelectDraftRequest implements Action { - readonly type = DraftActionTypes.SELECT_REQUEST; - - constructor(public payload: string) { } -} - -export class SelectDraftSuccess implements Action { - readonly type = DraftActionTypes.SELECT_SUCCESS; - - constructor(public payload: string) { } -} - -export class SelectDraftError implements Action { - readonly type = DraftActionTypes.SELECT_ERROR; - - constructor() { } -} - -export class UpdateDraftRequest implements Action { - readonly type = DraftActionTypes.UPDATE_DRAFT_REQUEST; - - constructor(public payload: MetadataResolver) { } -} - -export class UpdateDraftSuccess implements Action { - readonly type = DraftActionTypes.UPDATE_DRAFT_SUCCESS; - - constructor(public payload: Update) { } -} - -export class UpdateDraftFail implements Action { - readonly type = DraftActionTypes.UPDATE_DRAFT_FAIL; - - constructor(public payload: MetadataResolver) { } -} - -export class AddDraftRequest implements Action { - readonly type = DraftActionTypes.ADD_DRAFT; - - constructor(public payload: MetadataResolver) { } -} - -export class AddDraftSuccess implements Action { - readonly type = DraftActionTypes.ADD_DRAFT_SUCCESS; - - constructor(public payload: MetadataResolver) { } -} - -export class AddDraftFail implements Action { - readonly type = DraftActionTypes.ADD_DRAFT_FAIL; - - constructor(public payload: any) { } -} - -export class RemoveDraftRequest implements Action { - readonly type = DraftActionTypes.REMOVE_DRAFT; - - constructor(public payload: MetadataResolver) { } -} - -export class RemoveDraftSuccess implements Action { - readonly type = DraftActionTypes.REMOVE_DRAFT_SUCCESS; - - constructor(public payload: string) { } -} - -export class RemoveDraftFail implements Action { - readonly type = DraftActionTypes.REMOVE_DRAFT_FAIL; - - constructor(public payload: MetadataResolver) { } -} - -export class LoadDraftRequest implements Action { - readonly type = DraftActionTypes.LOAD_DRAFT_REQUEST; - - constructor() { } -} - -export class LoadDraftSuccess implements Action { - readonly type = DraftActionTypes.LOAD_DRAFT_SUCCESS; - - constructor(public payload: MetadataResolver[]) { } -} - -export class LoadDraftError implements Action { - readonly type = DraftActionTypes.LOAD_DRAFT_ERROR; - - constructor(public payload: any) { } -} - -export type DraftActionsUnion = - | LoadDraftRequest - | LoadDraftSuccess - | LoadDraftError - | AddDraftRequest - | AddDraftSuccess - | AddDraftFail - | RemoveDraftRequest - | RemoveDraftSuccess - | RemoveDraftFail - | SelectDraftRequest - | SelectDraftSuccess - | SelectDraftError - | UpdateDraftRequest - | UpdateDraftSuccess - | UpdateDraftFail; diff --git a/ui/src/app/metadata/resolver/action/entity.action.ts b/ui/src/app/metadata/resolver/action/entity.action.ts deleted file mode 100644 index b489ee831..000000000 --- a/ui/src/app/metadata/resolver/action/entity.action.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { Action } from '@ngrx/store'; -import { MetadataResolver } from '../../domain/model'; - -export enum ResolverEntityActionTypes { - UPDATE_STATUS = '[Resolver Entity] Update Status', - UPDATE_SAVING = '[Resolver Entity] Update Saving', - UPDATE_CHANGES_REQUEST = '[Resolver Entity] Update Changes Request', - UPDATE_CHANGES_SUCCESS = '[Resolver Entity] Update Changes Success', - CLEAR = '[Resolver Entity] Clear', - CANCEL = '[Resolver Entity] Cancel' -} - -export class UpdateStatus implements Action { - readonly type = ResolverEntityActionTypes.UPDATE_STATUS; - - constructor(public payload: { [key: string]: string }) { } -} - -export class UpdateChangesRequest implements Action { - readonly type = ResolverEntityActionTypes.UPDATE_CHANGES_REQUEST; - - constructor(public payload: MetadataResolver) { } -} - -export class UpdateChangesSuccess implements Action { - readonly type = ResolverEntityActionTypes.UPDATE_CHANGES_SUCCESS; - - constructor(public payload: MetadataResolver) { } -} - -export class UpdateSaving implements Action { - readonly type = ResolverEntityActionTypes.UPDATE_SAVING; - - constructor(public payload: boolean) { } -} - -export class Clear implements Action { - readonly type = ResolverEntityActionTypes.CLEAR; - - constructor() { } -} - -export class Cancel implements Action { - readonly type = ResolverEntityActionTypes.CANCEL; - - constructor() { } -} - -export type ResolverEntityActionUnion = - | UpdateStatus - | UpdateChangesRequest - | UpdateChangesSuccess - | UpdateSaving - | Clear; diff --git a/ui/src/app/metadata/resolver/action/search.action.ts b/ui/src/app/metadata/resolver/action/search.action.ts deleted file mode 100644 index 7bfdd7d5b..000000000 --- a/ui/src/app/metadata/resolver/action/search.action.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Action } from '@ngrx/store'; - -export enum SearchActionTypes { - SEARCH_IDS = '[Search Resolver Ids] Request', - SEARCH_IDS_SUCCESS = '[Search Resolver Ids] Success', - SEARCH_IDS_ERROR = '[Search Resolver Ids] Error' -} - -export class SearchIds implements Action { - readonly type = SearchActionTypes.SEARCH_IDS; - - constructor(public payload: string) { } -} -export class SearchIdsSuccess implements Action { - readonly type = SearchActionTypes.SEARCH_IDS_SUCCESS; - - constructor(public payload: string[]) { } -} -export class SearchIdsError implements Action { - readonly type = SearchActionTypes.SEARCH_IDS_ERROR; - - constructor(public payload: any) { } -} - -export type SearchActionUnion = - | SearchIds - | SearchIdsSuccess - | SearchIdsError; diff --git a/ui/src/app/metadata/resolver/component/finish-form.component.html b/ui/src/app/metadata/resolver/component/finish-form.component.html deleted file mode 100644 index 9ad91bab5..000000000 --- a/ui/src/app/metadata/resolver/component/finish-form.component.html +++ /dev/null @@ -1,17 +0,0 @@ -
-
-
-
-
-
- - -
- -
-
-
-
-
diff --git a/ui/src/app/metadata/resolver/component/finish-form.component.scss b/ui/src/app/metadata/resolver/component/finish-form.component.scss deleted file mode 100644 index 0f9488141..000000000 --- a/ui/src/app/metadata/resolver/component/finish-form.component.scss +++ /dev/null @@ -1,9 +0,0 @@ -@import '../../../../theme/_palette'; - -.value:empty { - &::after { - content: "\2014"; - color: #868e96; - text-align: center; - } -} \ No newline at end of file diff --git a/ui/src/app/metadata/resolver/component/finish-form.component.spec.ts b/ui/src/app/metadata/resolver/component/finish-form.component.spec.ts deleted file mode 100644 index 0fefc8788..000000000 --- a/ui/src/app/metadata/resolver/component/finish-form.component.spec.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { ActivatedRoute, Router } from '@angular/router'; -import { NgbPopoverModule, NgbPopoverConfig } from '@ng-bootstrap/ng-bootstrap'; - -import { ProviderValueEmitter, ProviderStatusEmitter } from '../../domain/service/provider-change-emitter.service'; -import { ListValuesService } from '../../domain/service/list-values.service'; -import { FinishFormComponent } from './finish-form.component'; -import { RouterStub, RouterLinkStubDirective } from '../../../../testing/router.stub'; -import { ActivatedRouteStub } from '../../../../testing/activated-route.stub'; -import * as stubs from '../../../../testing/resolver.stub'; -import { FileBackedHttpMetadataResolver } from '../../domain/entity'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { MockListValueService } from '../../../../testing/list-values.stub'; -import { MockSharedModule } from '../../../../testing/shared.stub'; - -@Component({ - template: `` -}) -class TestHostComponent { - resolver = new FileBackedHttpMetadataResolver({ - ...stubs.resolver - }); - - @ViewChild(FinishFormComponent, {static: true}) - public formUnderTest: FinishFormComponent; - - changeProvider(opts: any): void { - this.resolver = Object.assign({}, this.resolver, opts); - } -} - -describe('Finished Form Component', () => { - let fixture: ComponentFixture; - let instance: TestHostComponent; - let form: FinishFormComponent; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - ProviderValueEmitter, - ProviderStatusEmitter, - NgbPopoverConfig, - { provide: ListValuesService, useClass: MockListValueService }, - { provide: Router, useClass: RouterStub }, - { provide: ActivatedRoute, useClass: ActivatedRouteStub } - ], - imports: [ - NoopAnimationsModule, - ReactiveFormsModule, - MockSharedModule, - NgbPopoverModule, - MockI18nModule - ], - declarations: [ - FinishFormComponent, - RouterLinkStubDirective, - TestHostComponent - ], - }); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - form = instance.formUnderTest; - fixture.detectChanges(); - }); - - it('should compile', () => { - expect(fixture).toBeDefined(); - }); - - describe('ngOnChanges lifecycle event', () => { - it('should reset the form', () => { - spyOn(form.form, 'reset').and.callThrough(); - instance.changeProvider({ - serviceEnabled: true - }); - fixture.detectChanges(); - expect(form.form.reset).toHaveBeenCalled(); - }); - - it('should reset the form with serviceEnabled = false if no resolver', () => { - spyOn(form.form, 'reset').and.callThrough(); - delete instance.resolver; - fixture.detectChanges(); - expect(form.form.reset).toHaveBeenCalled(); - }); - }); -}); diff --git a/ui/src/app/metadata/resolver/component/finish-form.component.ts b/ui/src/app/metadata/resolver/component/finish-form.component.ts deleted file mode 100644 index e7e84641a..000000000 --- a/ui/src/app/metadata/resolver/component/finish-form.component.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { Component, Input, OnInit, OnChanges, OnDestroy, ChangeDetectionStrategy } from '@angular/core'; -import { FormBuilder, FormGroup } from '@angular/forms'; -import { Observable } from 'rxjs'; -import { ProviderFormFragmentComponent } from './provider-form-fragment.component'; -import { ProviderStatusEmitter, ProviderValueEmitter } from '../../domain/service/provider-change-emitter.service'; -import { MetadataResolver } from '../../domain/model'; -import { ListValuesService } from '../../domain/service/list-values.service'; - -@Component({ - selector: 'finish-form', - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './finish-form.component.html', - styleUrls: ['./finish-form.component.scss'] -}) -export class FinishFormComponent extends ProviderFormFragmentComponent implements OnInit, OnChanges, OnDestroy { - @Input() resolver: MetadataResolver; - - form: FormGroup; - attributesToRelease$: Observable; - - constructor( - protected fb: FormBuilder, - protected statusEmitter: ProviderStatusEmitter, - protected valueEmitter: ProviderValueEmitter, - private listValues: ListValuesService - ) { - super(fb, statusEmitter, valueEmitter); - this.attributesToRelease$ = this.listValues.attributesToRelease; - } - - createForm(): void { - this.form = this.fb.group({ - serviceEnabled: [true] - }); - } - - ngOnChanges(): void { - this.form.reset({ - serviceEnabled: !this.resolver ? false : this.resolver.serviceEnabled !== false ? true : false - }); - } -} diff --git a/ui/src/app/metadata/resolver/component/provider-form-fragment.component.spec.ts b/ui/src/app/metadata/resolver/component/provider-form-fragment.component.spec.ts deleted file mode 100644 index bf81f8c8a..000000000 --- a/ui/src/app/metadata/resolver/component/provider-form-fragment.component.spec.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { ProviderFormFragmentComponent } from './provider-form-fragment.component'; -import { ProviderValueEmitter, ProviderStatusEmitter } from '../../domain/service/provider-change-emitter.service'; - - -describe('Resolver Form Fragment Component', () => { - let fixture: ComponentFixture; - let instance: ProviderFormFragmentComponent; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - ProviderValueEmitter, - ProviderStatusEmitter - ], - imports: [ - NoopAnimationsModule, - ReactiveFormsModule - ], - declarations: [ - ProviderFormFragmentComponent - ], - }); - - fixture = TestBed.createComponent(ProviderFormFragmentComponent); - instance = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should compile', () => { - expect(fixture).toBeDefined(); - }); -}); diff --git a/ui/src/app/metadata/resolver/component/provider-form-fragment.component.ts b/ui/src/app/metadata/resolver/component/provider-form-fragment.component.ts deleted file mode 100644 index c376a7043..000000000 --- a/ui/src/app/metadata/resolver/component/provider-form-fragment.component.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { Component, Input, OnInit, OnDestroy, ChangeDetectionStrategy, ElementRef, ViewChildren } from '@angular/core'; -import { FormBuilder, FormGroup, FormControlName } from '@angular/forms'; - -import { Observable, Subject, Subscription } from 'rxjs'; -import { takeUntil, startWith } from 'rxjs/operators'; - -import { ProviderStatusEmitter, ProviderValueEmitter } from '../../domain/service/provider-change-emitter.service'; -import { MetadataResolver } from '../../domain/model'; - -import * as constants from '../../../shared/constant'; -import { removeNulls } from '../../../shared/util'; - -@Component({ - selector: 'provider-form-fragment', - changeDetection: ChangeDetectionStrategy.OnPush, - template: `Foo` -}) -export class ProviderFormFragmentComponent implements OnInit, OnDestroy { - @Input() resolver: MetadataResolver; - @ViewChildren(FormControlName, { read: ElementRef }) formInputElements: ElementRef[]; - - protected ngUnsubscribe: Subject = new Subject(); - protected valueEmitSubscription: Subscription; - protected statusEmitSubscription: Subscription; - - form: FormGroup; - provider$: Observable; - - defaultMaxLength = constants.DEFAULT_FIELD_MAX_LENGTH; - - constructor( - protected fb: FormBuilder, - protected statusEmitter: ProviderStatusEmitter, - protected valueEmitter: ProviderValueEmitter - ) { - this.createForm(); - } - - createForm(): void { - this.form = this.fb.group({}); - } - - ngOnInit(): void { - this.valueEmitSubscription = this.form.valueChanges.pipe( - takeUntil(this.ngUnsubscribe), - startWith(this.form.value) - ).subscribe(changes => this.valueEmitter.emit(removeNulls(changes, true))); - - this.statusEmitSubscription = this.form.statusChanges.pipe( - takeUntil(this.ngUnsubscribe), - startWith(this.form.status) - ).subscribe(status => this.statusEmitter.emit(status)); - } - - ngOnDestroy(): void { - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - } -} /* istanbul ignore next */ diff --git a/ui/src/app/metadata/resolver/container/confirm-copy.component.html b/ui/src/app/metadata/resolver/container/confirm-copy.component.html deleted file mode 100644 index 1e2096661..000000000 --- a/ui/src/app/metadata/resolver/container/confirm-copy.component.html +++ /dev/null @@ -1,52 +0,0 @@ -
-
-
-
-
- Add a new metadata source - Finish Summary -
-
-
-
- - - - -
-
-
diff --git a/ui/src/app/metadata/resolver/container/confirm-copy.component.scss b/ui/src/app/metadata/resolver/container/confirm-copy.component.scss deleted file mode 100644 index 9b93e80de..000000000 --- a/ui/src/app/metadata/resolver/container/confirm-copy.component.scss +++ /dev/null @@ -1,5 +0,0 @@ -:host { - .nav.nav-wizard .nav-item .nav-link.btn.save { - min-width: 180px; - } -} \ No newline at end of file diff --git a/ui/src/app/metadata/resolver/container/confirm-copy.component.spec.ts b/ui/src/app/metadata/resolver/container/confirm-copy.component.spec.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/ui/src/app/metadata/resolver/container/confirm-copy.component.ts b/ui/src/app/metadata/resolver/container/confirm-copy.component.ts deleted file mode 100644 index b4c0bef20..000000000 --- a/ui/src/app/metadata/resolver/container/confirm-copy.component.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { Component, Inject, OnDestroy } from '@angular/core'; -import { Store } from '@ngrx/store'; - -import { Observable } from 'rxjs'; - -import { - State, - getResolverConfiguration, - getCopy, - getSaving -} from '../reducer'; -import { MetadataResolver } from '../../domain/model'; -import { ProviderValueEmitter } from '../../domain/service/provider-change-emitter.service'; -import { UpdateResolverCopy } from '../action/copy.action'; -import { take, skipWhile } from 'rxjs/operators'; -import { AddResolverRequest } from '../action/collection.action'; -import { MetadataConfiguration } from '../../configuration/model/metadata-configuration'; -import { SetDefinition, ClearWizard } from '../../../wizard/action/wizard.action'; -import { METADATA_SOURCE_WIZARD } from '../wizard-definition'; -import { Wizard } from '../../../wizard/model'; -import { LoadSchemaRequest } from '../../configuration/action/configuration.action'; -import { getCurrentWizardSchema } from '../../../wizard/reducer'; - -@Component({ - selector: 'confirm-copy-page', - templateUrl: './confirm-copy.component.html', - styleUrls: ['./confirm-copy.component.scss'] -}) -export class ConfirmCopyComponent implements OnDestroy { - - copy$: Observable; - values$: Observable; - saving$: Observable; - summary$: Observable = this.store.select(getResolverConfiguration); - - resolver: MetadataResolver; - - constructor( - private store: Store, - private valueEmitter: ProviderValueEmitter, - @Inject(METADATA_SOURCE_WIZARD) private sourceWizard: Wizard - ) { - this.copy$ = this.store.select(getCopy); - this.saving$ = this.store.select(getSaving); - - this.values$ = this.copy$.pipe(take(1)); - this.valueEmitter.changeEmitted$.subscribe(changes => this.store.dispatch(new UpdateResolverCopy(changes))); - - this.copy$.subscribe(p => this.resolver = p); - - this.store - .select(getCurrentWizardSchema) - .pipe( - skipWhile(s => !s) - ) - .subscribe(s => { - if (s) { - this.store.dispatch(new LoadSchemaRequest(s)); - } - }); - - this.store.dispatch(new SetDefinition(this.sourceWizard)); - } - - onSave(resolver: MetadataResolver): void { - this.store.dispatch(new AddResolverRequest(resolver)); - } - - ngOnDestroy(): void { - this.store.dispatch(new ClearWizard()); - } -} diff --git a/ui/src/app/metadata/resolver/container/copy-resolver.component.html b/ui/src/app/metadata/resolver/container/copy-resolver.component.html deleted file mode 100644 index 1f3bbe317..000000000 --- a/ui/src/app/metadata/resolver/container/copy-resolver.component.html +++ /dev/null @@ -1,146 +0,0 @@ -
-
-
- -
-
- - - - - Entity ID to copy is Required - -
-
- - - - Service Resolver Name is required - -
-
- - - - - Entity ID is required - - - Entity ID must be unique - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - - - - - -
Sections to Copy?Yes
-
-
- - -
-
-
Check All Attributes - -
Clear All Attributes - -
-
-
diff --git a/ui/src/app/metadata/resolver/container/copy-resolver.component.spec.ts b/ui/src/app/metadata/resolver/container/copy-resolver.component.spec.ts deleted file mode 100644 index ea6053cce..000000000 --- a/ui/src/app/metadata/resolver/container/copy-resolver.component.spec.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { ViewChild, Component } from '@angular/core'; -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; -import * as fromResolver from '../reducer'; -import { CopyResolverComponent } from './copy-resolver.component'; -import { SharedModule } from '../../../shared/shared.module'; -import { NavigatorService } from '../../../core/service/navigator.service'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; - -@Component({ - template: `` -}) -class TestHostComponent { - @ViewChild(CopyResolverComponent, {static: true}) - public formUnderTest: CopyResolverComponent; - - onSave(event: any): void {} -} - -describe('Copy Resolver Page', () => { - let fixture: ComponentFixture; - let store: Store; - let instance: CopyResolverComponent; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - NoopAnimationsModule, - StoreModule.forRoot({ - resolver: combineReducers(fromResolver.reducers) - }), - ReactiveFormsModule, - SharedModule, - MockI18nModule - ], - declarations: [ - CopyResolverComponent, - TestHostComponent - ], - providers: [ - NavigatorService - ] - }); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance.formUnderTest; - store = TestBed.get(Store); - fixture.detectChanges(); - - spyOn(store, 'dispatch').and.callThrough(); - }); - - it('should compile', () => { - expect(fixture).toBeDefined(); - }); - - describe('next method', () => { - it('should dispatch an action to create a copy', () => { - instance.next(); - expect(store.dispatch).toHaveBeenCalled(); - }); - }); - - describe('onChange method', () => { - it('should dispatch an action to update the selected sections to copy', () => { - instance.onChange('relyingPartyOverrides'); - expect(store.dispatch).toHaveBeenCalled(); - instance.onChange('relyingPartyOverrides'); - expect(store.dispatch).toHaveBeenCalled(); - }); - }); -}); diff --git a/ui/src/app/metadata/resolver/container/copy-resolver.component.ts b/ui/src/app/metadata/resolver/container/copy-resolver.component.ts deleted file mode 100644 index c07f88c35..000000000 --- a/ui/src/app/metadata/resolver/container/copy-resolver.component.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { - Component, - OnInit, - Output, - EventEmitter -} from '@angular/core'; -import { FormBuilder, FormGroup, FormControl, FormControlName, Validators, AbstractControl } from '@angular/forms'; -import { Observable, of } from 'rxjs'; -import { Store } from '@ngrx/store'; - -import { take } from 'rxjs/operators'; - -import * as fromResolver from '../reducer'; -import { EntityValidators } from '../../domain/service/entity-validators.service'; -import { SearchIds } from '../action/search.action'; -import * as fromProvider from '../reducer'; -import { CreateResolverCopyRequest, UpdateResolverCopySections } from '../action/copy.action'; - -@Component({ - selector: 'copy-resolver-form', - templateUrl: './copy-resolver.component.html' -}) -export class CopyResolverComponent implements OnInit { - @Output() save: EventEmitter = new EventEmitter(); - - providerForm: FormGroup; - ids$: Observable; - searchResults$: Observable; - selected$: Observable; - selected: string[]; - - sections = [ - { i18nKey: 'organizationInfo', property: 'organization' }, - { i18nKey: 'contacts', property: 'contacts' }, - { i18nKey: 'uiMduiInfo', property: 'mdui' }, - { i18nKey: 'spSsoDescriptorInfo', property: 'serviceProviderSsoDescriptor' }, - { i18nKey: 'logoutEndpoints', property: 'logoutEndpoints' }, - { i18nKey: 'securityDescriptorInfo', property: 'securityInfo' }, - { i18nKey: 'assertionConsumerServices', property: 'assertionConsumerServices' }, - { i18nKey: 'relyingPartyOverrides', property: 'relyingPartyOverrides' }, - { i18nKey: 'attributeRelease', property: 'attributeRelease' } - ]; - - sections$ = of(this.sections); - - constructor( - private store: Store, - private fb: FormBuilder - ) { - this.ids$ = this.store.select(fromResolver.getAllEntityIds); - this.searchResults$ = this.store.select(fromProvider.getSearchResults); - this.selected$ = this.store.select(fromProvider.getSectionsToCopy); - - this.selected$.subscribe(selected => this.selected = selected); - } - - ngOnInit(): void { - this.providerForm = this.fb.group({ - serviceProviderName: ['', [Validators.required]], - entityId: ['', Validators.required, EntityValidators.createUniqueIdValidator(this.ids$)], - target: ['', [Validators.required], [EntityValidators.existsInCollection(this.ids$)]], - }); - - this.store.select(fromProvider.getAttributes) - .pipe(take(1)) - .subscribe(attrs => this.providerForm.setValue({ ...attrs })); - - this.providerForm - .get('target') - .valueChanges - .subscribe(val => { - this.store.dispatch(new SearchIds(val)); - }); - } - - next(): void { - this.store.dispatch(new CreateResolverCopyRequest({ - ...this.providerForm.value - })); - } - - onChange(attr: string): void { - this.store.dispatch( - new UpdateResolverCopySections( - this.selected.indexOf(attr) > -1 ? this.selected.filter(a => a !== attr) : [...this.selected, attr] - ) - ); - } - - onCheckAll(): void { - this.store.dispatch(new UpdateResolverCopySections(this.sections.map(section => section.property))); - } - onCheckNone(event: Event | null = null): void { - this.store.dispatch(new UpdateResolverCopySections([])); - } -} diff --git a/ui/src/app/metadata/resolver/container/new-resolver.component.html b/ui/src/app/metadata/resolver/container/new-resolver.component.html deleted file mode 100644 index 86452a4e4..000000000 --- a/ui/src/app/metadata/resolver/container/new-resolver.component.html +++ /dev/null @@ -1,67 +0,0 @@ -
-
-
-
-
- Add a new metadata source -
-
-
-
- -

How are you adding the metadata information?

-
-
-
-
-
- -
-
-  or  -
-
- -
-
-  or  -
-
- -
-
-
-
-
-
- -
-
-
diff --git a/ui/src/app/metadata/resolver/container/new-resolver.component.scss b/ui/src/app/metadata/resolver/container/new-resolver.component.scss deleted file mode 100644 index df34e5c36..000000000 --- a/ui/src/app/metadata/resolver/container/new-resolver.component.scss +++ /dev/null @@ -1,6 +0,0 @@ -:host { - .resolver-nav-option { - min-width: 160px; - height: 100%; - } -} \ No newline at end of file diff --git a/ui/src/app/metadata/resolver/container/new-resolver.component.spec.ts b/ui/src/app/metadata/resolver/container/new-resolver.component.spec.ts deleted file mode 100644 index 9ebe511e1..000000000 --- a/ui/src/app/metadata/resolver/container/new-resolver.component.spec.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { RouterModule, ActivatedRoute } from '@angular/router'; -import { APP_BASE_HREF } from '@angular/common'; - -import { StoreModule, Store } from '@ngrx/store'; -import { NewResolverComponent } from './new-resolver.component'; - -import { UploadResolverComponent } from './upload-resolver.component'; -import { CopyResolverComponent } from './copy-resolver.component'; -import { SharedModule } from '../../../shared/shared.module'; -import { NavigatorService } from '../../../core/service/navigator.service'; -import * as fromResolver from '../reducer'; -import { ActivatedRouteStub } from '../../../../testing/activated-route.stub'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { of } from 'rxjs'; - -describe('New Resolver Page', () => { - let fixture: ComponentFixture; - let store: Store; - let instance: NewResolverComponent; - let activatedRoute: ActivatedRouteStub = new ActivatedRouteStub(); - activatedRoute.testParamMap = { id: 'foo', events: of({}) }; - activatedRoute.data = of('foo'); - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - NoopAnimationsModule, - StoreModule.forRoot(fromResolver.reducers), - ReactiveFormsModule, - SharedModule, - RouterModule.forRoot([], { relativeLinkResolution: 'legacy' }), - MockI18nModule - ], - declarations: [ - NewResolverComponent, - UploadResolverComponent, - CopyResolverComponent - ], - providers: [ - NavigatorService, - { provide: ActivatedRoute, useValue: activatedRoute }, - { provide: APP_BASE_HREF, useValue: '/' } - ] - }); - - fixture = TestBed.createComponent(NewResolverComponent); - instance = fixture.componentInstance; - store = TestBed.get(Store); - - spyOn(store, 'dispatch').and.callThrough(); - }); - - it('should compile', () => { - fixture.detectChanges(); - - expect(fixture).toBeDefined(); - }); -}); diff --git a/ui/src/app/metadata/resolver/container/new-resolver.component.ts b/ui/src/app/metadata/resolver/container/new-resolver.component.ts deleted file mode 100644 index f58392e21..000000000 --- a/ui/src/app/metadata/resolver/container/new-resolver.component.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { Component, OnDestroy } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; -import { Observable, Subscription, Subject } from 'rxjs'; -import { map, startWith, distinctUntilChanged, debounceTime, withLatestFrom, takeUntil } from 'rxjs/operators'; -import { SelectDraftRequest } from '../action/draft.action'; -import { Store } from '@ngrx/store'; -import * as fromCollection from '../reducer'; - -@Component({ - selector: 'new-resolver-page', - templateUrl: './new-resolver.component.html', - styleUrls: ['./new-resolver.component.scss'] -}) -export class NewResolverComponent implements OnDestroy { - - private ngUnsubscribe: Subject = new Subject(); - - actionsSubscription: Subscription; - - canSetNewType$: Observable; - - constructor( - private route: ActivatedRoute, - private router: Router, - private store: Store - ) { - this.canSetNewType$ = this.router.events.pipe( - startWith(this.route), - debounceTime(10), - map(url => { - let child = this.route.snapshot.firstChild; - return !child.routeConfig.path.match('blank') || child.params.index === 'common'; - }) - ); - - this.actionsSubscription = this.route.queryParams.pipe( - takeUntil(this.ngUnsubscribe), - distinctUntilChanged(), - map(data => new SelectDraftRequest(data.id)) - ).subscribe(this.store); - } - ngOnDestroy(): void { - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - } -} diff --git a/ui/src/app/metadata/resolver/container/resolver-edit-step.component.html b/ui/src/app/metadata/resolver/container/resolver-edit-step.component.html deleted file mode 100644 index a9a3be2e4..000000000 --- a/ui/src/app/metadata/resolver/container/resolver-edit-step.component.html +++ /dev/null @@ -1,9 +0,0 @@ - - - \ No newline at end of file diff --git a/ui/src/app/metadata/resolver/container/resolver-edit-step.component.ts b/ui/src/app/metadata/resolver/container/resolver-edit-step.component.ts deleted file mode 100644 index b00263ea8..000000000 --- a/ui/src/app/metadata/resolver/container/resolver-edit-step.component.ts +++ /dev/null @@ -1,143 +0,0 @@ -import { Component, OnDestroy } from '@angular/core'; -import { Observable, Subject } from 'rxjs'; -import { Store } from '@ngrx/store'; - -import * as fromResolver from '../reducer'; -import { UpdateStatus } from '../action/entity.action'; -import { Wizard, WizardStep } from '../../../wizard/model'; -import { MetadataResolver } from '../../domain/model'; -import { LockEditor, UnlockEditor } from '../../../wizard/action/wizard.action'; - -import * as fromWizard from '../../../wizard/reducer'; -import { withLatestFrom, map, distinctUntilChanged, filter, takeUntil } from 'rxjs/operators'; -import { UpdateChangesRequest } from '../action/entity.action'; -import { FormControl } from '@angular/forms'; - -@Component({ - selector: 'resolver-edit-step', - templateUrl: './resolver-edit-step.component.html', - styleUrls: [] -}) -export class ResolverEditStepComponent implements OnDestroy { - private ngUnsubscribe: Subject = new Subject(); - - valueChangeSubject = new Subject>(); - private valueChangeEmitted$ = this.valueChangeSubject.asObservable(); - - statusChangeSubject = new Subject>(); - private statusChangeEmitted$ = this.statusChangeSubject.asObservable(); - - currentPage: string; - - namesList: string[] = []; - - schema$: Observable; - resolver$: Observable; - model$: Observable; - definition$: Observable>; - changes$: Observable; - step$: Observable; - bindings$: Observable; - - validators$: Observable<{ [key: string]: any }>; - - lock: FormControl = new FormControl(true); - - constructor( - private store: Store - ) { - this.definition$ = this.store.select(fromWizard.getWizardDefinition); - this.changes$ = this.store.select(fromResolver.getEntityChanges); - this.resolver$ = this.store.select(fromResolver.getSelectedResolver); - this.step$ = this.store.select(fromWizard.getCurrent); - this.schema$ = this.store.select(fromWizard.getSchema); - this.bindings$ = this.definition$.pipe(filter(d => !!d), map(d => d.bindings)); - - this.step$.subscribe(s => { - if (s && s.locked) { - this.store.dispatch(new LockEditor()); - } else { - this.store.dispatch(new UnlockEditor()); - } - }); - - this.lock.valueChanges.subscribe(locked => this.store.dispatch(locked ? new LockEditor() : new UnlockEditor())); - - this.validators$ = this.definition$.pipe( - withLatestFrom( - this.store.select(fromResolver.getAllEntityIds), - this.resolver$ - ), - filter(([def, ids, resolver]) => !!def), - map(([def, ids, resolver]) => def.getValidators( - ids.filter(id => id !== resolver.entityId) - )) - ); - - this.model$ = this.schema$.pipe( - withLatestFrom( - this.store.select(fromResolver.getSelectedResolver), - this.store.select(fromWizard.getModel), - this.changes$, - this.definition$ - ), - map(([schema, resolver, model, changes, definition]) => { - return ({ - model: { - ...model, - ...resolver, - ...changes - }, - definition - }); - }), - filter(({ model, definition }) => definition && model), - map(({ model, definition }) => definition.formatter(model)) - ); - - this.valueChangeEmitted$.pipe( - takeUntil(this.ngUnsubscribe), - map(changes => changes.value), - withLatestFrom( - this.definition$, - this.store.select(fromResolver.getSelectedResolver), - this.changes$, - this.schema$ - ), - filter(([valueChange, definition, resolver]) => definition && resolver), - map(([ - valueChange, - definition, - resolver, - changes, - schema - ]) => { - const parsed = definition.parser({ ...valueChange }, schema); - return { ...resolver, ...changes, ...parsed }; - }) - ) - .subscribe(changes => { - this.store.dispatch(new UpdateChangesRequest(changes)); - }); - - this.statusChangeEmitted$ - .pipe(distinctUntilChanged()) - .subscribe(errors => { - this.updateStatus(errors); - }); - - this.store.select(fromWizard.getWizardIndex).subscribe(i => this.currentPage = i); - } - - updateStatus(errors: any): void { - const status = { [this.currentPage]: !(errors.value) ? 'VALID' : 'INVALID' }; - this.store.dispatch(new UpdateStatus(status)); - } - - ngOnDestroy() { - this.valueChangeSubject.complete(); - this.statusChangeSubject.complete(); - this.ngUnsubscribe.unsubscribe(); - } -} - diff --git a/ui/src/app/metadata/resolver/container/resolver-edit.component.html b/ui/src/app/metadata/resolver/container/resolver-edit.component.html deleted file mode 100644 index 85084e0f8..000000000 --- a/ui/src/app/metadata/resolver/container/resolver-edit.component.html +++ /dev/null @@ -1,62 +0,0 @@ -
-
-
-
- - - Edit Metadata Source - {{ (resolver$ | async).serviceProviderName }} - -
-
-
-
-
-
- - -
-
- -   - -
-
-
- - All forms must be valid before changes can be saved! -
-
-
-
-
-
- - -
-
- -
-
-
-
\ No newline at end of file diff --git a/ui/src/app/metadata/resolver/container/resolver-edit.component.ts b/ui/src/app/metadata/resolver/container/resolver-edit.component.ts deleted file mode 100644 index c5cc6b324..000000000 --- a/ui/src/app/metadata/resolver/container/resolver-edit.component.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { Component, OnDestroy } from '@angular/core'; -import { Router, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; -import { Observable, of, Subject } from 'rxjs'; -import { map, filter } from 'rxjs/operators'; -import { Store } from '@ngrx/store'; -import * as fromWizard from '../../../wizard/reducer'; -import * as fromResolver from '../reducer'; -import { LoadSchemaRequest } from '../../../wizard/action/wizard.action'; -import { MetadataResolver } from '../../domain/model'; -import { Clear } from '../action/entity.action'; -import { Wizard } from '../../../wizard/model'; -import { UpdateResolverRequest } from '../action/collection.action'; -import { NgbModal } from '../../../../../node_modules/@ng-bootstrap/ng-bootstrap'; -import { CanComponentDeactivate } from '../../../core/service/can-deactivate.guard'; -import { DifferentialService } from '../../../core/service/differential.service'; -import { NAV_FORMATS } from '../../domain/component/editor-nav.component'; -import { UnsavedEntityComponent } from '../../domain/component/unsaved-entity.dialog'; - -@Component({ - selector: 'resolver-edit', - templateUrl: './resolver-edit.component.html', - styleUrls: [] -}) - -export class ResolverEditComponent implements OnDestroy, CanComponentDeactivate { - private ngUnsubscribe: Subject = new Subject(); - resolver$: Observable; - definition$: Observable>; - index$: Observable; - - valid$: Observable; - isInvalid$: Observable; - status$: Observable; - isSaving$: Observable; - - latest: MetadataResolver; - resolver: MetadataResolver; - - formats = NAV_FORMATS; - - constructor( - private store: Store, - private router: Router, - private modalService: NgbModal, - private diffService: DifferentialService - ) { - this.resolver$ = this.store.select(fromResolver.getSelectedResolver).pipe(filter(d => !!d)); - this.definition$ = this.store.select(fromWizard.getWizardDefinition).pipe(filter(d => !!d)); - this.index$ = this.store.select(fromWizard.getWizardIndex).pipe(filter(i => !!i)); - this.valid$ = this.store.select(fromResolver.getEntityIsValid); - this.isInvalid$ = this.valid$.pipe(map(v => !v)); - this.status$ = this.store.select(fromResolver.getInvalidEntityForms); - this.isSaving$ = this.store.select(fromResolver.getEntityIsSaving); - - this.store - .select(fromWizard.getCurrentWizardSchema) - .pipe(filter(s => !!s)) - .subscribe(s => this.store.dispatch(new LoadSchemaRequest(s))); - - this.resolver$.subscribe(p => this.resolver = p); - this.store.select(fromResolver.getEntityChanges).subscribe(changes => this.latest = changes); - } - - ngOnDestroy() { - this.clear(); - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - } - - clear(): void { - this.store.dispatch(new Clear()); - } - - save(): void { - this.store.dispatch(new UpdateResolverRequest(this.latest)); - } - - cancel(): void { - this.clear(); - this.router.navigate(['metadata', 'resolver', this.resolver.id, 'configuration']); - } - - canDeactivate( - currentRoute: ActivatedRouteSnapshot, - currentState: RouterStateSnapshot, - nextState: RouterStateSnapshot - ): Observable { - if (nextState.url.match('edit')) { - return of(true); - } - const diff = this.diffService.updatedDiff(this.resolver, this.latest); - if (diff && Object.keys(diff).length > 0) { - let modal = this.modalService.open(UnsavedEntityComponent); - modal.result.then( - () => { - this.clear(); - this.router.navigate([nextState.url]); - }, - () => console.warn('denied') - ); - return this.store.select(fromResolver.getEntityIsSaved); - } - return of(true); - } -} - diff --git a/ui/src/app/metadata/resolver/container/resolver-select.component.html b/ui/src/app/metadata/resolver/container/resolver-select.component.html deleted file mode 100644 index 7ae9706dc..000000000 --- a/ui/src/app/metadata/resolver/container/resolver-select.component.html +++ /dev/null @@ -1,3 +0,0 @@ -
- -
\ No newline at end of file diff --git a/ui/src/app/metadata/resolver/container/resolver-select.component.ts b/ui/src/app/metadata/resolver/container/resolver-select.component.ts deleted file mode 100644 index 041e0e8d2..000000000 --- a/ui/src/app/metadata/resolver/container/resolver-select.component.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { Component, OnDestroy, Inject } from '@angular/core'; -import { Subscription, Observable, Subject } from 'rxjs'; -import { Store } from '@ngrx/store'; - -import { ActivatedRoute } from '@angular/router'; -import { map, distinctUntilChanged, skipWhile, takeUntil } from 'rxjs/operators'; -import { SelectResolver } from '../action/collection.action'; -import * as fromResolvers from '../reducer'; -import { MetadataResolver } from '../../domain/model'; -import { SetDefinition, ClearWizard } from '../../../wizard/action/wizard.action'; -import { Clear } from '../action/entity.action'; -import { METADATA_SOURCE_EDITOR } from '../wizard-definition'; -import { Wizard } from '../../../wizard/model'; - -@Component({ - selector: 'resolver-select', - templateUrl: './resolver-select.component.html', - styleUrls: [] -}) - -export class ResolverSelectComponent implements OnDestroy { - private ngUnsubscribe: Subject = new Subject(); - actionsSubscription: Subscription; - - resolver$: Observable; - - constructor( - private store: Store, - private route: ActivatedRoute, - @Inject(METADATA_SOURCE_EDITOR) private sourceWizard: Wizard - ) { - this.route.params.pipe( - takeUntil(this.ngUnsubscribe), - map(params => new SelectResolver(params.id)) - ).subscribe(store); - - this.resolver$ = this.store.select(fromResolvers.getSelectedResolver).pipe(skipWhile(p => !p)); - - this.resolver$.pipe(takeUntil(this.ngUnsubscribe)).subscribe(resolver => this.setDefinition(resolver)); - } - - setDefinition(resolver: MetadataResolver): void { - if (resolver) { - this.store.dispatch(new SetDefinition(this.sourceWizard)); - } - } - - ngOnDestroy() { - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - this.store.dispatch(new Clear()); - this.store.dispatch(new ClearWizard()); - } -} - diff --git a/ui/src/app/metadata/resolver/container/resolver-wizard-step.component.html b/ui/src/app/metadata/resolver/container/resolver-wizard-step.component.html deleted file mode 100644 index 926f3024c..000000000 --- a/ui/src/app/metadata/resolver/container/resolver-wizard-step.component.html +++ /dev/null @@ -1,9 +0,0 @@ - - - \ No newline at end of file diff --git a/ui/src/app/metadata/resolver/container/resolver-wizard-step.component.spec.ts b/ui/src/app/metadata/resolver/container/resolver-wizard-step.component.spec.ts deleted file mode 100644 index dc481b30d..000000000 --- a/ui/src/app/metadata/resolver/container/resolver-wizard-step.component.spec.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; - -import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; - -import { ResolverWizardStepComponent } from './resolver-wizard-step.component'; -import * as fromRoot from '../reducer'; -import { SchemaFormModule, WidgetRegistry, DefaultWidgetRegistry } from 'ngx-schema-form'; -import * as fromWizard from '../../../wizard/reducer'; -import { initialState } from '../reducer/entity.reducer'; -import { MetadataSourceWizard } from '../../domain/model/wizards/metadata-source-wizard'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(ResolverWizardStepComponent, {static: true}) - public componentUnderTest: ResolverWizardStepComponent; -} - -describe('Resolver Wizard Step Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: ResolverWizardStepComponent; - let store: Store; - - let schema = { - type: 'object', - properties: { - id: { - type: 'string' - }, - serviceProviderName: { - type: 'string' - }, - entityId: { - type: 'string' - } - } - }; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - RouterTestingModule, - SchemaFormModule.forRoot(), - StoreModule.forRoot({ - resolver: combineReducers(fromRoot.reducers, { - entity: { - ...initialState, - changes: { - id: 'foo', - serviceProviderName: 'bar', - createdBy: 'admin' - } - } - }), - wizard: combineReducers(fromWizard.reducers, { - wizard: { - index: 'common', - disabled: false, - definition: new MetadataSourceWizard(), - schemaPath: '/foo/bar', - loading: false, - schema: { - ...schema - }, - locked: false - } - }) - }) - ], - declarations: [ - ResolverWizardStepComponent, - TestHostComponent - ], - providers: [ - { provide: WidgetRegistry, useClass: DefaultWidgetRegistry } - ] - }).compileComponents(); - - store = TestBed.get(Store); - spyOn(store, 'dispatch'); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should instantiate the component', waitForAsync(() => { - expect(app).toBeTruthy(); - })); - - describe('updateStatus method', () => { - it('should dispatch an UpdateStatus action', () => { - app.updateStatus({ value: { name: 'notfound' } }); - expect(store.dispatch).toHaveBeenCalled(); - }); - - it('should NOT dispatch a SetDefinition action if the type hasn\'t changed', () => { - app.updateStatus({ value: null }); - expect(store.dispatch).toHaveBeenCalled(); - }); - }); -}); diff --git a/ui/src/app/metadata/resolver/container/resolver-wizard-step.component.ts b/ui/src/app/metadata/resolver/container/resolver-wizard-step.component.ts deleted file mode 100644 index f33f0f958..000000000 --- a/ui/src/app/metadata/resolver/container/resolver-wizard-step.component.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { Component, OnDestroy } from '@angular/core'; -import { Observable, Subject, combineLatest } from 'rxjs'; -import { withLatestFrom, map, distinctUntilChanged, skipWhile, filter } from 'rxjs/operators'; -import { Store } from '@ngrx/store'; - -import * as fromResolver from '../reducer'; -import * as fromWizard from '../../../wizard/reducer'; - -import { UpdateStatus, UpdateChangesRequest } from '../action/entity.action'; -import { Wizard } from '../../../wizard/model'; -import { MetadataResolver } from '../../domain/model'; - -@Component({ - selector: 'resolver-wizard-step', - templateUrl: './resolver-wizard-step.component.html', - styleUrls: [] -}) - -export class ResolverWizardStepComponent implements OnDestroy { - valueChangeSubject = new Subject>(); - private valueChangeEmitted$ = this.valueChangeSubject.asObservable(); - - statusChangeSubject = new Subject>(); - private statusChangeEmitted$ = this.statusChangeSubject.asObservable(); - - schema$: Observable; - schema: any; - definition$: Observable>; - changes$: Observable; - currentPage: string; - valid$: Observable; - model$: Observable; - - namesList: string[] = []; - - validators$: Observable<{ [key: string]: any }>; - - bindings$: Observable; - - constructor( - private store: Store, - ) { - this.schema$ = this.store.select(fromWizard.getSchema); - this.definition$ = this.store.select(fromWizard.getWizardDefinition); - this.changes$ = this.store.select(fromResolver.getEntityChanges); - this.bindings$ = this.definition$.pipe(map(d => d.bindings)); - - this.model$ = this.schema$.pipe( - withLatestFrom( - this.store.select(fromWizard.getModel), - this.store.select(fromResolver.getSelectedDraft), - this.changes$, - this.definition$ - ), - map(([schema, model, selected, changes, definition]) => ({ - model: { - ...model, - ...selected, - ...changes - }, - definition - })), - filter(({ model, definition }) => (definition && model)), - map(({ model, definition }) => definition.formatter(model)) - ); - - this.validators$ = combineLatest( - this.definition$, - this.store.select(fromResolver.getValidEntityIds), - this.model$ - ).pipe( - map(([def, ids, resolver]) => { - return def.getValidators( - ids - ); - }) - ); - - this.valueChangeEmitted$.pipe( - withLatestFrom( - this.definition$, - this.schema$, - this.store.select(fromResolver.getSelectedDraft) - ), - filter(([ changes, definition ]) => (!!definition && !!changes)), - map(([ changes, definition, schema, original ]) => { - const parsed = definition.parser(changes.value, schema); - return { ...original, ...parsed }; - }) - ) - .subscribe(changes => { - this.store.dispatch(new UpdateChangesRequest(changes)); - }); - - this.statusChangeEmitted$ - .pipe(distinctUntilChanged()) - .subscribe(errors => { - this.updateStatus(errors); - }); - - this.store.select(fromWizard.getWizardIndex).subscribe(i => this.currentPage = i); - } - - updateStatus(errors: any): void { - const status = { [this.currentPage]: !(errors.value) ? 'VALID' : 'INVALID' }; - this.store.dispatch(new UpdateStatus(status)); - } - - ngOnDestroy() { - this.valueChangeSubject.complete(); - } -} - diff --git a/ui/src/app/metadata/resolver/container/resolver-wizard.component.html b/ui/src/app/metadata/resolver/container/resolver-wizard.component.html deleted file mode 100644 index 425a84920..000000000 --- a/ui/src/app/metadata/resolver/container/resolver-wizard.component.html +++ /dev/null @@ -1,13 +0,0 @@ - -
-
-
- -
-
-
- -
diff --git a/ui/src/app/metadata/resolver/container/resolver-wizard.component.scss b/ui/src/app/metadata/resolver/container/resolver-wizard.component.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/ui/src/app/metadata/resolver/container/resolver-wizard.component.spec.ts b/ui/src/app/metadata/resolver/container/resolver-wizard.component.spec.ts deleted file mode 100644 index b762c0f29..000000000 --- a/ui/src/app/metadata/resolver/container/resolver-wizard.component.spec.ts +++ /dev/null @@ -1,184 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; -import { RouterStateSnapshot } from '@angular/router'; -import { NgbDropdownModule, NgbPopoverModule, NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { of } from 'rxjs'; - -import { ResolverWizardComponent } from './resolver-wizard.component'; -import * as fromRoot from '../reducer'; -import * as fromWizard from '../../../wizard/reducer'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { METADATA_SOURCE_WIZARD } from '../wizard-definition'; -import { MetadataSourceWizard } from '../../domain/model/wizards/metadata-source-wizard'; -import { initialState } from '../reducer/entity.reducer'; -import { MockWizardModule } from '../../../../testing/wizard.stub'; - -import { NgbModalStub } from '../../../../testing/modal.stub'; -import { MetadataResolver } from '../../domain/model'; -import { DifferentialService } from '../../../core/service/differential.service'; -import { MetadataConfigurationComponentStub } from '../../../../testing/metadata-configuration.stub'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(ResolverWizardComponent, {static: true}) - public componentUnderTest: ResolverWizardComponent; -} - -describe('Resolver Wizard Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: ResolverWizardComponent; - let store: Store; - let modal: NgbModal; - - let schema = { - type: 'object', - properties: { - id: { - type: 'string' - }, - serviceProviderName: { - type: 'string' - } - } - }; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - MockWizardModule, - NgbDropdownModule, - NgbPopoverModule, - RouterTestingModule, - StoreModule.forRoot({ - resolver: combineReducers(fromRoot.reducers, { - entity: { - ...initialState, - changes: { - id: 'foo', - serviceProviderName: 'bar', - createdBy: 'admin' - } - } - }), - wizard: combineReducers(fromWizard.reducers, { - wizard: { - index: 'page', - disabled: false, - definition: new MetadataSourceWizard(), - schemaPath: '/foo/bar', - loading: false, - schema: { - ...schema - }, - locked: false - } - }) - }), - MockI18nModule - ], - declarations: [ - ResolverWizardComponent, - TestHostComponent, - MetadataConfigurationComponentStub - ], - providers: [ - DifferentialService, - { provide: NgbModal, useClass: NgbModalStub }, - { provide: METADATA_SOURCE_WIZARD, useValue: MetadataSourceWizard } - ] - }).compileComponents(); - - store = TestBed.get(Store); - spyOn(store, 'dispatch'); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - - modal = TestBed.get(NgbModal); - })); - - it('should instantiate the component', waitForAsync(() => { - expect(app).toBeTruthy(); - })); - - describe('canDeactivate method', () => { - it('should return true if moving to another page', waitForAsync(() => { - app.canDeactivate( - null, - { - url: 'foo', - root: { - queryParams: { - id: 'foo' - } - } - } as RouterStateSnapshot, - { - url: 'blank', - root: { - queryParams: { id: 'foo' } - } - } as RouterStateSnapshot - ).subscribe((can) => { - expect(can).toBe(true); - }); - })); - - /*it('should open a modal', () => { - app.changes = {id: 'bar', serviceProviderName: 'foo', createdBy: 'admin'}; - spyOn(modal, 'open').and.callThrough(); - app.canDeactivate(null, - { - url: 'foo', - root: { - queryParams: { - id: 'foo' - } - } - } as RouterStateSnapshot, - { - url: 'foo', - root: { - queryParams: { - id: 'foo' - } - } - } as RouterStateSnapshot); - expect(modal.open).toHaveBeenCalled(); - });*/ - - it('should check if the entity is saved', waitForAsync(() => { - app.changes = {} as MetadataResolver; - spyOn(store, 'select').and.returnValue(of(true)); - spyOn(modal, 'open').and.callThrough(); - app.canDeactivate(null, { - url: 'foo', - root: { - queryParams: { - id: 'foo' - } - } - } as RouterStateSnapshot, { - url: 'foo', - root: { - queryParams: { - id: 'foo' - } - } - } as RouterStateSnapshot).subscribe((can) => { - expect(can).toBe(true); - expect(modal.open).not.toHaveBeenCalled(); - }); - })); - }); -}); diff --git a/ui/src/app/metadata/resolver/container/resolver-wizard.component.ts b/ui/src/app/metadata/resolver/container/resolver-wizard.component.ts deleted file mode 100644 index b56391b27..000000000 --- a/ui/src/app/metadata/resolver/container/resolver-wizard.component.ts +++ /dev/null @@ -1,184 +0,0 @@ -import { - Component, - OnDestroy, - Inject -} from '@angular/core'; -import { - ActivatedRoute, - Router, - ActivatedRouteSnapshot, - RouterStateSnapshot -} from '@angular/router'; -import { Observable, Subject, of } from 'rxjs'; -import { skipWhile, startWith, distinctUntilChanged, map, takeUntil, combineLatest, withLatestFrom } from 'rxjs/operators'; -import { Store } from '@ngrx/store'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; - -import { MetadataResolver } from '../../domain/model/metadata-resolver'; -import * as fromCollections from '../reducer'; -import { AddResolverRequest } from '../action/collection.action'; -import * as fromResolver from '../reducer'; - -import { CanComponentDeactivate } from '../../../core/service/can-deactivate.guard'; -import { METADATA_SOURCE_WIZARD } from '../wizard-definition'; -import { Wizard, WizardStep } from '../../../wizard/model'; -import { SetDefinition, SetIndex, SetDisabled, ClearWizard } from '../../../wizard/action/wizard.action'; - -import * as fromWizard from '../../../wizard/reducer'; -import { LoadSchemaRequest } from '../../../wizard/action/wizard.action'; -import { UnsavedEntityComponent } from '../../domain/component/unsaved-entity.dialog'; -import { Clear } from '../action/entity.action'; -import { MetadataConfiguration } from '../../configuration/model/metadata-configuration'; - -@Component({ - selector: 'resolver-wizard-page', - templateUrl: './resolver-wizard.component.html', - styleUrls: ['./resolver-wizard.component.scss'] -}) -export class ResolverWizardComponent implements OnDestroy, CanComponentDeactivate { - - private ngUnsubscribe: Subject = new Subject(); - - nextStep: WizardStep; - previousStep: WizardStep; - currentPage: string; - - resolver$: Observable; - resolver: MetadataResolver; - providerName$: Observable; - changes$: Observable; - changes: MetadataResolver; - latest: MetadataResolver; - - wizardIndex$: Observable; - wizardIndex: number; - currentPage$: Observable; - wizard$: Observable; - saved$: Observable; - saving: boolean; - - valid$: Observable; - schema$: Observable; - - summary$: Observable = this.store.select(fromCollections.getResolverConfiguration); - - constructor( - private store: Store, - private route: ActivatedRoute, - private router: Router, - private modalService: NgbModal, - @Inject(METADATA_SOURCE_WIZARD) private sourceWizard: Wizard - ) { - this.store - .select(fromWizard.getCurrentWizardSchema) - .pipe( - skipWhile(s => !s) - ) - .subscribe(s => { - if (s) { - this.store.dispatch(new LoadSchemaRequest(s)); - } - }); - this.valid$ = this.store.select(fromResolver.getEntityIsValid); - - this.valid$ - .pipe(startWith(false)) - .subscribe((valid) => { - this.store.dispatch(new SetDisabled(!valid)); - }); - - this.store.dispatch(new SetDefinition(this.sourceWizard)); - - this.store.select(fromWizard.getNext).subscribe(n => this.nextStep = n); - this.store.select(fromWizard.getPrevious).subscribe(p => this.previousStep = p); - this.store.select(fromWizard.getWizardIndex).subscribe(i => this.currentPage = i); - - this.changes$ = this.store.select(fromResolver.getEntityChanges); - this.schema$ = this.store.select(fromWizard.getSchema); - - this.resolver$ = this.store.select(fromCollections.getSelectedDraft); - - this.changes$.pipe( - takeUntil(this.ngUnsubscribe), - skipWhile(() => this.saving), - combineLatest(this.resolver$, (changes, base) => ({ ...base, ...changes })) - ).subscribe(latest => this.latest = latest); - - this.changes$.pipe(takeUntil(this.ngUnsubscribe)).subscribe(c => this.changes = c); - this.resolver$.pipe(takeUntil(this.ngUnsubscribe)).subscribe(r => this.resolver = r); - } - - next(): void { - this.go(this.nextStep.id); - } - - previous(): void { - this.go(this.previousStep.id); - } - - save(): void { - this.store.dispatch(new SetDisabled(true)); - this.store.dispatch(new AddResolverRequest(this.latest)); - } - - go(index: string): void { - this.router.navigate( - [ - '../', - index - ], - { - relativeTo: this.route, - queryParamsHandling: 'preserve' - } - ); - } - - gotoPage(page: string): void { - this.store.dispatch(new SetIndex(page)); - } - - get blacklist(): string[] { - return ['id', 'resourceId', 'entityId', 'serviceProviderName']; - } - - hasChanges(changes: MetadataResolver): boolean { - return Object.keys(changes).filter(key => !(this.blacklist.indexOf(key) > -1)).length > 0; - } - - isNew(changes: MetadataResolver): boolean { - return Object.keys(changes).filter(key => !(this.blacklist.indexOf(key) > -1)).length === 0; - } - - ngOnDestroy(): void { - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - this.store.dispatch(new ClearWizard()); - } - - canDeactivate( - currentRoute: ActivatedRouteSnapshot, - currentState: RouterStateSnapshot, - nextState: RouterStateSnapshot - ): Observable { - const changingIds = currentState.root.queryParams.id !== nextState.root.queryParams.id; - if (nextState.url.match('blank') && !!nextState.root.queryParams.id && !changingIds) { - return of(true); - } - if (this.hasChanges(this.changes)) { - let modal = this.modalService.open(UnsavedEntityComponent); - modal.componentInstance.message = 'resolver'; - modal.result.then( - () => { - this.store.dispatch(new Clear()); - this.router.navigateByUrl(nextState.url); - }, - () => console.warn('denied') - ); - } - if (this.isNew(this.latest)) { - return of(true); - } - return this.store.select(fromResolver.getEntityIsSaved); - } -} diff --git a/ui/src/app/metadata/resolver/container/upload-resolver.component.html b/ui/src/app/metadata/resolver/container/upload-resolver.component.html deleted file mode 100644 index 376bcd0f6..000000000 --- a/ui/src/app/metadata/resolver/container/upload-resolver.component.html +++ /dev/null @@ -1,67 +0,0 @@ -
-
-
- -
-
- - - - - - Service Resolver Name is required - - - -
-
- -
- - -
-
-
- — - OR - — -
-
- - -
- -
-
-
-
diff --git a/ui/src/app/metadata/resolver/container/upload-resolver.component.spec.ts b/ui/src/app/metadata/resolver/container/upload-resolver.component.spec.ts deleted file mode 100644 index 9b7659870..000000000 --- a/ui/src/app/metadata/resolver/container/upload-resolver.component.spec.ts +++ /dev/null @@ -1,140 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { Observable, of } from 'rxjs'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; - -import { UploadResolverComponent } from './upload-resolver.component'; -import { FileService } from '../../../core/service/file.service'; -import { FileServiceStub } from '../../../../testing/file.service.stub'; -import * as fromResolver from '../reducer'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; - -@Component({ - template: `` -}) -class TestHostComponent { - @ViewChild(UploadResolverComponent, {static: true}) - public formUnderTest: UploadResolverComponent; - - upload(event: Event): void {} - createFromUrl(event: Event): void {} -} - -const getFakeFile = (str: string) => { - let blob = new Blob([str], { type: 'text/html' }); - blob['lastModifiedDate'] = ''; - blob['name'] = str; - return blob; -}; - -describe('Upload Resolver Page', () => { - let fixture: ComponentFixture; - let instance: TestHostComponent; - let form: UploadResolverComponent; - let fileService: FileServiceStub; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - { provide: FileService, useClass: FileServiceStub } - ], - imports: [ - ReactiveFormsModule, - StoreModule.forRoot(fromResolver.reducers), - MockI18nModule - ], - declarations: [ - UploadResolverComponent, - TestHostComponent - ], - }); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - form = instance.formUnderTest; - fileService = TestBed.get(FileService); - fixture.detectChanges(); - }); - - it('should compile', () => { - fixture.detectChanges(); - expect(form).toBeDefined(); - }); - - describe('save method', () => { - it('should call the upload method with the selected file when one is defined', () => { - fixture.detectChanges(); - form.file = getFakeFile('foo'); - spyOn(form, 'saveFromFile'); - form.save(); - expect(form.saveFromFile).toHaveBeenCalled(); - }); - it('should call the fromUrl method when there is no file selected', () => { - fixture.detectChanges(); - spyOn(form, 'saveFromFile'); - spyOn(form, 'saveFromUrl'); - form.save(); - expect(form.saveFromUrl).toHaveBeenCalled(); - expect(form.saveFromFile).not.toHaveBeenCalled(); - }); - }); - - describe('saveFromFile method', () => { - it('should retrieve the file text from a service and call the provided upload emitter', waitForAsync((done) => { - fixture.detectChanges(); - spyOn(fileService, 'readAsText').and.callFake(() => of('foo')); - form.providerForm.setValue({ serviceProviderName: 'foo', file: '', url: '' }); - form.saveFromFile(getFakeFile('foo'), 'foo'); - form.upload.subscribe(v => { - expect(v).toEqual({ - name: 'foo', - body: 'foo' - }); - done(); - }); - })); - }); - - describe('saveFromUrl method', () => { - it('should retrieve the file text from a service and call the provided upload emitter', waitForAsync((done) => { - fixture.detectChanges(); - form.saveFromUrl({ serviceProviderName: 'foo', url: 'foo.bar' }); - form.fromUrl.subscribe(v => { - expect(v).toEqual({ - name: 'foo', - url: 'foo.bar' - }); - done(); - }); - })); - }); - - describe('fileChange method', () => { - it('should set the reactive form value based on the provided event', waitForAsync((done) => { - let evt = { - target: { - files: [{name: 'foo'}] - } - }; - form.fileChange(evt); - fixture.detectChanges(); - expect(form.file).toBeDefined(); - expect(form.providerForm.get('file').value).toBe('foo'); - })); - - it('should do nothing if no file is selected', waitForAsync((done) => { - let evt = { - target: { - files: [] - } - }; - form.fileChange(evt); - fixture.detectChanges(); - expect(form.file).not.toBeDefined(); - expect(form.providerForm.get('file').value).toBe(''); - })); - }); -}); diff --git a/ui/src/app/metadata/resolver/container/upload-resolver.component.ts b/ui/src/app/metadata/resolver/container/upload-resolver.component.ts deleted file mode 100644 index 4bebb200f..000000000 --- a/ui/src/app/metadata/resolver/container/upload-resolver.component.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { Component, OnInit, OnDestroy, Output, EventEmitter } from '@angular/core'; -import { FormBuilder, FormGroup, Validators } from '@angular/forms'; -import { Subject } from 'rxjs'; -import { takeUntil, debounceTime } from 'rxjs/operators'; -import { Store } from '@ngrx/store'; -import { FileService } from '../../../core/service/file.service'; -import * as fromResolver from '../reducer'; -import { UploadResolverRequest, CreateResolverFromUrlRequest } from '../action/collection.action'; - -@Component({ - selector: 'upload-resolver-form', - templateUrl: './upload-resolver.component.html' -}) -export class UploadResolverComponent implements OnInit, OnDestroy { - private ngUnsubscribe: Subject = new Subject(); - - @Output() upload: EventEmitter = new EventEmitter(); - @Output() fromUrl: EventEmitter = new EventEmitter(); - - providerForm: FormGroup; - formValue: any; - - file: File; - - constructor( - private fb: FormBuilder, - private fileService: FileService, - private store: Store - ) {} - - ngOnInit(): void { - this.providerForm = this.fb.group({ - serviceProviderName: ['', Validators.required], - file: [''], - url: [''] - }); - - this.providerForm.valueChanges.subscribe(changes => { - this.formValue = changes; - }); - - this.providerForm.get('file').valueChanges.pipe( - takeUntil(this.ngUnsubscribe), - debounceTime(100) - ).subscribe(changes => { - let url = this.providerForm.get('url'); - url[changes ? 'disable' : 'enable'](); - if (!!url.value) { - url.setValue(null); - } - }); - } - - save(): void { - let file = this.file; - if (file) { - this.saveFromFile(file, this.providerForm.get('serviceProviderName').value); - } else { - this.saveFromUrl(this.providerForm.value); - } - } - - saveFromFile(file: File, name: string): void { - this.fileService.readAsText(file).subscribe(txt => { - this.store.dispatch(new UploadResolverRequest({ - name: name, - body: txt as string - })); - }); - } - - saveFromUrl(values: {serviceProviderName: string, url: string}): void { - this.store.dispatch(new CreateResolverFromUrlRequest({ - name: values.serviceProviderName, - url: values.url - })); - } - - fileChange($event): void { - let fileList = $event.target.files, - file = fileList[0]; - this.file = file; - if (file) { - this.providerForm.get('file').setValue(file.name); - this.providerForm.updateValueAndValidity(); - } - } - - ngOnDestroy(): void { - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - } -} /* istanbul ignore next */ diff --git a/ui/src/app/metadata/resolver/effect/collection.effect.spec.ts b/ui/src/app/metadata/resolver/effect/collection.effect.spec.ts deleted file mode 100644 index a04482061..000000000 --- a/ui/src/app/metadata/resolver/effect/collection.effect.spec.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { TestBed } from '@angular/core/testing'; -import { Actions } from '@ngrx/effects'; -import { Router } from '@angular/router'; - -import { TestActions, getActions } from '../../../../testing/effect.util'; -import { MetadataResolver } from '../../domain/model'; -import { ResolverCollectionEffects } from './collection.effects'; -import { ResolverService } from '../../domain/service/resolver.service'; -import { RouterStub } from '../../../../testing/router.stub'; - -describe('Resolver Collection Effects', () => { - let effects: ResolverCollectionEffects; - let draftService: any; - let actions$: TestActions; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - ResolverCollectionEffects, - { - provide: ResolverService, - useValue: { - query: () => { }, - find: (id: string) => { }, - save: (e: MetadataResolver) => { }, - update: (e: MetadataResolver) => { }, - remove: (e: MetadataResolver) => { }, - preview: (e: MetadataResolver) => { }, - upload: (name: string, xml: string) => { }, - createFromUrl: (name: string, url: string) => { } - }, - }, - { provide: Actions, useFactory: getActions }, - { provide: Router, useClass: RouterStub } - ], - }); - - effects = TestBed.get(ResolverCollectionEffects); - draftService = TestBed.get(ResolverService); - actions$ = TestBed.get(Actions); - }); -}); diff --git a/ui/src/app/metadata/resolver/effect/collection.effects.ts b/ui/src/app/metadata/resolver/effect/collection.effects.ts deleted file mode 100644 index b4550d358..000000000 --- a/ui/src/app/metadata/resolver/effect/collection.effects.ts +++ /dev/null @@ -1,229 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { Router } from '@angular/router'; -import { Store } from '@ngrx/store'; -import { of } from 'rxjs'; -import { map, catchError, switchMap, tap, withLatestFrom } from 'rxjs/operators'; - -import { - ResolverCollectionActionTypes, - LoadResolverRequest, - LoadResolverSuccess, - LoadResolverError, - AddResolverRequest, - AddResolverSuccess, - AddResolverFail, - RemoveResolverRequest, - RemoveResolverSuccess, - RemoveResolverFail, - SelectResolver, - SelectResolverSuccess, - UpdateResolverRequest, - UpdateResolverSuccess, - UpdateResolverFail, - UpdateResolverConflict, - UploadResolverRequest, - CreateResolverFromUrlRequest -} from '../action/collection.action'; -import * as draftActions from '../action/draft.action'; -import { ResolverService } from '../../domain/service/resolver.service'; -import { removeNulls } from '../../../shared/util'; -import { AddNotification } from '../../../notification/action/notification.action'; -import { Notification, NotificationType } from '../../../notification/model/notification'; -import { I18nService } from '../../../i18n/service/i18n.service'; -import * as fromRoot from '../../../app.reducer'; -import * as fromI18n from '../../../i18n/reducer'; -import { UpdateSaving } from '../action/entity.action'; - - -/* istanbul ignore next */ -@Injectable() -export class ResolverCollectionEffects { - - @Effect() - loadResolvers$ = this.actions$.pipe( - ofType(ResolverCollectionActionTypes.LOAD_RESOLVER_REQUEST), - switchMap(() => - this.descriptorService - .query() - .pipe( - map(descriptors => new LoadResolverSuccess(descriptors)), - catchError(error => of(new LoadResolverError(error))) - ) - ) - ); - - @Effect() - updateResolver$ = this.actions$.pipe( - ofType(ResolverCollectionActionTypes.UPDATE_RESOLVER_REQUEST), - map(action => action.payload), - switchMap(provider => { - return this.descriptorService - .update(removeNulls(provider)) - .pipe( - map(p => new UpdateResolverSuccess({ - id: p.id, - changes: p - })), - catchError(err => { - if (err.status === 409) { - return of(new UpdateResolverConflict(provider)); - } - return of(new UpdateResolverFail({ - errorCode: err.status, - errorMessage: `${err.statusText} - ${err.message}` - })); - }) - ); - }) - ); - - @Effect() - updateResolverSavingOnRequest$ = this.actions$.pipe( - ofType(ResolverCollectionActionTypes.UPDATE_RESOLVER_REQUEST), - map(action => new UpdateSaving(true)), - ); - - @Effect() - updateResolverSavingOnResult$ = this.actions$.pipe( - ofType( - ResolverCollectionActionTypes.UPDATE_RESOLVER_SUCCESS, - ResolverCollectionActionTypes.UPDATE_RESOLVER_FAIL - ), - map(action => new UpdateSaving(false)), - ); - - @Effect({ dispatch: false }) - updateResolverSuccessRedirect$ = this.actions$.pipe( - ofType(ResolverCollectionActionTypes.UPDATE_RESOLVER_SUCCESS), - map(action => action.payload), - tap(provider => this.router.navigate(['metadata', 'resolver', provider.id, 'configuration'])) - ); - - @Effect() - updateResolverFailNotification$ = this.actions$.pipe( - ofType(ResolverCollectionActionTypes.UPDATE_RESOLVER_FAIL), - map(action => action.payload), - withLatestFrom(this.store.select(fromI18n.getMessages)), - map(([error, messages]) => new AddNotification( - new Notification( - NotificationType.Danger, - `${error.errorCode}: ${this.i18nService.translate(error.errorMessage, null, messages)}`, - 8000 - ) - )) - ); - - @Effect() - selectResolver$ = this.actions$.pipe( - ofType(ResolverCollectionActionTypes.SELECT), - map(action => action.payload), - switchMap(id => - this.descriptorService - .find(id) - .pipe( - map(p => new SelectResolverSuccess(p)) - ) - ) - ); - - @Effect() - addResolverRequest$ = this.actions$.pipe( - ofType(ResolverCollectionActionTypes.ADD_RESOLVER), - map(action => action.payload), - map(provider => { - return ({ - ...provider, - relyingPartyOverrides: removeNulls(provider.relyingPartyOverrides) - }); - }), - switchMap(provider => - this.descriptorService - .save(provider) - .pipe( - map(p => new AddResolverSuccess(p)), - catchError(() => of(new AddResolverFail(provider))) - ) - ) - ); - - @Effect({ dispatch: false }) - addResolverSuccessRedirect$ = this.actions$.pipe( - ofType(ResolverCollectionActionTypes.ADD_RESOLVER_SUCCESS), - map(action => action.payload), - tap(provider => this.router.navigate(['dashboard'])) - ); - - @Effect() - addResolverSuccessRemoveDraft$ = this.actions$.pipe( - ofType(ResolverCollectionActionTypes.ADD_RESOLVER_SUCCESS), - map(action => action.payload), - map(provider => { - return new draftActions.RemoveDraftRequest(provider); - }) - ); - - @Effect() - addResolverFailNotification$ = this.actions$.pipe( - ofType(ResolverCollectionActionTypes.ADD_RESOLVER_FAIL), - map(action => action.payload), - withLatestFrom(this.store.select(fromI18n.getMessages)), - map(([error, messages]) => new AddNotification( - new Notification( - NotificationType.Danger, - `${error.errorCode}: ${this.i18nService.translate(error.errorMessage, null, messages)}`, - 8000 - ) - )) - ); - - @Effect() - uploadResolverRequest$ = this.actions$.pipe( - ofType(ResolverCollectionActionTypes.UPLOAD_RESOLVER_REQUEST), - map(action => action.payload), - switchMap(file => - this.descriptorService - .upload(file.name, file.body) - .pipe( - map(p => new AddResolverSuccess(p)), - catchError((error) => of(new AddResolverFail(error))) - ) - ) - ); - - @Effect() - createResolverFromUrlRequest$ = this.actions$.pipe( - ofType(ResolverCollectionActionTypes.CREATE_RESOLVER_FROM_URL_REQUEST), - map(action => action.payload), - switchMap(file => - this.descriptorService - .createFromUrl(file.name, file.url) - .pipe( - map(p => new AddResolverSuccess(p)), - catchError((error) => of(new AddResolverFail(error))) - ) - ) - ); - - @Effect() - removeResolver$ = this.actions$.pipe( - ofType(ResolverCollectionActionTypes.REMOVE_RESOLVER), - map(action => action.payload), - switchMap(entity => - this.descriptorService - .remove(entity) - .pipe( - map(p => new RemoveResolverSuccess(entity)), - catchError(err => of(new RemoveResolverFail(err))) - ) - ) - ); - - constructor( - private descriptorService: ResolverService, - private actions$: Actions, - private router: Router, - private store: Store, - private i18nService: I18nService - ) { } -} /* istanbul ignore next */ diff --git a/ui/src/app/metadata/resolver/effect/copy.effect.ts b/ui/src/app/metadata/resolver/effect/copy.effect.ts deleted file mode 100644 index d7b9bf385..000000000 --- a/ui/src/app/metadata/resolver/effect/copy.effect.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Router } from '@angular/router'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { Store } from '@ngrx/store'; -import { of } from 'rxjs'; -import { switchMap, map, withLatestFrom } from 'rxjs/operators'; - -import * as fromResolver from '../reducer'; - -import { - CopySourceActionUnion, - CopySourceActionTypes, - CreateResolverCopyRequest, - CreateResolverCopySuccess, - CreateResolverCopyError -} from '../action/copy.action'; -import { FileBackedHttpMetadataResolver } from '../../domain/entity'; -import { removeNulls } from '../../../shared/util'; -import { UpdateChangesRequest } from '../action/entity.action'; - - -@Injectable() -export class CopyResolverEffects { - - @Effect() - copyRequest$ = this.actions$.pipe( - ofType(CopySourceActionTypes.CREATE_RESOLVER_COPY_REQUEST), - map(action => action.payload), - withLatestFrom( - this.store.select(fromResolver.getAllResolvers), - this.store.select(fromResolver.getSectionsToCopy) - ), - switchMap(([attrs, providers, sections]) => { - const { serviceProviderName, entityId } = attrs; - const provider = providers.find(p => p.entityId === attrs.target); - const copied = removeNulls(sections.reduce((c, section) => ({ ...c, ...{[section]: provider[section] } }), {})); - const action = provider ? - new CreateResolverCopySuccess(new FileBackedHttpMetadataResolver({ - serviceProviderName, - entityId, - ...copied - })) : - new CreateResolverCopyError(new Error('Not found')); - return of(action); - })); - - @Effect() - changesOnCreation$ = this.actions$.pipe( - ofType(CopySourceActionTypes.CREATE_RESOLVER_COPY_SUCCESS), - map(action => action.payload), - map(entity => new UpdateChangesRequest(entity)) - ); - - @Effect({ dispatch: false }) - copyOnCreation$ = this.actions$.pipe( - ofType(CopySourceActionTypes.CREATE_RESOLVER_COPY_SUCCESS), - switchMap(() => this.router.navigate(['metadata', 'resolver', 'new', 'copy', 'confirm'])) - ); - - constructor( - private actions$: Actions, - private store: Store, - private router: Router - ) { } -} diff --git a/ui/src/app/metadata/resolver/effect/draft-collection.effect.spec.ts b/ui/src/app/metadata/resolver/effect/draft-collection.effect.spec.ts deleted file mode 100644 index 19760a1b4..000000000 --- a/ui/src/app/metadata/resolver/effect/draft-collection.effect.spec.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { TestBed } from '@angular/core/testing'; -import { Actions } from '@ngrx/effects'; -import { StoreModule } from '@ngrx/store'; -import { Router } from '@angular/router'; - -import { TestActions, getActions } from '../../../../testing/effect.util'; -import { DraftCollectionEffects, getPayload } from './draft-collection.effects'; -import { EntityDraftService } from '../../domain/service/draft.service'; -import { MetadataResolver } from '../../domain/model'; -import { RouterStub } from '../../../../testing/router.stub'; -import { AddDraftRequest } from '../action/draft.action'; -import { FileBackedHttpMetadataResolver } from '../../domain/entity'; -import * as fromRoot from '../../../app.reducer'; - - -describe('Draft Collection Effects', () => { - let effects: DraftCollectionEffects; - let draftService: any; - let actions$: TestActions; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - DraftCollectionEffects, - { - provide: EntityDraftService, - useValue: { - query: () => { }, - find: (id: string) => { }, - save: (provider: MetadataResolver) => { }, - remove: (provider: MetadataResolver) => { }, - update: (provider: MetadataResolver) => { } - }, - }, - { provide: Actions, useFactory: getActions }, - { provide: Router, useClass: RouterStub } - ], - imports: [ - StoreModule.forRoot(fromRoot.reducers) - ] - }); - - effects = TestBed.get(DraftCollectionEffects); - draftService = TestBed.get(EntityDraftService); - actions$ = TestBed.get(Actions); - }); - - describe('getPayload', () => { - it('should return the action payload', () => { - const payload = new FileBackedHttpMetadataResolver({ id: 'foo' }); - const action = new AddDraftRequest(payload); - expect(getPayload(action)).toEqual(payload); - }); - }); -}); diff --git a/ui/src/app/metadata/resolver/effect/draft-collection.effects.ts b/ui/src/app/metadata/resolver/effect/draft-collection.effects.ts deleted file mode 100644 index 707573dd5..000000000 --- a/ui/src/app/metadata/resolver/effect/draft-collection.effects.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { Router } from '@angular/router'; - -import { of } from 'rxjs'; -import { switchMap, map, catchError, tap } from 'rxjs/operators'; - -import { - DraftActionTypes, - SelectDraftRequest, - SelectDraftError, - SelectDraftSuccess -} from '../action/draft.action'; -import * as actions from '../action/draft.action'; -import { EntityDraftService } from '../../domain/service/draft.service'; -import * as fromResolver from '../reducer'; -import { Store } from '@ngrx/store'; -import { MetadataResolver } from '../../domain/model'; - -export const getPayload = (action: any) => action.payload; - -/* istanbul ignore next */ -@Injectable() -export class DraftCollectionEffects { - - @Effect() - loadDrafts$ = this.actions$.pipe( - ofType(DraftActionTypes.LOAD_DRAFT_REQUEST), - switchMap(() => - this.draftService - .query() - .pipe( - map(descriptors => new actions.LoadDraftSuccess(descriptors)), - catchError(error => of(new actions.LoadDraftError(error))) - ) - ) - ); - - @Effect() - addDraft$ = this.actions$.pipe( - ofType(DraftActionTypes.ADD_DRAFT), - map(getPayload), - switchMap(provider => - this.draftService - .save(provider) - .pipe( - map(p => new actions.AddDraftSuccess(provider)) - ) - ) - ); - - @Effect() - addDraftSuccessReload$ = this.actions$.pipe( - ofType(DraftActionTypes.ADD_DRAFT_SUCCESS), - map(getPayload), - switchMap(provider => - this.draftService - .find(provider.entityId) - .pipe( - map(p => new actions.LoadDraftRequest()) - ) - ) - ); - - @Effect() - updateDraft$ = this.actions$.pipe( - ofType(DraftActionTypes.UPDATE_DRAFT_REQUEST), - map(getPayload), - switchMap(provider => { - return this.draftService - .update(provider) - .pipe( - map(p => new actions.UpdateDraftSuccess({ - id: p.id, - changes: p - })) - ); - }) - ); - - @Effect() - selectDraft$ = this.actions$.pipe( - ofType(DraftActionTypes.SELECT_REQUEST), - map(getPayload), - switchMap(id => - this.draftService - .find(id) - .pipe( - map(p => new SelectDraftSuccess(p.id)), - catchError(e => of(new SelectDraftError())) - ) - ) - ); - - @Effect() - selectDraftReload$ = this.actions$.pipe( - ofType(DraftActionTypes.SELECT_REQUEST), - map(getPayload), - map(id => new actions.LoadDraftRequest()) - ); - - @Effect() - removeDraft$ = this.actions$.pipe( - ofType(DraftActionTypes.REMOVE_DRAFT), - map(getPayload), - switchMap(provider => { - let hasEntityId = !!provider.entityId; - let prop = hasEntityId ? 'entityId' : 'id'; - let val = hasEntityId ? provider.entityId : provider.id; - return this.draftService.find(val, prop).pipe( - switchMap(selected => this.draftService.remove(selected)), - map(p => new actions.RemoveDraftSuccess(val)) - ); - }) - ); - @Effect() - removeDraftSuccessReload$ = this.actions$.pipe( - ofType(DraftActionTypes.REMOVE_DRAFT_SUCCESS), - map(action => new actions.LoadDraftRequest()) - ); - - constructor( - private draftService: EntityDraftService, - private actions$: Actions, - private router: Router, - private store: Store - ) { } -} /* istanbul ignore next */ diff --git a/ui/src/app/metadata/resolver/effect/entity.effect.ts b/ui/src/app/metadata/resolver/effect/entity.effect.ts deleted file mode 100644 index f869a55dc..000000000 --- a/ui/src/app/metadata/resolver/effect/entity.effect.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; - -import { switchMap, map, withLatestFrom, tap } from 'rxjs/operators'; - -import * as fromResolver from '../reducer'; -import * as fromRoot from '../../../app.reducer'; -import * as fromWizard from '../../../wizard/reducer'; - -import { - ResolverEntityActionTypes, - Clear, - Cancel, - UpdateChangesRequest, - UpdateChangesSuccess, - UpdateSaving -} from '../action/entity.action'; -import * as provider from '../action/collection.action'; - -import { CancelContentionAction, ContentionActionTypes, ShowContentionAction } from '../../../contention/action/contention.action'; - -import { ResolverCollectionActionTypes } from '../action/collection.action'; -import { ResolverService } from '../../domain/service/resolver.service'; -import { Router } from '@angular/router'; -import { Store } from '@ngrx/store'; -import { ContentionService } from '../../../contention/service/contention.service'; - -@Injectable() -export class EntityEffects { - - @Effect() - updateChanges$ = this.actions$.pipe( - ofType(ResolverEntityActionTypes.UPDATE_CHANGES_REQUEST), - map(action => action.payload), - withLatestFrom( - this.store.select(fromResolver.getEntityChanges) - ), - map(([changes, storedChanges]) => { - const update = { ...storedChanges, ...changes }; - return new UpdateChangesSuccess(update); - }) - ); - - @Effect({dispatch: false}) - cancelChanges$ = this.actions$.pipe( - ofType(ResolverEntityActionTypes.CANCEL), - map(() => new Clear()), - tap(() => this.router.navigate(['dashboard'])) - ); - - @Effect() - updateResolverSuccessClear$ = this.actions$.pipe( - ofType(ResolverCollectionActionTypes.UPDATE_RESOLVER_SUCCESS), - map(action => action.payload), - map(p => new Clear()) - ); - - @Effect() - openContention$ = this.actions$.pipe( - ofType(ResolverCollectionActionTypes.UPDATE_RESOLVER_CONFLICT), - map(action => action.payload), - withLatestFrom(this.store.select(fromResolver.getSelectedResolver)), - switchMap(([resolver, current]) => { - return this.service.find(resolver.id).pipe( - map(data => new ShowContentionAction(this.contentionService.getContention(current, resolver, data, { - resolve: (obj) => this.store.dispatch(new provider.UpdateResolverRequest(obj)), - reject: (obj) => this.gotoConfiguration(resolver.id) - }))) - ); - }) - ); - - @Effect() - $resetChangesOnContentionFail = this.actions$.pipe( - ofType(ContentionActionTypes.CANCEL_CONTENTION), - map(() => new UpdateSaving(false)) - ); - - constructor( - private store: Store, - private service: ResolverService, - private actions$: Actions, - private router: Router, - private contentionService: ContentionService - ) { } - - gotoConfiguration(id) { - this.store.dispatch(new Clear()); - this.router.navigate(['metadata', 'resolver', id, 'configuration']) - } -} diff --git a/ui/src/app/metadata/resolver/effect/search.effect.ts b/ui/src/app/metadata/resolver/effect/search.effect.ts deleted file mode 100644 index 734e143b9..000000000 --- a/ui/src/app/metadata/resolver/effect/search.effect.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { Store } from '@ngrx/store'; -import { of } from 'rxjs'; -import { map, switchMap, withLatestFrom } from 'rxjs/operators'; - -import { SearchActionTypes, SearchActionUnion, SearchIdsSuccess } from '../action/search.action'; -import * as fromResolver from '../reducer'; - -@Injectable() -export class SearchIdEffects { - - private dbounce = 500; - - @Effect() - searchEntityIds$ = this.actions$.pipe( - ofType(SearchActionTypes.SEARCH_IDS), - map(action => action.payload), - withLatestFrom(this.store.select(fromResolver.getAllEntityIds)), - map(([ query, ids ]) => { - if (!query) { return []; } - return ids.filter(e => this.matcher(e, query)); - }), - switchMap(entities => of(new SearchIdsSuccess(entities))) - ); - - matcher = (value, query) => value ? value.toLocaleLowerCase().match(query.toLocaleLowerCase()) : false; - - constructor( - private actions$: Actions, - private store: Store - ) { } -} diff --git a/ui/src/app/metadata/resolver/effect/wizard.effect.ts b/ui/src/app/metadata/resolver/effect/wizard.effect.ts deleted file mode 100644 index a8523d2c2..000000000 --- a/ui/src/app/metadata/resolver/effect/wizard.effect.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { map, filter, withLatestFrom } from 'rxjs/operators'; - -import { - Clear, - ResolverEntityActionTypes, - UpdateChangesSuccess -} from '../action/entity.action'; -import { - ResolverCollectionActionTypes, - AddResolverSuccess -} from '../action/collection.action'; -import { UpdateDraftRequest } from '../action/draft.action'; -import * as fromRoot from '../../../app.reducer'; -import { Store } from '@ngrx/store'; -import { getSelectedDraftId } from '../reducer'; - -@Injectable() -export class WizardEffects { - - @Effect() - updateResolver$ = this.actions$.pipe( - ofType(ResolverEntityActionTypes.UPDATE_CHANGES_SUCCESS), - map(action => action.payload), - filter(provider => !provider.createdDate), - withLatestFrom(this.store.select(getSelectedDraftId)), - map(([provider, id]) => { - return new UpdateDraftRequest({ id, ...provider }); - }) - ); - - @Effect() - addResolverSuccessDiscard$ = this.actions$.pipe( - ofType(ResolverCollectionActionTypes.ADD_RESOLVER_SUCCESS), - map(action => action.payload), - map(provider => new Clear()) - ); - - constructor( - private store: Store, - private actions$: Actions - ) { } -} diff --git a/ui/src/app/metadata/resolver/guard/copy-isset.guard.ts b/ui/src/app/metadata/resolver/guard/copy-isset.guard.ts deleted file mode 100644 index 88834e272..000000000 --- a/ui/src/app/metadata/resolver/guard/copy-isset.guard.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Injectable } from '@angular/core'; -import { - CanActivate, - Router, - ActivatedRouteSnapshot, - RouterStateSnapshot -} from '@angular/router'; -import { Store } from '@ngrx/store'; -import { Observable } from 'rxjs'; -import { map, tap } from 'rxjs/operators'; - -import * as fromProvider from '../reducer'; - -@Injectable() -export class CopyIsSetGuard implements CanActivate { - constructor( - private store: Store, - private router: Router - ) { } - - canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { - return this.store.select(fromProvider.getCopy).pipe( - map(copy => !!copy), - tap(isDefined => !isDefined ? this.router.navigate(['/new/copy']) : isDefined) - ); - } -} diff --git a/ui/src/app/metadata/resolver/reducer/collection.reducer.spec.ts b/ui/src/app/metadata/resolver/reducer/collection.reducer.spec.ts deleted file mode 100644 index 98aafb702..000000000 --- a/ui/src/app/metadata/resolver/reducer/collection.reducer.spec.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { reducer } from './collection.reducer'; -import * as fromCollection from './collection.reducer'; -import * as resolverActions from '../action/collection.action'; -import { MetadataResolver } from '../../domain/model'; - -let resolvers: MetadataResolver[] = [ - { id: '1', entityId: 'foo', serviceProviderName: 'bar', createdDate: 'Tue Apr 17 2018 13:33:54 GMT-0700 (MST)' } as MetadataResolver, - { id: '2', entityId: 'baz', serviceProviderName: 'fin', createdDate: 'Tue Apr 17 2018 13:34:07 GMT-0700 (MST)' } as MetadataResolver -], -snapshot: fromCollection.CollectionState = { - ids: [resolvers[0].id, resolvers[1].id], - entities: { - [resolvers[0].id]: resolvers[0], - [resolvers[1].id]: resolvers[1] - }, - selectedResolverId: null, - loading: false -}; - -describe('Resolver Reducer', () => { - const initialState: fromCollection.CollectionState = { - ids: [], - entities: {}, - selectedResolverId: null, - loading: false - }; - - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(undefined, {} as any); - - expect(result).toEqual(initialState); - }); - }); - - describe('Load Providers: Success', () => { - it('should add the loaded resolvers to the collection', () => { - const action = new resolverActions.LoadResolverSuccess(resolvers); - const result = reducer(initialState, action); - - expect(result).toEqual( - Object.assign({}, initialState, snapshot) - ); - }); - }); - - describe('Update Providers: Success', () => { - it('should update the draft of the specified id', () => { - let changes = { ...resolvers[1], serviceEnabled: true }, - expected = { - ids: [resolvers[0].id, resolvers[1].id], - entities: { - [resolvers[0].id]: resolvers[0], - [resolvers[1].id]: changes - }, - selectedResolverId: null - }; - const action = new resolverActions.UpdateResolverSuccess({id: changes.id, changes}); - const result = reducer({ ...snapshot }, action); - - expect(result).toEqual( - Object.assign({}, initialState, expected) - ); - }); - }); - - describe('Select Resolver', () => { - it('should update the selected draft id', () => { - let id = 'foo', - createdDate = new Date().toDateString(), - expected = { ...snapshot, selectedResolverId: id }; - const action = new resolverActions.SelectResolverSuccess({ id, createdDate } as MetadataResolver); - const result = reducer({ ...snapshot }, action); - - expect(result.selectedResolverId).toEqual(id); - expect(result.ids.length).toBe(3); - }); - }); -}); diff --git a/ui/src/app/metadata/resolver/reducer/collection.reducer.ts b/ui/src/app/metadata/resolver/reducer/collection.reducer.ts deleted file mode 100644 index 635142468..000000000 --- a/ui/src/app/metadata/resolver/reducer/collection.reducer.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { EntityState, EntityAdapter, createEntityAdapter } from '@ngrx/entity'; -import { MetadataResolver } from '../../domain/model'; -import { ResolverCollectionActionsUnion, ResolverCollectionActionTypes } from '../action/collection.action'; - -export interface CollectionState extends EntityState { - selectedResolverId: string | null; - loading: boolean; -} - -export function sortByDate(a: MetadataResolver, b: MetadataResolver): number { - return a.createdDate.localeCompare(b.createdDate); -} - -export const adapter: EntityAdapter = createEntityAdapter({ - sortComparer: sortByDate, - selectId: (model: MetadataResolver) => model.id -}); - -export const initialState: CollectionState = adapter.getInitialState({ - selectedResolverId: null, - loading: false -}); - -export function reducer(state = initialState, action: ResolverCollectionActionsUnion): CollectionState { - switch (action.type) { - case ResolverCollectionActionTypes.LOAD_RESOLVER_REQUEST: { - return { - ...state, - loading: true - }; - } - case ResolverCollectionActionTypes.LOAD_RESOLVER_SUCCESS: { - return adapter.addAll(action.payload, { - ...state, - loading: false, - selectedResolverId: state.selectedResolverId - }); - } - - case ResolverCollectionActionTypes.UPDATE_RESOLVER_SUCCESS: { - const removed = adapter.removeOne(action.payload.id as string, state); - const addBack = adapter.upsertOne(action.payload.changes as MetadataResolver, removed); - return addBack; - } - - case ResolverCollectionActionTypes.SELECT_SUCCESS: { - return adapter.upsertOne(action.payload, { - ...state, - selectedResolverId: action.payload.id, - }); - } - - case ResolverCollectionActionTypes.LOAD_RESOLVER_ERROR: { - return adapter.removeAll({ - ...state, - loading: false - }); - } - - case ResolverCollectionActionTypes.REMOVE_RESOLVER_SUCCESS: { - return adapter.removeOne(action.payload, { - ...state - }); - } - - case ResolverCollectionActionTypes.CLEAR_SELECTION: { - return { - ...state, - selectedResolverId: null - }; - } - - default: { - return state; - } - } -} - -export const getSelectedResolverId = (state: CollectionState) => state.selectedResolverId; -export const { - selectIds: selectResolverIds, - selectEntities: selectResolverEntities, - selectAll: selectAllResolvers, - selectTotal: selectResolverTotal -} = adapter.getSelectors(); - -export const getResolversLoading = (state: CollectionState) => state.loading; diff --git a/ui/src/app/metadata/resolver/reducer/copy.reducer.spec.ts b/ui/src/app/metadata/resolver/reducer/copy.reducer.spec.ts deleted file mode 100644 index 304c1762c..000000000 --- a/ui/src/app/metadata/resolver/reducer/copy.reducer.spec.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { reducer } from './copy.reducer'; -import * as fromResolverCopy from './copy.reducer'; -import * as actions from '../action/copy.action'; -import * as fromCollection from '../action/collection.action'; -import { CopySourceActionTypes, CreateResolverCopyRequest } from '../action/copy.action'; -import { FileBackedHttpMetadataResolver } from '../../domain/entity/resolver/file-backed-http-metadata-resolver'; - -const snapshot: fromResolverCopy.CopyState = { ...fromResolverCopy.initialState }; - -describe('Resolver -> Copy Reducer', () => { - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(snapshot, {} as any); - expect(result).toEqual(snapshot); - }); - }); - - describe(`${CopySourceActionTypes.CREATE_RESOLVER_COPY_REQUEST} action`, () => { - it('should set properties on the state', () => { - const obj = { ...snapshot }; - const result = reducer(snapshot, new CreateResolverCopyRequest(obj)); - - expect(result).toEqual(obj); - }); - }); - - describe(`${CopySourceActionTypes.CREATE_RESOLVER_COPY_SUCCESS} action`, () => { - it('should set properties on the state', () => { - const p = new FileBackedHttpMetadataResolver({}); - const obj = { ...snapshot }; - const result = reducer(snapshot, new actions.CreateResolverCopySuccess(p)); - - expect(result.provider).toBe(p); - }); - }); - - describe(`${CopySourceActionTypes.CREATE_RESOLVER_COPY_ERROR} action`, () => { - it('should set properties on the state', () => { - const p = new FileBackedHttpMetadataResolver({}); - const obj = { ...snapshot }; - const result = reducer(snapshot, new actions.CreateResolverCopyError(new Error())); - - expect(result.provider).toBeNull(); - }); - }); - - describe(`${CopySourceActionTypes.UPDATE_RESOLVER_COPY} action`, () => { - it('should set properties on the state', () => { - const obj = { ...snapshot, provider: new FileBackedHttpMetadataResolver({}) }; - const result = reducer(snapshot, new actions.UpdateResolverCopy({id: 'foo'})); - - expect(result.provider.id).toBe('foo'); - }); - }); - - describe(`${ fromCollection.ResolverCollectionActionTypes.ADD_RESOLVER } action`, () => { - it('should set properties on the state', () => { - const p = new FileBackedHttpMetadataResolver({}); - const obj = { ...snapshot, provider: p }; - const result = reducer(snapshot, new fromCollection.AddResolverRequest(p)); - - expect(result.saving).toBe(true); - }); - }); - - describe(`${fromCollection.ResolverCollectionActionTypes.ADD_RESOLVER_SUCCESS} action`, () => { - it('should set properties on the state', () => { - const p = new FileBackedHttpMetadataResolver({}); - const obj = { ...snapshot, provider: p }; - const result = reducer(snapshot, new fromCollection.AddResolverSuccess(p)); - - expect(result.saving).toBe(false); - }); - }); - - describe(`${fromCollection.ResolverCollectionActionTypes.ADD_RESOLVER_FAIL} action`, () => { - it('should set properties on the state', () => { - const p = new FileBackedHttpMetadataResolver({}); - const obj = { ...snapshot, provider: p }; - const result = reducer(snapshot, new fromCollection.AddResolverFail(p)); - - expect(result.saving).toBe(false); - }); - }); - - describe(`getCopy selector function`, () => { - it('should return the entire copy object', () => { - expect(fromResolverCopy.getCopy(snapshot)).toBe(snapshot.provider); - }); - }); - describe(`getEntityId selector function`, () => { - it('should return the entityId property', () => { - expect(fromResolverCopy.getEntityId(snapshot)).toBe(snapshot.entityId); - }); - }); - describe(`getName selector function`, () => { - it('should return the serviceProviderName property', () => { - expect(fromResolverCopy.getName(snapshot)).toBe(snapshot.serviceProviderName); - }); - }); - describe(`getTarget selector function`, () => { - it('should return the target property', () => { - expect(fromResolverCopy.getTarget(snapshot)).toBe(snapshot.target); - }); - }); -}); diff --git a/ui/src/app/metadata/resolver/reducer/copy.reducer.ts b/ui/src/app/metadata/resolver/reducer/copy.reducer.ts deleted file mode 100644 index 5b67f2e97..000000000 --- a/ui/src/app/metadata/resolver/reducer/copy.reducer.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { CopySourceActionTypes, CopySourceActionUnion } from '../action/copy.action'; -import { MetadataResolver } from '../../domain/model'; -import { ResolverCollectionActionsUnion, ResolverCollectionActionTypes } from '../action/collection.action'; - -export interface CopyState { - target: string; - serviceProviderName: string; - entityId: string; - provider: MetadataResolver; - saving: boolean; - sections: string[]; -} - -export const initialState: CopyState = { - target: null, - serviceProviderName: null, - entityId: null, - provider: null, - saving: false, - sections: [] -}; - -export function reducer(state = initialState, action: CopySourceActionUnion | ResolverCollectionActionsUnion): CopyState { - switch (action.type) { - case CopySourceActionTypes.UPDATE_RESOLVER_COPY_SECTIONS: { - return { - ...state, - sections: [ - ...action.payload - ] - }; - } - case CopySourceActionTypes.CREATE_RESOLVER_COPY_REQUEST: { - return { - ...state, - ...action.payload - }; - } - case CopySourceActionTypes.CREATE_RESOLVER_COPY_SUCCESS: { - return { - ...state, - provider: action.payload - }; - } - case CopySourceActionTypes.UPDATE_RESOLVER_COPY: { - return { - ...state, - provider: { - ...state.provider, - ...action.payload - } - }; - } - case ResolverCollectionActionTypes.ADD_RESOLVER: { - return { - ...state, - saving: true - }; - } - case ResolverCollectionActionTypes.ADD_RESOLVER_FAIL: - case ResolverCollectionActionTypes.ADD_RESOLVER_SUCCESS: { - return { - ...initialState - }; - } - default: { - return state; - } - } -} - -export const getTarget = (state: CopyState) => state.target; -export const getName = (state: CopyState) => state.serviceProviderName; -export const getEntityId = (state: CopyState) => state.entityId; -export const getCopy = (state: CopyState) => state.provider; -export const getCopyAttributes = (state: CopyState) => ({ - entityId: state.entityId, - serviceProviderName: state.serviceProviderName, - target: state.target -}); -export const getCopySections = (state: CopyState) => state.sections; -export const getSaving = (state: CopyState) => state.saving; diff --git a/ui/src/app/metadata/resolver/reducer/draft.reducer.spec.ts b/ui/src/app/metadata/resolver/reducer/draft.reducer.spec.ts deleted file mode 100644 index 880c70c6a..000000000 --- a/ui/src/app/metadata/resolver/reducer/draft.reducer.spec.ts +++ /dev/null @@ -1,114 +0,0 @@ -import { reducer, adapter } from './draft.reducer'; -import * as fromDrafts from './draft.reducer'; -import * as draftActions from '../action/draft.action'; -import { MetadataResolver } from '../../domain/model'; - -let drafts: MetadataResolver[] = [ - { id: 'foo', serviceProviderName: 'bar' } as MetadataResolver, - { id: 'baz', serviceProviderName: 'fin' } as MetadataResolver - ], - snapshot: fromDrafts.DraftState = { - ids: [drafts[0].id, drafts[1].id], - entities: { - [drafts[0].id]: drafts[0], - [drafts[1].id]: drafts[1] - }, - selectedDraftId: null - }; - -describe('Draft Reducer', () => { - const initialState: fromDrafts.DraftState = { - ids: [], - entities: {}, - selectedDraftId: null - }; - - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(undefined, {} as any); - - expect(result).toEqual(initialState); - }); - }); - - describe('Load Drafts: Success', () => { - it('should add the loaded drafts to the collection', () => { - const action = new draftActions.LoadDraftSuccess(drafts); - const result = reducer(initialState, action); - - expect(result).toEqual( - Object.assign({}, initialState, snapshot) - ); - }); - }); - - describe('Update Drafts: Success', () => { - it('should update the draft of the specified entityId', () => { - let changes = { ...drafts[1], serviceProviderName: 'foo' }, - expected = { - ids: [drafts[0].id, drafts[1].entityId], - entities: { - [drafts[0].id]: drafts[0], - [drafts[1].id]: changes - }, - selectedDraftId: null - }; - spyOn(adapter, 'updateOne'); - const action = new draftActions.UpdateDraftSuccess({id: changes.id, changes }); - const result = reducer({ ...snapshot }, action); - - expect(adapter.updateOne).toHaveBeenCalled(); - }); - - it('should return state if the entityId is not found', () => { - let changes = { ...drafts[1], serviceEnabled: true, id: 'bar' }; - const action = new draftActions.UpdateDraftSuccess({id: changes.id, changes}); - const result = reducer({ ...snapshot }, action); - - expect(result).toEqual(snapshot); - }); - }); - - describe('Select Draft', () => { - it('should update the selected draft id', () => { - let id = 'foo', - expected = { ...snapshot, selectedDraftId: id }; - const action = new draftActions.SelectDraftSuccess(id); - const result = reducer({ ...snapshot }, action); - - expect(result).toEqual( - { ...initialState, ...expected } - ); - }); - }); - describe('Selectors', () => { - it('getEntities should return all drafts', () => { - expect(fromDrafts.selectDraftEntities({ - ids: [], - entities: {}, - })).toEqual({}); - expect(fromDrafts.selectDraftEntities(snapshot)).toEqual(snapshot.entities); - }); - - it('getIds should return all Ids', () => { - expect(fromDrafts.selectDraftIds({ - ids: [], - entities: {} - })).toEqual([]); - expect(fromDrafts.selectDraftIds(snapshot)).toEqual(snapshot.ids); - }); - - it('getSelectedDraftId should return the selected entityId', () => { - expect(fromDrafts.getSelectedDraftId({ - ids: [], - entities: {}, - selectedDraftId: null, - })).toBeNull(); - expect(fromDrafts.getSelectedDraftId(Object.assign({}, snapshot, { selectedDraftId: 'foo' }))).toEqual('foo'); - }); - - it('getAll return all entities as an array', () => { - expect(fromDrafts.selectAllDrafts(snapshot)).toEqual(drafts); - }); - }); -}); diff --git a/ui/src/app/metadata/resolver/reducer/draft.reducer.ts b/ui/src/app/metadata/resolver/reducer/draft.reducer.ts deleted file mode 100644 index 0cf30d153..000000000 --- a/ui/src/app/metadata/resolver/reducer/draft.reducer.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { EntityState, EntityAdapter, createEntityAdapter } from '@ngrx/entity'; - -import { MetadataResolver } from '../../domain/model'; -import { DraftActionsUnion, DraftActionTypes } from '../action/draft.action'; - -export interface DraftState extends EntityState { - selectedDraftId: string | null; -} - -export const adapter: EntityAdapter = createEntityAdapter({ - selectId: (model: MetadataResolver) => model.id -}); - -export const initialState: DraftState = adapter.getInitialState({ - selectedDraftId: null, -}); - -export function reducer(state = initialState, action: DraftActionsUnion): DraftState { - switch (action.type) { - - case DraftActionTypes.LOAD_DRAFT_SUCCESS: { - return adapter.setAll(action.payload, { - ...state, - selectedDraftId: state.selectedDraftId, - }); - } - - case DraftActionTypes.UPDATE_DRAFT_SUCCESS: { - return adapter.updateOne(action.payload, state); - } - - case DraftActionTypes.REMOVE_DRAFT_SUCCESS: { - return adapter.removeOne(action.payload, state); - } - - case DraftActionTypes.SELECT_SUCCESS: { - return { - ...state, - selectedDraftId: action.payload, - }; - } - - default: { - return state; - } - } -} - -export const getSelectedDraftId = (state: DraftState) => state.selectedDraftId; -export const { - selectIds: selectDraftIds, - selectEntities: selectDraftEntities, - selectAll: selectAllDrafts, - selectTotal: selectDraftTotal -} = adapter.getSelectors(); diff --git a/ui/src/app/metadata/resolver/reducer/entity.reducer.spec.ts b/ui/src/app/metadata/resolver/reducer/entity.reducer.spec.ts deleted file mode 100644 index acde92bc1..000000000 --- a/ui/src/app/metadata/resolver/reducer/entity.reducer.spec.ts +++ /dev/null @@ -1,116 +0,0 @@ -import { reducer } from './entity.reducer'; -import * as fromEntity from './entity.reducer'; -import { - UpdateStatus, - Clear, - UpdateChangesSuccess -} from '../action/entity.action'; -import { MetadataResolver } from '../../domain/model'; - -describe('Entity Reducer', () => { - const initialState: fromEntity.EntityState = { - saving: false, - status: {}, - changes: {} as MetadataResolver - }; - - const changes = { - id: 'foo', - serviceProviderName: 'bar' - } as MetadataResolver; - - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(undefined, {} as any); - expect(result).toEqual(initialState); - }); - }); - - describe('Entity Update Status', () => { - it('should update the status of the provided form', () => { - const status = { organization: 'VALID' }; - const action = new UpdateStatus(status); - const result = reducer(initialState, action); - expect(result).toEqual( - { - ...initialState, - ...{ status } - } - ); - }); - }); - - describe('Entity Update Changes', () => { - it('should add changes of the provided form', () => { - const action = new UpdateChangesSuccess(changes); - const result = reducer(initialState, action); - expect(result).toEqual( - { - ...initialState, - ...{ changes } - } - ); - }); - }); - - describe('Entity Clear', () => { - it('should remove changes', () => { - const action = new Clear(); - const result = reducer(initialState, action); - expect(result).toEqual( - Object.assign({}, initialState, { - changes: initialState.changes - }) - ); - }); - }); - - describe('Selectors', () => { - it('should aggregate the status', () => { - expect(fromEntity.isEntitySaving({ - saving: false, - changes: {} as MetadataResolver, - status: { - organization: 'INVALID', - foo: 'VALID' - } - })).toBe(false); - }); - - it('should calculate a saved status based on changes', () => { - expect(fromEntity.isEntitySaved({ - saving: false, - changes: {} as MetadataResolver, - status: {} - })).toBe(true); - - expect(fromEntity.isEntitySaved({ - saving: false, - changes: {organization: {}, id: 'bar'} as MetadataResolver, - status: {} - })).toBe(false); - }); - - it('should return current changes', () => { - expect(fromEntity.getChanges({ - saving: false, - changes: {} as MetadataResolver, - status: {} - })).toEqual({} as MetadataResolver); - }); - - it('should return `saving` status', () => { - expect(fromEntity.isEntitySaving({ - saving: false, - changes: {} as MetadataResolver, - status: {} - })).toBe(false); - - expect(fromEntity.isEntitySaving({ - saving: true, - changes: {} as MetadataResolver, - status: {} - })).toBe(true); - }); - }); -}); diff --git a/ui/src/app/metadata/resolver/reducer/entity.reducer.ts b/ui/src/app/metadata/resolver/reducer/entity.reducer.ts deleted file mode 100644 index 158ed193c..000000000 --- a/ui/src/app/metadata/resolver/reducer/entity.reducer.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { MetadataResolver } from '../../domain/model'; -import * as entity from '../action/entity.action'; -import { ResolverEntityActionTypes, ResolverEntityActionUnion } from '../action/entity.action'; - -export interface EntityState { - saving: boolean; - status: { [key: string]: string }; - changes: MetadataResolver; -} - -export const initialState: EntityState = { - saving: false, - status: {}, - changes: {} as MetadataResolver -}; - -export function reducer(state = initialState, action: ResolverEntityActionUnion): EntityState { - switch (action.type) { - case ResolverEntityActionTypes.UPDATE_CHANGES_SUCCESS: { - return { - ...state, - changes: { ...action.payload } - }; - } - case ResolverEntityActionTypes.UPDATE_STATUS: { - return { - ...state, - status: { ...state.status, ...action.payload } - }; - } - case ResolverEntityActionTypes.UPDATE_SAVING: { - return { - ...state, - saving: action.payload - }; - } - case ResolverEntityActionTypes.CLEAR: - return { - ...state, - changes: { ...initialState.changes } - }; - default: { - return state; - } - } -} - -export const isEntitySaved = (state: EntityState) => !Object.keys(state.changes).length; -export const getChanges = (state: EntityState) => state.changes; -export const isEntitySaving = (state: EntityState) => state.saving; -export const getFormStatus = (state: EntityState) => state.status; - -export const isEntityValid = (state: EntityState) => - !Object.keys(state.status).some(key => state.status[key] === ('INVALID')); -export const getInvalidForms = (state: EntityState) => - Object.keys(state.status).filter(key => state.status[key] === 'INVALID'); diff --git a/ui/src/app/metadata/resolver/reducer/index.spec.ts b/ui/src/app/metadata/resolver/reducer/index.spec.ts deleted file mode 100644 index 5a7cc66ee..000000000 --- a/ui/src/app/metadata/resolver/reducer/index.spec.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { - getResolverEntityIdCollectionFn, - getAllOtherIdsFn, - getResolverUniqueValidEntityIdsFn -} from './index'; - -describe('Resolver Reducer selectors', () => { - describe(`getResolverEntityIdCollectionFn function`, () => { - it('should return a list of entity ids', () => { - - const resolvers = [ - { - entityId: 'foo' - }, - { - entityId: 'bar' - }, - { - entityId: 'baz' - } - ]; - - expect(getResolverEntityIdCollectionFn(resolvers)).toEqual(['foo', 'bar', 'baz']); - }); - }); - - describe('getResolverUniqueValidEntityIdsFn function', () => { - it('should return a unique and valid list of ids from the provided list', () => { - const ids = ['foo', undefined, undefined, 'foo', 'bar']; - expect(getResolverUniqueValidEntityIdsFn(ids)).toEqual(['foo', 'bar']); - }); - }); - - describe('getAllOtherIdsFn function', () => { - it('should return a list of ids without the selected', () => { - const ids = ['foo', 'bar', 'baz']; - expect(getAllOtherIdsFn(ids, 'foo')).toEqual(['bar', 'baz']); - }); - }); -}); diff --git a/ui/src/app/metadata/resolver/reducer/index.ts b/ui/src/app/metadata/resolver/reducer/index.ts deleted file mode 100644 index d7ae921b2..000000000 --- a/ui/src/app/metadata/resolver/reducer/index.ts +++ /dev/null @@ -1,142 +0,0 @@ -import { createSelector, createFeatureSelector } from '@ngrx/store'; -import * as fromRoot from '../../../app.reducer'; -import * as fromEntity from './entity.reducer'; -import * as fromSearch from './search.reducer'; -import * as fromCopy from './copy.reducer'; -import * as fromDraft from './draft.reducer'; -import * as fromCollection from './collection.reducer'; -import * as fromWizard from '../../../wizard/reducer'; - -import { combineAllFn, getEntityIdsFn, getInCollectionFn, doesExistFn } from '../../domain/domain.util'; -import { getConfigurationSectionsFn } from '../../configuration/reducer/utilities'; - -export interface ResolverState { - entity: fromEntity.EntityState; - copy: fromCopy.CopyState; - search: fromSearch.SearchState; - draft: fromDraft.DraftState; - collection: fromCollection.CollectionState; -} - -export const reducers = { - copy: fromCopy.reducer, - entity: fromEntity.reducer, - collection: fromCollection.reducer, - draft: fromDraft.reducer, - search: fromSearch.reducer -}; - -export interface State extends fromRoot.State { - 'resolver': ResolverState; -} - -export const getResolverState = createFeatureSelector('resolver'); - -export const getCollectionStateFn = (state: ResolverState) => state.collection; -export const getDraftStateFn = (state: ResolverState) => state.draft; -export const getEntityStateFn = (state: ResolverState) => state.entity; -export const getCopyStateFn = (state: ResolverState) => state.copy; -export const getSearchStateFn = (state: ResolverState) => state.search; - -export const getCollectionState = createSelector(getResolverState, getCollectionStateFn); -export const getDraftState = createSelector(getResolverState, getDraftStateFn); -export const getEntityState = createSelector(getResolverState, getEntityStateFn); -export const getCopyState = createSelector(getResolverState, getCopyStateFn); -export const getSearchState = createSelector(getResolverState, getSearchStateFn); - -/* -Entity State -*/ - -export const getEntityIsValid = createSelector(getEntityState, fromEntity.isEntityValid); -export const getEntityIsSaved = createSelector(getEntityState, fromEntity.isEntitySaved); -export const getEntityChanges = createSelector(getEntityState, fromEntity.getChanges); -export const getEntityIsSaving = createSelector(getEntityState, fromEntity.isEntitySaving); -export const getFormStatus = createSelector(getEntityState, fromEntity.getFormStatus); -export const getInvalidEntityForms = createSelector(getEntityState, fromEntity.getInvalidForms); - -/* -Copy State -*/ - -export const getCopy = createSelector(getCopyState, fromCopy.getCopy); -export const getSaving = createSelector(getCopyState, fromCopy.getSaving); -export const getAttributes = createSelector(getCopyState, fromCopy.getCopyAttributes); -export const getSectionsToCopy = createSelector(getCopyState, fromCopy.getCopySections); - -/* -Search State -*/ - -export const getSearchResults = createSelector(getSearchState, fromSearch.getMatches); -export const getSearchQuery = createSelector(getSearchState, fromSearch.getQuery); -export const getSearchLoading = createSelector(getSearchState, fromSearch.getSearching); - -/* -Collection State -*/ - -export const getResolverEntities = createSelector(getCollectionState, fromCollection.selectResolverEntities); -export const getSelectedResolverId = createSelector(getCollectionState, fromCollection.getSelectedResolverId); -export const getResolverIds = createSelector(getCollectionState, fromCollection.selectResolverIds); - -export const getResolverCollection = createSelector(getCollectionState, getResolverIds, fromCollection.selectAllResolvers); -export const getResolverEntityIdCollectionFn = (resolvers) => resolvers.map(r => r.entityId); -export const getResolverEntityIdCollection = createSelector(getResolverCollection, getResolverEntityIdCollectionFn); -export const getSelectedResolver = createSelector(getResolverEntities, getSelectedResolverId, getInCollectionFn); -export const getResolversLoading = createSelector(getCollectionState, fromCollection.getResolversLoading); - - -/* -Draft State -*/ - -export const getDraftEntities = createSelector(getDraftState, fromDraft.selectDraftEntities); -export const getDraftIds = createSelector(getDraftState, fromDraft.selectDraftIds); -export const getDraftCollection = createSelector(getDraftState, getDraftIds, fromDraft.selectAllDrafts); -export const getSelectedDraftId = createSelector(getDraftState, fromDraft.getSelectedDraftId); - -export const getSelectedDraft = createSelector(getDraftEntities, getSelectedDraftId, getInCollectionFn); -export const isSelectedResolverInCollection = createSelector(getResolverIds, getSelectedResolverId, doesExistFn); -export const isSelectedDraftInCollection = createSelector(getDraftIds, getSelectedDraftId, doesExistFn); - -/* -Combine Drafts and Resolvers -*/ - -export const getAllResolvers = createSelector(getDraftCollection, getResolverCollection, combineAllFn); -export const getAllResolverIds = createSelector(getDraftIds, getResolverIds, combineAllFn); - -export const getAllEntityIds = createSelector(getAllResolvers, getEntityIdsFn); -export const getResolverUniqueValidEntityIdsFn = (ids) => [...new Set(ids.filter(id => !!id))]; -export const getValidEntityIds = createSelector(getResolverEntityIdCollection, getResolverUniqueValidEntityIdsFn); - -export const getAllOtherIdsFn = (ids, selected) => ids.filter(id => id !== selected); - -export const getAllOtherIds = createSelector( - getAllResolvers, - getSelectedResolverId, - getAllOtherIdsFn -); - -export const getDraftModelWithChanges = createSelector( - fromWizard.getSchema, - fromWizard.getModel, - getSelectedDraft, - getEntityChanges, - fromWizard.getWizardDefinition, - (schema, wizardModel, selectedDraft, changes, definition) => definition.formatter({ - ...wizardModel, - ...selectedDraft, - ...changes - }) -); - -export const getDraftModelList = createSelector(getDraftModelWithChanges, (model) => [model]); - -export const getResolverConfiguration = createSelector( - getDraftModelList, - fromWizard.getWizardDefinition, - fromWizard.getProcessedSchema, - getConfigurationSectionsFn -); diff --git a/ui/src/app/metadata/resolver/reducer/search.reducer.spec.ts b/ui/src/app/metadata/resolver/reducer/search.reducer.spec.ts deleted file mode 100644 index eefce726d..000000000 --- a/ui/src/app/metadata/resolver/reducer/search.reducer.spec.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { reducer } from './search.reducer'; -import * as fromProviderSearch from './search.reducer'; -import { SearchActionTypes, SearchIds, SearchIdsSuccess, SearchIdsError } from '../action/search.action'; - -const snapshot: fromProviderSearch.SearchState = { - matches: [], - query: '', - searching: false -}; - -describe('Resolver -> Search Reducer', () => { - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(snapshot, {} as any); - expect(result).toEqual(snapshot); - }); - }); - - describe(`${SearchActionTypes.SEARCH_IDS} action`, () => { - it('should set properties on the state', () => { - const query = 'foo'; - const result = reducer(snapshot, new SearchIds(query)); - - expect(result).toEqual({ - ...snapshot, - query, - searching: true - }); - }); - }); - - describe(`${SearchActionTypes.SEARCH_IDS_SUCCESS} action`, () => { - it('should set properties on the state', () => { - const matches = ['foo', 'bar', 'baz']; - const result = reducer(snapshot, new SearchIdsSuccess(matches)); - - expect(result).toEqual({ - ...snapshot, - matches, - searching: false - }); - }); - }); - - describe(`${SearchActionTypes.SEARCH_IDS_ERROR} action`, () => { - it('should set properties on the state', () => { - const result = reducer(snapshot, new SearchIdsError(new Error())); - - expect(result).toEqual({ - ...snapshot, - matches: [], - searching: false - }); - }); - }); - - describe(`getQuery selector function`, () => { - it('should return the query property', () => { - expect(fromProviderSearch.getQuery(snapshot)).toBe(snapshot.query); - }); - }); - describe(`getMatches selector function`, () => { - it('should return the matches property', () => { - expect(fromProviderSearch.getMatches(snapshot)).toBe(snapshot.matches); - }); - }); - describe(`getSearching selector function`, () => { - it('should return the searching property', () => { - expect(fromProviderSearch.getSearching(snapshot)).toBe(snapshot.searching); - }); - }); -}); diff --git a/ui/src/app/metadata/resolver/reducer/search.reducer.ts b/ui/src/app/metadata/resolver/reducer/search.reducer.ts deleted file mode 100644 index e047ea99b..000000000 --- a/ui/src/app/metadata/resolver/reducer/search.reducer.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { SearchActionTypes, SearchActionUnion } from '../action/search.action'; - -export interface SearchState { - query: string; - matches: string[]; - searching: boolean; -} - -export const initialState: SearchState = { - query: '', - matches: [], - searching: false -}; - -export function reducer(state = initialState, action: SearchActionUnion): SearchState { - switch (action.type) { - case SearchActionTypes.SEARCH_IDS: { - return { - ...state, - query: action.payload, - searching: true - }; - } - case SearchActionTypes.SEARCH_IDS_SUCCESS: { - return { - ...state, - searching: false, - matches: action.payload - }; - } - case SearchActionTypes.SEARCH_IDS_ERROR: { - return { - ...state, - searching: false, - matches: [] - }; - } - default: { - return state; - } - } -} - -export const getQuery = (state: SearchState) => state.query; -export const getMatches = (state: SearchState) => state.matches; -export const getSearching = (state: SearchState) => state.searching; diff --git a/ui/src/app/metadata/resolver/resolver.component.ts b/ui/src/app/metadata/resolver/resolver.component.ts deleted file mode 100644 index dee3e3f75..000000000 --- a/ui/src/app/metadata/resolver/resolver.component.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Component, ChangeDetectionStrategy } from '@angular/core'; -import { Store } from '@ngrx/store'; -import { Observable } from 'rxjs'; -import { LoadResolverRequest } from './action/collection.action'; -import * as fromRoot from '../../app.reducer'; -import * as fromResolver from './reducer'; - -@Component({ - selector: 'metadata-resolver-page', - changeDetection: ChangeDetectionStrategy.OnPush, - template: ` - - `, - styleUrls: [] -}) -export class MetadataResolverPageComponent { - - loading$: Observable = this.store.select(fromResolver.getResolversLoading); - - constructor( - private store: Store - ) { - this.store.dispatch(new LoadResolverRequest()); - } -} diff --git a/ui/src/app/metadata/resolver/resolver.module.ts b/ui/src/app/metadata/resolver/resolver.module.ts deleted file mode 100644 index 362d67485..000000000 --- a/ui/src/app/metadata/resolver/resolver.module.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { NgModule, ModuleWithProviders } from '@angular/core'; -import { RouterModule } from '@angular/router'; -import { CommonModule } from '@angular/common'; -import { HttpClientModule } from '@angular/common/http'; -import { ReactiveFormsModule, FormsModule } from '@angular/forms'; -import { StoreModule } from '@ngrx/store'; -import { EffectsModule } from '@ngrx/effects'; -import { NgbDropdownModule, NgbPopoverModule, NgbModalModule } from '@ng-bootstrap/ng-bootstrap'; - -import { NewResolverComponent } from './container/new-resolver.component'; -import { UploadResolverComponent } from './container/upload-resolver.component'; -import { CopyResolverComponent } from './container/copy-resolver.component'; -import { SharedModule } from '../../shared/shared.module'; -import { SearchIdEffects } from './effect/search.effect'; -import * as fromResolver from './reducer'; -import { ConfirmCopyComponent } from './container/confirm-copy.component'; -import { CopyIsSetGuard } from './guard/copy-isset.guard'; -import { CopyResolverEffects } from './effect/copy.effect'; -import { DomainModule } from '../domain/domain.module'; -import { ResolverWizardComponent } from './container/resolver-wizard.component'; -import { ResolverCollectionEffects } from './effect/collection.effects'; -import { DraftCollectionEffects } from './effect/draft-collection.effects'; -import { WizardEffects } from './effect/wizard.effect'; -import { I18nModule } from '../../i18n/i18n.module'; -import { MetadataSourceWizard } from '../domain/model/wizards/metadata-source-wizard'; -import { METADATA_SOURCE_WIZARD, METADATA_SOURCE_EDITOR } from './wizard-definition'; -import { EntityEffects } from './effect/entity.effect'; -import { ResolverWizardStepComponent } from './container/resolver-wizard-step.component'; -import { WizardModule } from '../../wizard/wizard.module'; -import { FormModule } from '../../schema-form/schema-form.module'; -import { ResolverEditComponent } from './container/resolver-edit.component'; -import { ResolverEditStepComponent } from './container/resolver-edit-step.component'; -import { ResolverSelectComponent } from './container/resolver-select.component'; -import { MetadataSourceEditor } from '../domain/model/wizards/metadata-source-editor'; -import { FinishFormComponent } from './component/finish-form.component'; -import { ProviderFormFragmentComponent } from './component/provider-form-fragment.component'; -import { MetadataResolverPageComponent } from './resolver.component'; -import { MetadataConfigurationModule } from '../configuration/configuration.module'; - -@NgModule({ - declarations: [ - NewResolverComponent, - UploadResolverComponent, - CopyResolverComponent, - ConfirmCopyComponent, - ResolverEditComponent, - ResolverEditStepComponent, - ResolverSelectComponent, - ResolverWizardComponent, - ResolverWizardStepComponent, - FinishFormComponent, - ProviderFormFragmentComponent, - MetadataResolverPageComponent - ], - entryComponents: [], - imports: [ - DomainModule, - SharedModule, - HttpClientModule, - CommonModule, - RouterModule, - ReactiveFormsModule, - FormsModule, - NgbDropdownModule, - I18nModule, - WizardModule, - FormModule, - NgbPopoverModule, - NgbModalModule, - MetadataConfigurationModule - ], - exports: [], - providers: [] -}) -export class ResolverModule { - static forRoot(): ModuleWithProviders { - return { - ngModule: RootResolverModule, - providers: [ - CopyIsSetGuard - ] - }; - } -} - -@NgModule({ - imports: [ - ResolverModule, - StoreModule.forFeature('resolver', fromResolver.reducers), - EffectsModule.forFeature([ - SearchIdEffects, - CopyResolverEffects, - ResolverCollectionEffects, - DraftCollectionEffects, - WizardEffects, - EntityEffects - ]) - ], - providers: [ - { provide: METADATA_SOURCE_WIZARD, useClass: MetadataSourceWizard }, - { provide: METADATA_SOURCE_EDITOR, useClass: MetadataSourceEditor } - ] -}) -export class RootResolverModule { } diff --git a/ui/src/app/metadata/resolver/resolver.routing.ts b/ui/src/app/metadata/resolver/resolver.routing.ts deleted file mode 100644 index efd3c6b72..000000000 --- a/ui/src/app/metadata/resolver/resolver.routing.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { Routes } from '@angular/router'; - -import { ResolverWizardComponent } from './container/resolver-wizard.component'; - -import { NewResolverComponent } from './container/new-resolver.component'; -import { UploadResolverComponent } from './container/upload-resolver.component'; -import { CopyResolverComponent } from './container/copy-resolver.component'; -import { ConfirmCopyComponent } from './container/confirm-copy.component'; -import { CopyIsSetGuard } from './guard/copy-isset.guard'; - -import { CanDeactivateGuard } from '../../core/service/can-deactivate.guard'; -import { ResolverWizardStepComponent } from './container/resolver-wizard-step.component'; -import { ResolverEditComponent } from './container/resolver-edit.component'; -import { ResolverEditStepComponent } from './container/resolver-edit-step.component'; -import { ResolverSelectComponent } from './container/resolver-select.component'; -import { MetadataResolverPageComponent } from './resolver.component'; -import { IndexResolver } from '../configuration/service/index-resolver.service'; - -export const ResolverRoutes: Routes = [ - { - path: 'resolver', - component: MetadataResolverPageComponent, - children: [ - { - path: 'new', - component: NewResolverComponent, - children: [ - { path: '', redirectTo: 'blank/common', pathMatch: 'prefix' }, - { - path: 'blank/:index', - component: ResolverWizardComponent, - resolve: [IndexResolver], - canDeactivate: [ - CanDeactivateGuard - ], - children: [ - { - path: '', - component: ResolverWizardStepComponent, - data: { title: `Create Metadata Source`, subtitle: true }, - resolve: [] - } - ] - }, - { - path: 'upload', - component: UploadResolverComponent, - canDeactivate: [], - data: { title: `Upload Metadata Source` } - }, - { - path: 'copy', - component: CopyResolverComponent, - canDeactivate: [], - data: { title: `Copy Metadata Source` } - } - ] - }, - { - path: 'new/copy/confirm', - component: ConfirmCopyComponent, - canActivate: [CopyIsSetGuard], - data: { title: `Confirm Metadata Source Copy` } - }, - { - path: ':id', - component: ResolverSelectComponent, - children: [ - { - path: 'edit', - component: ResolverEditComponent, - children: [ - { path: '', redirectTo: 'common', pathMatch: 'prefix' }, - { - path: ':index', - resolve: [IndexResolver], - component: ResolverEditStepComponent, - data: { title: `Edit Metadata Source`, subtitle: true } - } - ], - canDeactivate: [ - CanDeactivateGuard - ] - } - ] - } - ] - } -]; diff --git a/ui/src/app/metadata/resolver/wizard-definition.ts b/ui/src/app/metadata/resolver/wizard-definition.ts deleted file mode 100644 index 2bd4c8122..000000000 --- a/ui/src/app/metadata/resolver/wizard-definition.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { InjectionToken } from '@angular/core'; -import { Wizard } from '../../wizard/model'; -import { MetadataResolver } from '../domain/model'; - -export const METADATA_SOURCE_WIZARD = new InjectionToken>('METADATA_SOURCE_WIZARD'); -export const METADATA_SOURCE_EDITOR = new InjectionToken>('METADATA_SOURCE_EDITOR'); diff --git a/ui/src/app/metadata/view/EditFilter.js b/ui/src/app/metadata/view/EditFilter.js new file mode 100644 index 000000000..bae6fa78e --- /dev/null +++ b/ui/src/app/metadata/view/EditFilter.js @@ -0,0 +1,102 @@ +import React from 'react'; +import { faSave, faSpinner } from '@fortawesome/free-solid-svg-icons'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import Button from 'react-bootstrap/Button'; + +import { Prompt, useHistory, useParams } from 'react-router'; +import Translate from '../../i18n/components/translate'; +import { MetadataFilterEditor } from '../editor/MetadataFilterEditor'; +import { MetadataForm } from '../hoc/MetadataFormContext'; +import { MetadataSchema } from '../hoc/MetadataSchema'; +import { getMetadataPath, useMetadataUpdater } from '../hooks/api'; +import { useMetadataFilterObject } from '../hoc/MetadataFilterSelector'; +import API_BASE_PATH from '../../App.constant'; + +export function EditFilter() { + + const { id, filterId } = useParams(); + const filter = useMetadataFilterObject(); + const history = useHistory(); + + const { update, loading } = useMetadataUpdater(`${API_BASE_PATH}${getMetadataPath('provider')}/${id}/Filters/${filterId}`, filter); + + const [blocking, setBlocking] = React.useState(false); + + const onNavigate = (path) => { + const resetBlock = blocking; + setBlocking(false); + setTimeout(() => { + history.push(path); + setBlocking(resetBlock); + }); + }; + + function save(metadata) { + setBlocking(false); + update(``, metadata).then(() => { + gotoDetail({ refresh: true }); + }).catch(() => { + window.location.reload(); + }); + }; + + const cancel = () => { + setBlocking(false); + setTimeout(() => gotoDetail()); + }; + + const gotoDetail = (state = null) => { + setBlocking(false); + history.push(`/metadata/provider/${id}`, state); + }; + + return ( +
+ + `message.unsaved-editor` + } + /> +
+
+ Edit filter +
+
+ + + +
+
+ + +
+
+
+ setBlocking(b) }> + {(filter, isInvalid) => +
+ + +
+ } +
+
+
+
+
+
+
+ ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/view/MetadataAttributeEdit.js b/ui/src/app/metadata/view/MetadataAttributeEdit.js new file mode 100644 index 000000000..58cd6d995 --- /dev/null +++ b/ui/src/app/metadata/view/MetadataAttributeEdit.js @@ -0,0 +1,103 @@ +import React from 'react'; +import { faSave, faSpinner } from '@fortawesome/free-solid-svg-icons'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; + +import Button from 'react-bootstrap/Button'; +import { Prompt, useHistory, useParams } from 'react-router'; +import Translate from '../../i18n/components/translate'; +import { MetadataAttributeEditor } from '../editor/MetadataAttributeEditor'; +import { useMetadataAttribute } from '../hooks/api'; + +import { CustomAttributeDefinition, CustomAttributeEditor } from '../domain/attribute/CustomAttributeDefinition'; +import MetadataSchema from '../hoc/MetadataSchema'; +import { MetadataForm } from '../hoc/MetadataFormContext'; + +export function MetadataAttributeEdit() { + const { id } = useParams(); + const history = useHistory(); + + const definition = CustomAttributeDefinition; + + const { get, put, response, loading } = useMetadataAttribute({ + cachePolicy: 'no-cache' + }); + + const [blocking, setBlocking] = React.useState(false); + + async function loadAttribute() { + const attr = await get(`/${id}`); + if (response.ok) { + setAttribute(attr); + } + } + + async function save(metadata) { + await put(``, definition.parser(metadata)); + if (response.ok) { + gotoDetail({ refresh: true }); + } + }; + + const cancel = () => { + gotoDetail(); + }; + + const gotoDetail = (state = null) => { + setBlocking(false); + history.push(`/metadata/attributes`, state); + }; + + const [attribute, setAttribute] = React.useState(); + + /*eslint-disable react-hooks/exhaustive-deps*/ + React.useEffect(() => { + loadAttribute(); + }, []); + + return ( +
+ + `message.unsaved-editor` + } + /> +
+
+
+
+ Add a new metadata attribute +
+
+
+
+ + {attribute && + + + {(filter, errors) => + + + + + } + + + } + +
+
+
+ ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/view/MetadataAttributeList.js b/ui/src/app/metadata/view/MetadataAttributeList.js new file mode 100644 index 000000000..b72c3c0e7 --- /dev/null +++ b/ui/src/app/metadata/view/MetadataAttributeList.js @@ -0,0 +1,91 @@ +import React from 'react'; +import { faEdit, faPlusCircle, faTrash } from '@fortawesome/free-solid-svg-icons'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; + +import Button from 'react-bootstrap/Button'; +import { Link } from 'react-router-dom'; + +import { Translate } from '../../i18n/components/translate'; +import { useTranslator } from '../../i18n/hooks'; + +import { DeleteConfirmation } from '../component/DeleteConfirmation'; + +export function MetadataAttributeList ({entities, onDelete}) { + + const translator = useTranslator(); + + const remove = (id) => { + onDelete(id); + } + + return ( + + {(block) => +
+
+
+
+ + Custom Entity Attributes + +
+
+
+ +   + Add new attribute + +
+
+ + + + + + + + + + + + {entities.map((attr, i) => + + + + + + + + )} + +
+ Attribute Name + + Type + + Help Text + + Default Value + Actions
{attr.name}{translator(`value.${attr.attributeType}`)}{attr.helpText}{attr.defaultValue?.toString()} + + + + Edit + + + +
+
+
+
+
+
+ } +
+ ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/view/MetadataComparison.js b/ui/src/app/metadata/view/MetadataComparison.js new file mode 100644 index 000000000..05bfe6d82 --- /dev/null +++ b/ui/src/app/metadata/view/MetadataComparison.js @@ -0,0 +1,85 @@ +import React from 'react'; +import { + useQueryParam, + ArrayParam, + withDefault +} from 'use-query-params'; +import { MetadataDefinitionContext, MetadataSchemaContext } from '../hoc/MetadataSchema'; +import { MetadataVersionsLoader } from '../hoc/MetadataVersionsLoader'; +import { Configuration } from '../hoc/Configuration'; +import { MetadataConfiguration } from '../component/MetadataConfiguration'; +import { Link, useParams } from 'react-router-dom'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { faHistory } from '@fortawesome/free-solid-svg-icons'; +import Translate from '../../i18n/components/translate'; +import Form from 'react-bootstrap/Form'; +import { useTranslation } from '../../i18n/hooks'; +import { MetadataFilterVersionList } from '../domain/filter/component/MetadataFilterVersionList'; +import { MetadataFilterVersionContext } from '../domain/filter/component/MetadataFilterVersionContext'; +import { useMetadataSchema } from '../hooks/schema'; + +export function MetadataComparison () { + + const { type, id } = useParams(); + + const [versions] = useQueryParam('versions', withDefault(ArrayParam, [])); + const schema = React.useContext(MetadataSchemaContext); + const definition = React.useContext(MetadataDefinitionContext); + + const processed = useMetadataSchema(definition, schema); + + const [limited, setLimited] = React.useState(false); + + const toggleLimited = useTranslation('action.view-only-changes'); + + return ( + <> +

+ Compare  + Source +  Configuration +

+ {versions && + + {(v) => + + {(config) => +
2 ? 'container-fluid' : 'container'}> + + + + {type === 'provider' && v && + +
+

+ Metadata Filter +

+
+ + {(c) => } + +
+ } +
+ } +
+ } +
+ } + + ); +} + diff --git a/ui/src/app/metadata/view/MetadataCopy.js b/ui/src/app/metadata/view/MetadataCopy.js new file mode 100644 index 000000000..1584e4897 --- /dev/null +++ b/ui/src/app/metadata/view/MetadataCopy.js @@ -0,0 +1,52 @@ +import React from 'react'; +import { MetadataSchema } from '../hoc/MetadataSchema'; + +import { CopySource } from '../copy/CopySource'; +import { SaveCopy } from '../copy/SaveCopy'; +import { useMetadataEntity } from '../hooks/api'; +import { useHistory } from 'react-router'; + +export function MetadataCopy ({ onShowNav }) { + + const { post, response, loading } = useMetadataEntity('source'); + const history = useHistory(); + + const [copy, setCopy] = React.useState({ + target: null, + serviceProviderName: null, + entityId: null, + properties: [] + }); + const [confirm, setConfirm] = React.useState(false); + + const next = (data) => { + setCopy(data); + setConfirm(true); + onShowNav(false); + }; + + const back = (data) => { + setConfirm(false); + onShowNav(true); + }; + + async function save (data) { + await post('', data); + if (response.ok) { + history.push('/'); + } + } + + return ( + + {!confirm && + + } + {confirm && copy && + + + + } + + ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/view/MetadataEdit.js b/ui/src/app/metadata/view/MetadataEdit.js new file mode 100644 index 000000000..45d326312 --- /dev/null +++ b/ui/src/app/metadata/view/MetadataEdit.js @@ -0,0 +1,15 @@ +import React from 'react'; +import { MetadataForm } from '../hoc/MetadataFormContext'; +import { MetadataEditor } from '../editor/MetadataEditor'; +import { useMetadataObject } from '../hoc/MetadataSelector'; + +export function MetadataEdit() { + + const base = useMetadataObject(); + + return ( + + + + ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/view/MetadataHistory.js b/ui/src/app/metadata/view/MetadataHistory.js new file mode 100644 index 000000000..9921cc19e --- /dev/null +++ b/ui/src/app/metadata/view/MetadataHistory.js @@ -0,0 +1,122 @@ +import React from 'react'; +import { useHistory, useParams } from 'react-router'; +import { Link } from 'react-router-dom'; +import queryString from 'query-string'; +import Button from 'react-bootstrap/Button'; +import FormattedDate from '../../core/components/FormattedDate'; + +import Translate from '../../i18n/components/translate'; +import { useMetadataHistory } from '../hooks/api'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { faUndo } from '@fortawesome/free-solid-svg-icons'; + +const sortVersionsByDate = (versions) => { + return versions.sort((a, b) => { + const aDate = new Date(a.date).getTime(); + const bDate = new Date(b.date).getTime(); + return aDate === bDate ? 0 : aDate < bDate ? -1 : 1; + }).reverse(); +} + +export function MetadataHistory () { + const { type, id } = useParams(); + + const history = useHistory(); + + const { data, loading } = useMetadataHistory(type, id, { + cachePolicy: 'no-cache' + }, []); + + const toggleVersionSelected = (version) => { + let s = [...selected]; + if (s.indexOf(version) > -1) { + s = s.filter(i => i !== version); + } else { + s = [...s, version]; + } + setSelected(s); + }; + const compare = (versions) => { + const s = sortVersionsByDate(versions); + const path = `/metadata/${type}/${id}/configuration/compare?${queryString.stringify({versions: s.map(s => s.id)}, { + skipNull: true, + })}`; + history.push(path); + }; + + const [selected, setSelected] = React.useState([]); + + const [sorted, setSorted] = React.useState([]); + + React.useEffect(() => { + if (data && data.length) { + setSorted(sortVersionsByDate(data)); + } + }, [data]); + + return ( + <> +

+ version history +

+ {data && !loading &&
+ <> + + + + + + + + + + + + {sorted.map((version, i) => + + + + + + + )} + +
Metadata Version History
+ Select Version + Save DateChanged ByActions
+
toggleVersionSelected(version)}> + -1} onChange={() => {}} /> + +
+
+ {i === 0 ? +  (Current) + + : + + + + } + { version.creator } + {i > 0 && + +   + Restore + + } +
+ + +
} + {loading &&
+ + Loading... +
} + + ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/view/MetadataOptions.js b/ui/src/app/metadata/view/MetadataOptions.js new file mode 100644 index 000000000..e592731e6 --- /dev/null +++ b/ui/src/app/metadata/view/MetadataOptions.js @@ -0,0 +1,119 @@ +import React from 'react'; +import { faArrowDown, faArrowUp, faHistory, faPlus, faTrash } from '@fortawesome/free-solid-svg-icons'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { Link, useHistory, useParams } from 'react-router-dom'; +import Button from 'react-bootstrap/Button'; +import { scroller } from 'react-scroll'; + +import Translate from '../../i18n/components/translate'; + +import { MetadataObjectContext } from '../hoc/MetadataSelector'; +import { MetadataHeader } from '../component/MetadataHeader'; +import { MetadataConfiguration } from '../component/MetadataConfiguration'; +import { MetadataDefinitionContext, MetadataSchemaContext } from '../hoc/MetadataSchema'; + +import { useMetadataConfiguration } from '../hooks/configuration'; +import { MetadataViewToggle } from '../component/MetadataViewToggle'; +import { DeleteSourceConfirmation } from '../domain/source/component/DeleteSourceConfirmation'; +import { MetadataFilters } from '../domain/filter/component/MetadataFilters'; +import { MetadataFilterConfigurationList } from '../domain/filter/component/MetadataFilterConfigurationList'; +import { MetadataFilterTypes } from '../domain/filter'; +import { useMetadataSchema } from '../hooks/schema'; + +export function MetadataOptions () { + + const metadata = React.useContext(MetadataObjectContext); + const definition = React.useContext(MetadataDefinitionContext); + const schema = React.useContext(MetadataSchemaContext); + const processed = useMetadataSchema(definition, schema); + const history = useHistory(); + + const { type, id } = useParams(); + + const configuration = useMetadataConfiguration([metadata], processed, definition); + + const onScrollTo = (element, offset = 0) => { + scroller.scrollTo(element, { + duration: 500, + smooth: true, + offset + }); + }; + + const redirectOnDelete = () => history.push('/dashboard'); + + const edit = (section) => { + history.push(`/metadata/${type}/${id}/edit/${section}`); + } + + return ( + + {(onDeleteSource) => + <> + +
+ + {type === 'source' && onDeleteSource && + + } + + + edit(section) } /> +
+ {type === 'provider' && + <> +
+

+ Filters +

+
+ +   + Add Filter + +
+
+ + {(filters, onUpdate, onDelete, loading) => + } + + + } +
+ +
+ } +
+ ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/view/MetadataRestore.js b/ui/src/app/metadata/view/MetadataRestore.js new file mode 100644 index 000000000..9511c4c92 --- /dev/null +++ b/ui/src/app/metadata/view/MetadataRestore.js @@ -0,0 +1,26 @@ +import React from 'react'; +import { MetadataEditor } from '../editor/MetadataEditor'; +import { MetadataForm } from '../hoc/MetadataFormContext'; +import { useMetadataObject } from '../hoc/MetadataSelector'; +import { MetadataVersionLoader } from '../hoc/MetadataVersionLoader'; + +export function MetadataRestore() { + + const latest = useMetadataObject(); + + return ( + + {(metadata) => + + + + } + + ); +} diff --git a/ui/src/app/metadata/view/MetadataUpload.js b/ui/src/app/metadata/view/MetadataUpload.js new file mode 100644 index 000000000..d00be91fe --- /dev/null +++ b/ui/src/app/metadata/view/MetadataUpload.js @@ -0,0 +1,161 @@ +import React from 'react'; +import Form from 'react-bootstrap/Form'; +import { useForm } from "react-hook-form"; +import { useHistory } from 'react-router-dom'; +import Button from 'react-bootstrap/Button'; +import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; +import { faAsterisk, faSave, faSpinner } from '@fortawesome/free-solid-svg-icons'; + +import Translate from '../../i18n/components/translate'; +import { readFileContents } from '../../core/utility/read_file_contents'; +import { get_cookie } from '../../core/utility/get_cookie'; +import { getMetadataPath } from '../hooks/api'; +import { useNotificationDispatcher, createNotificationAction } from '../../notifications/hoc/Notifications'; +import API_BASE_PATH from '../../App.constant'; + +export function MetadataUpload() { + + const history = useHistory(); + const dispatch = useNotificationDispatcher(); + + const [saving, setSaving] = React.useState(false); + + async function save({serviceProviderName, file, url}) { + + console.log(serviceProviderName, file); + + setSaving(true); + + const f = file?.length > 0 ? file[0] : null; + + let body = ''; + let type = ''; + + if (f) { + body = await readFileContents(f); + type = 'application/xml'; + } else if (url) { + body = `metadataUrl=${url}`; + type = 'application/x-www-form-urlencoded'; + } + + const response = await fetch(`${API_BASE_PATH}${getMetadataPath('source')}?spName=${serviceProviderName}`, { + method: 'POST', + cache: 'no-cache', + headers: { + 'Content-Type': type, + 'X-XSRF-TOKEN': get_cookie('XSRF-TOKEN') + }, + body + }); + + if (response.ok) { + setSaving(false); + history.push('/dashboard'); + } else { + const message = await response.json(); + dispatch(createNotificationAction(`${message.errorCode}: Unable to create file ... ${message.errorMessage}`, 'danger', 5000)); + setSaving(false); + } + } + + const { register, handleSubmit, watch, formState } = useForm({ + mode: 'onChange', + reValidateMode: 'onBlur', + defaultValues: {}, + resolver: undefined, + context: undefined, + criteriaMode: "firstError", + shouldFocusError: true, + shouldUnregister: false, + }); + + const { errors, isValid } = formState; + + const watchFile = watch('file'); + const watchUrl = watch('url'); + + return ( +
+
+
+
    +
  • +

    + 1 + 1. Name and Upload Url +

    +
  • +
  • + +
  • +
+
+
+ + + {errors?.serviceProviderName?.type === 'required' && + + Service Resolver Name is required + + } +
+
+ 0 ? + watchFile[0].name + : + Select Resolver Metadata File + } + {...register('file')} + custom + /> +
+
+ — + OR + — +
+
+ + 0 } type="text" className="form-control"{...register('url')} /> +
+
+ Note: You can only import a file with a single entityID (EntityDescriptor element) in it. Anything more in that file will result in an error. +
+
+ +
+
+
+ + ) +} \ No newline at end of file diff --git a/ui/src/app/metadata/view/MetadataVersion.js b/ui/src/app/metadata/view/MetadataVersion.js new file mode 100644 index 000000000..3bde185fa --- /dev/null +++ b/ui/src/app/metadata/view/MetadataVersion.js @@ -0,0 +1,93 @@ +import React from 'react'; +import Button from 'react-bootstrap/Button'; +import { MetadataDefinitionContext, MetadataSchemaContext } from '../hoc/MetadataSchema'; +import { Configuration } from '../hoc/Configuration'; +import { MetadataConfiguration } from '../component/MetadataConfiguration'; +import { Link, useParams } from 'react-router-dom'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { faArrowUp, faHistory, faPlus } from '@fortawesome/free-solid-svg-icons'; + +import { scroller } from 'react-scroll'; + +import Translate from '../../i18n/components/translate'; +import { MetadataHeader } from '../component/MetadataHeader'; +import { MetadataFilters } from '../domain/filter/component/MetadataFilters'; +import { MetadataFilterConfigurationList } from '../domain/filter/component/MetadataFilterConfigurationList'; +import { MetadataFilterTypes } from '../domain/filter'; +import { useMetadataSchema } from '../hooks/schema'; +import { MetadataVersionLoader } from '../hoc/MetadataVersionLoader'; + +export function MetadataVersion() { + + const { type, id } = useParams(); + + const schema = React.useContext(MetadataSchemaContext); + const definition = React.useContext(MetadataDefinitionContext); + const processed = useMetadataSchema(definition, schema); + + const onScrollTo = (element, offset = 0) => { + scroller.scrollTo(element, { + duration: 500, + smooth: true, + offset + }); + }; + + return ( + + {(metadata) => + + {(config) => + <> + +
+ + + + + +
+ {type === 'provider' && + <> +
+

+ Filters +

+
+ +   + Add Filter + +
+
+ + {(filters) => } + + + } +
+ +
+ + } +
+ } +
+ ); +} diff --git a/ui/src/app/metadata/view/MetadataWizard.js b/ui/src/app/metadata/view/MetadataWizard.js new file mode 100644 index 000000000..00031692a --- /dev/null +++ b/ui/src/app/metadata/view/MetadataWizard.js @@ -0,0 +1,20 @@ +import React from 'react'; + +import { MetadataForm } from '../hoc/MetadataFormContext'; +import { MetadataSourceWizard } from '../wizard/MetadataSourceWizard'; +import { MetadataProviderWizard } from '../wizard/MetadataProviderWizard'; +import { Wizard } from '../wizard/Wizard'; + +export function MetadataWizard ({type, data, onCallback}) { + return ( + + + {type === 'source' ? + + : + + } + + + ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/view/MetadataXml.js b/ui/src/app/metadata/view/MetadataXml.js new file mode 100644 index 000000000..5144b14af --- /dev/null +++ b/ui/src/app/metadata/view/MetadataXml.js @@ -0,0 +1,46 @@ +import React from 'react'; +import { faSave } from '@fortawesome/free-solid-svg-icons'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; + +import Button from 'react-bootstrap/Button'; +import { useParams } from 'react-router'; +import Translate from '../../i18n/components/translate'; +import { MetadataObjectContext } from '../hoc/MetadataSelector'; + +import { MetadataXmlContext } from '../hoc/MetadataXmlLoader'; +import { MetadataViewToggle } from '../component/MetadataViewToggle'; +import { downloadAsXml } from '../../core/utility/download_as_xml'; + +export function MetadataXml () { + const xml = React.useContext(MetadataXmlContext); + const entity = React.useContext(MetadataObjectContext); + const { type } = useParams(); + + const download = () => downloadAsXml(entity.name ? entity.name : entity.serviceProviderName, xml); + + return ( + <> +

+ Source Configuration +

+
+
+ +
+
+
+
{xml}
+
+ { xml } +
+
+ + +
+
+ + ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/wizard/MetadataFilterTypeSelector.js b/ui/src/app/metadata/wizard/MetadataFilterTypeSelector.js new file mode 100644 index 000000000..4134ae3e0 --- /dev/null +++ b/ui/src/app/metadata/wizard/MetadataFilterTypeSelector.js @@ -0,0 +1,63 @@ +import React from 'react'; +import { useForm } from 'react-hook-form'; +import Form from 'react-bootstrap/Form'; +import Translate from '../../i18n/components/translate'; +import { InfoIcon } from '../../form/component/InfoIcon'; +import { useTranslator } from '../../i18n/hooks'; + +export function MetadataFilterTypeSelector({ types = [], children, actions}) { + + const translator = useTranslator(); + + const { register, handleSubmit, watch } = useForm({ + mode: 'onChange', + reValidateMode: 'onChange', + defaultValues: { + type: null + }, + resolver: undefined, + context: undefined, + criteriaMode: "firstError", + shouldFocusError: true, + shouldUnregister: false, + }); + + const type = watch('type'); + + const [base, setBase] = React.useState({}); + + React.useEffect(() => { + setBase({ + '@type': type + }) + }, [type]) + + return ( +
+
+
+
+
+
+ + + + + + + + {types.map(t => )} + + +
+
+
+
+
+
+ {type && + children(type, base) + } +
+ ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/wizard/MetadataProviderTypeSelector.js b/ui/src/app/metadata/wizard/MetadataProviderTypeSelector.js new file mode 100644 index 000000000..1312eda20 --- /dev/null +++ b/ui/src/app/metadata/wizard/MetadataProviderTypeSelector.js @@ -0,0 +1,118 @@ +import React from 'react'; +import { faArrowCircleRight } from '@fortawesome/free-solid-svg-icons'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; + +import { useForm } from 'react-hook-form'; +import Form from 'react-bootstrap/Form'; +import Button from 'react-bootstrap/Button'; +import Translate from '../../i18n/components/translate'; +import { InfoIcon } from '../../form/component/InfoIcon'; +import { useTranslator } from '../../i18n/hooks'; +import { useMetadataProviders } from '../hooks/api'; + +export function MetadataProviderTypeSelector({ type, types = [], children}) { + + const translator = useTranslator(); + + const { data = [] } = useMetadataProviders({cachePolicy: 'no-cache'}, []); + + const [showSelector, setShowSelector] = React.useState(true); + + const { register, formState, handleSubmit, getValues } = useForm({ + mode: 'onChange', + reValidateMode: 'onChange', + defaultValues: { + name: null, + type: null + }, + resolver: undefined, + context: undefined, + criteriaMode: "firstError", + shouldFocusError: true, + shouldUnregister: false, + }); + + const { isValid, errors } = formState; + + const onNext = (data) => { + setShowSelector(false); + }; + + const onShowSelector = () => { + setShowSelector(true); + } + + const providerNames = data.map(p => p.name); + + return ( + <>{showSelector ? + <> + +
+
+
+
+
+ + + + + + !(providerNames.indexOf(v) > -1) + }})} /> + + {errors?.name?.unique && } + {errors?.name?.required && } + + + + + + + + + + + {types.map(t => )} + + +
+
+
+
+ + : + children(getValues(), onShowSelector) + } + + ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/wizard/MetadataProviderWizard.js b/ui/src/app/metadata/wizard/MetadataProviderWizard.js new file mode 100644 index 000000000..37022bd13 --- /dev/null +++ b/ui/src/app/metadata/wizard/MetadataProviderWizard.js @@ -0,0 +1,112 @@ +import React from 'react'; +import { WizardNav } from './WizardNav'; +import { MetadataWizardForm } from './MetadataWizardForm'; +import { setWizardIndexAction, useCurrentIndex, useIsLastPage, useWizardDispatcher } from './Wizard'; +import { useMetadataDefinitionContext, useMetadataSchemaContext } from '../hoc/MetadataSchema'; +import { checkChanges, useMetadataSchema } from '../hooks/schema'; +import { useMetadataFormDispatcher, setFormDataAction, setFormErrorAction, useMetadataFormData, useMetadataFormErrors } from '../hoc/MetadataFormContext'; +import { MetadataConfiguration } from '../component/MetadataConfiguration'; +import { Configuration } from '../hoc/Configuration'; +import { useMetadataEntity, useMetadataProviders } from '../hooks/api'; +import { Prompt, useHistory } from 'react-router'; +import { removeNull } from '../../core/utility/remove_null'; + +import { useNotificationDispatcher, createNotificationAction, NotificationTypes } from '../../notifications/hoc/Notifications'; + +export function MetadataProviderWizard({onRestart}) { + + const { data } = useMetadataProviders({cachePolicy: 'no-cache'}, []); + + const { post, loading, response } = useMetadataEntity('provider'); + const history = useHistory(); + + const definition = useMetadataDefinitionContext(); + const schema = useMetadataSchemaContext(); + + const processed = useMetadataSchema(definition, schema); + + const formDispatch = useMetadataFormDispatcher(); + const metadata = useMetadataFormData(); + const errors = useMetadataFormErrors(); + + const isLast = useIsLastPage(); + + const wizardDispatch = useWizardDispatcher(); + + const notificationDispatch = useNotificationDispatcher(); + + const current = useCurrentIndex(); + + const onChange = (changes) => { + formDispatch(setFormDataAction(changes.formData)); + formDispatch(setFormErrorAction(changes.errors)); + setBlocking(checkChanges(metadata, changes.formData)); + }; + + const onEditFromSummary = (idx) => { + wizardDispatch(setWizardIndexAction(idx)); + }; + + const onBlur = (form) => { + // console.log(form); + } + + const validator = definition.validator(data); + + async function save() { + const body = removeNull(definition.parser(metadata), true); + await post('', body); + if (response.ok) { + setBlocking(false); + history.push('/dashboard/metadata/manager/providers'); + } else { + const { errorCode, errorMessage, cause } = response.data; + notificationDispatch(createNotificationAction( + `${errorCode}: ${errorMessage} ${cause ? `-${cause}` : ''}`, + NotificationTypes.ERROR + )); + } + } + + const [blocking, setBlocking] = React.useState(false); + + return ( + <> + + `message.unsaved-editor` + } + /> +
+
+ 0 || loading} saving={loading} /> +
+
+
+
+
+ +
+
+ {isLast && +
+
+ + {(config) => } + +
+
+ } + + ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/wizard/MetadataSourceWizard.js b/ui/src/app/metadata/wizard/MetadataSourceWizard.js new file mode 100644 index 000000000..0d23b34af --- /dev/null +++ b/ui/src/app/metadata/wizard/MetadataSourceWizard.js @@ -0,0 +1,127 @@ +import React from 'react'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons'; +import Alert from 'react-bootstrap/Alert'; +import Row from 'react-bootstrap/Row'; +import Col from 'react-bootstrap/Col'; + +import { WizardNav } from './WizardNav'; +import { MetadataWizardForm } from './MetadataWizardForm'; +import { setWizardIndexAction, useCurrentIndex, useIsFirstPage, useIsLastPage, useWizardDispatcher } from './Wizard'; +import { useMetadataDefinitionContext, useMetadataSchemaContext } from '../hoc/MetadataSchema'; +import { useMetadataFormDispatcher, setFormDataAction, setFormErrorAction, useMetadataFormData, useMetadataFormErrors } from '../hoc/MetadataFormContext'; +import { MetadataConfiguration } from '../component/MetadataConfiguration'; +import { Configuration } from '../hoc/Configuration'; +import { useMetadataEntity, useMetadataSources } from '../hooks/api'; +import { Prompt, useHistory } from 'react-router'; +import { removeNull } from '../../core/utility/remove_null'; + +import Translate from '../../i18n/components/translate'; +import { checkChanges } from '../hooks/utility'; + + +export function MetadataSourceWizard ({ onShowNav }) { + + const { post, loading, response } = useMetadataEntity('source'); + const history = useHistory(); + + const { data } = useMetadataSources({ + cachePolicy: 'no-cache' + }, []); + + const definition = useMetadataDefinitionContext(); + const schema = useMetadataSchemaContext(); + + const formDispatch = useMetadataFormDispatcher(); + const metadata = useMetadataFormData(); + const errors = useMetadataFormErrors(); + + const isFirst = useIsFirstPage(); + const isLast = useIsLastPage(); + + const wizardDispatch = useWizardDispatcher(); + + React.useEffect(() => { + onShowNav(isFirst); + }, [isFirst, onShowNav]); + + const current = useCurrentIndex(); + + const onChange = (changes) => { + formDispatch(setFormDataAction(changes.formData)); + formDispatch(setFormErrorAction(changes.errors)); + setBlocking(checkChanges(metadata, changes.formData)); + }; + + const onEditFromSummary = (idx) => { + wizardDispatch(setWizardIndexAction(idx)); + }; + + const onBlur = (form) => { + // console.log(form); + } + + async function save () { + const body = removeNull(metadata, true); + await post('', body); + if (response.ok) { + setBlocking(false); + history.push('/'); + } + } + + const [blocking, setBlocking] = React.useState(false); + + const validator = definition.validator(data); + const warnings = definition.warnings && definition.warnings(metadata); + + return ( + <> + + `message.unsaved-editor` + } + /> +
+
+ 0 || loading } saving={loading} /> +
+
+
+ {warnings && warnings.hasOwnProperty(current) && + + + + {warnings[current].map((w, widx) => +

+ )} +
+ +
+
+ } +
+
+ +
+
+ {isLast && +
+
+ + {(config) => } + +
+
+ } + + ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/wizard/MetadataWizardForm.js b/ui/src/app/metadata/wizard/MetadataWizardForm.js new file mode 100644 index 000000000..c508bd267 --- /dev/null +++ b/ui/src/app/metadata/wizard/MetadataWizardForm.js @@ -0,0 +1,53 @@ +import React from 'react'; + +import Form from '@rjsf/bootstrap-4'; + +import { fields, widgets } from '../../form/component'; +import { templates } from '../../form/component'; +import { useUiSchema } from '../hooks/schema'; + +import { transformErrors } from '../domain/transform'; + +function ErrorListTemplate () { + return (<>); +} + +export function MetadataWizardForm ({ metadata, definition, schema, current, onChange, onBlur = false, validator }) { + + const {uiSchema} = useUiSchema(definition, schema, current); + + const [data, setData] = React.useState(metadata); + + React.useEffect(() => setData(metadata), [metadata, definition]); + + const onSubmit = () => {}; + + const onFormChange = (form) => { + onChange(definition.bindings ? { ...form, formData: definition.bindings(data, form.formData) } : form); + }; + + return ( + <> +
+
onFormChange(form)} + onSubmit={() => onSubmit()} + onBlur={() => onBlur(data)} + schema={schema} + uiSchema={uiSchema} + FieldTemplate={templates.FieldTemplate} + ObjectFieldTemplate={templates.ObjectFieldTemplate} + ArrayFieldTemplate={templates.ArrayFieldTemplate} + fields={fields} + widgets={widgets} + liveValidate={true} + transformErrors={transformErrors} + ErrorList={ErrorListTemplate} + validate={validator}> + <> +
+
+ + ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/wizard/Wizard.js b/ui/src/app/metadata/wizard/Wizard.js new file mode 100644 index 000000000..cc52249fe --- /dev/null +++ b/ui/src/app/metadata/wizard/Wizard.js @@ -0,0 +1,132 @@ +import React from 'react'; +import { useMetadataDefinitionContext } from '../hoc/MetadataSchema'; + +const WizardContext = React.createContext(); + +const { Provider, Consumer } = WizardContext; + +const initialState = { + current: 'common', + disabled: false, + loading: false +}; + +const WizardActions = { + SET_INDEX: 'SET INDEX' +}; + +const setWizardIndexAction = (payload) => { + return { + type: WizardActions.SET_INDEX, + payload + } +} + +function reducer(state, action) { + const {type, payload} = action; + switch (type) { + case WizardActions.SET_INDEX: + return { + ...state, + current: payload + }; + default: + return state; + } +} + +function Wizard ({children}) { + + const [state, dispatch] = React.useReducer(reducer, { + ...initialState + }); + + const contextValue = React.useMemo(() => ({ state, dispatch }), [state, dispatch]); + + return ( + {children} + ) +} + +function useWizardContext () { + return React.useContext(WizardContext); +} + +function useWizardState() { + const { state } = useWizardContext(); + return state; +} + +function useCurrentIndex() { + const { current } = useWizardState(); + + return current; +} + +function useCurrentPage() { + const definition = useMetadataDefinitionContext(); + const current = useCurrentIndex(); + + return definition.steps.find(s => s.id === current); +} + +function usePreviousPage() { + const definition = useMetadataDefinitionContext(); + const current = useCurrentIndex(); + const idx = definition.steps.findIndex(s => s.id === current); + return definition.steps[idx - 1]; +} + +function useNextPage() { + const definition = useMetadataDefinitionContext(); + const current = useCurrentIndex(); + const idx = definition.steps.findIndex(s => s.id === current); + return definition.steps[idx + 1]; +} + +function useFirstPage() { + const definition = useMetadataDefinitionContext(); + return definition.steps[0]; +} + +function useLastPage () { + const definition = useMetadataDefinitionContext(); + return definition.steps[definition.steps.length - 1]; +} + +function useIsFirstPage () { + const definition = useMetadataDefinitionContext(); + const current = useCurrentIndex(); + return definition.steps[0].id === current; +} + +function useIsLastPage () { + const current = useCurrentIndex(); + const last = useLastPage(); + return last.id === current; +} + +function useWizardDispatcher () { + const { dispatch } = useWizardContext(); + return dispatch; +} + +export { + useWizardContext, + useWizardState, + useWizardDispatcher, + useCurrentIndex, + useCurrentPage, + useNextPage, + usePreviousPage, + useFirstPage, + useLastPage, + useIsFirstPage, + useIsLastPage, + setWizardIndexAction, + WizardActions, + Wizard, + WizardContext, + Provider as WizardProvider, + Consumer as WizardConsumer +}; \ No newline at end of file diff --git a/ui/src/app/metadata/wizard/WizardButton.js b/ui/src/app/metadata/wizard/WizardButton.js new file mode 100644 index 000000000..d77308de0 --- /dev/null +++ b/ui/src/app/metadata/wizard/WizardButton.js @@ -0,0 +1,5 @@ +import React from 'react'; + +export function WizardButton ({ ...props }) { + +} \ No newline at end of file diff --git a/ui/src/app/metadata/wizard/WizardNav.js b/ui/src/app/metadata/wizard/WizardNav.js new file mode 100644 index 000000000..da4564d6f --- /dev/null +++ b/ui/src/app/metadata/wizard/WizardNav.js @@ -0,0 +1,109 @@ +import React from 'react'; +import Button from 'react-bootstrap/Button'; +import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; +import { faCheck, faSpinner, faSave, faArrowCircleRight, faArrowCircleLeft } from '@fortawesome/free-solid-svg-icons'; + +import {Translate} from '../../i18n/components/translate'; +import { + useCurrentPage, + useLastPage, + useFirstPage, + useNextPage, + usePreviousPage, + setWizardIndexAction, + useWizardDispatcher +} from './Wizard'; + +export const ICONS = { + CHECK: 'CHECK', + INDEX: 'INDEX' +} + +export function WizardNav ({ disabled = false, onSave, saving, onRestart }) { + + const dispatch = useWizardDispatcher(); + + const current = useCurrentPage(); + const previous = usePreviousPage(); + const first = useFirstPage(); + const next = useNextPage(); + const last = useLastPage(); + + const onSetIndex = idx => { + dispatch(setWizardIndexAction(idx)); + }; + + const onPrevious = (idx) => { + if (idx === first.id && onRestart) { + onRestart(); + } else { + onSetIndex(idx); + } + }; + + const currentIcon = (last && current.index === last.index) ? : current.index; + + return ( + + + ); +} \ No newline at end of file diff --git a/ui/src/app/notification/action/notification.action.ts b/ui/src/app/notification/action/notification.action.ts deleted file mode 100644 index 3e5ada658..000000000 --- a/ui/src/app/notification/action/notification.action.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Action } from '@ngrx/store'; -import { Notification } from '../model/notification'; - -export const ADD_NOTIFICATION = '[Notification] Add Notification'; -export const CLEAR_NOTIFICATION = '[Metadata Draft] Clear Notification'; - -export class AddNotification implements Action { - readonly type = ADD_NOTIFICATION; - - constructor(public payload: Notification) { } -} - -export class ClearNotification implements Action { - readonly type = CLEAR_NOTIFICATION; - - constructor(public payload: Notification) { } -} - -export type Actions = - | AddNotification - | ClearNotification; diff --git a/ui/src/app/notification/component/notification-item.component.html b/ui/src/app/notification/component/notification-item.component.html deleted file mode 100644 index 235941254..000000000 --- a/ui/src/app/notification/component/notification-item.component.html +++ /dev/null @@ -1,6 +0,0 @@ - \ No newline at end of file diff --git a/ui/src/app/notification/component/notification-item.component.scss b/ui/src/app/notification/component/notification-item.component.scss deleted file mode 100644 index ba091474a..000000000 --- a/ui/src/app/notification/component/notification-item.component.scss +++ /dev/null @@ -1,3 +0,0 @@ -:host { - word-wrap: break-word; -} \ No newline at end of file diff --git a/ui/src/app/notification/component/notification-item.component.spec.ts b/ui/src/app/notification/component/notification-item.component.spec.ts deleted file mode 100644 index 35d962da7..000000000 --- a/ui/src/app/notification/component/notification-item.component.spec.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { TestBed, ComponentFixture, fakeAsync, tick } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; -import * as fromNotifications from '../reducer'; -import { NotificationItemComponent } from './notification-item.component'; -import { Notification, NotificationType } from '../model/notification'; -import { MockI18nModule } from '../../../testing/i18n.stub'; - -describe('Notification List Component', () => { - let fixture: ComponentFixture; - let instance: NotificationItemComponent; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [], - imports: [ - NoopAnimationsModule, - StoreModule.forRoot({ - 'notifications': combineReducers(fromNotifications.reducers), - }), - MockI18nModule - ], - declarations: [ - NotificationItemComponent - ], - }); - - fixture = TestBed.createComponent(NotificationItemComponent); - instance = fixture.componentInstance; - instance.notification = new Notification(); - fixture.detectChanges(); - }); - - it('should compile', () => { - expect(fixture).toBeDefined(); - }); - - describe('timeout', () => { - it('should timeout after the given number of seconds', fakeAsync(() => { - spyOn(instance.clear, 'emit'); - instance.timerCallback(); - expect(instance.clear.emit).toHaveBeenCalled(); - })); - - it('should call timeout after the given number of seconds', fakeAsync(() => { - spyOn(window, 'setTimeout'); - fixture = TestBed.createComponent(NotificationItemComponent); - instance = fixture.componentInstance; - instance.notification = new Notification(); - fixture.detectChanges(); - expect(window.setTimeout).toHaveBeenCalledWith(instance.timerCallback, instance.notification.timeout); - })); - - it('should NOT clear if 0 is passed as the timeout of the notification', async () => { - spyOn(window, 'setTimeout'); - instance.notification = new Notification(NotificationType.Info, 'foo', 0); - fixture.detectChanges(); - expect(window.setTimeout).not.toHaveBeenCalled(); - }); - }); -}); diff --git a/ui/src/app/notification/component/notification-item.component.ts b/ui/src/app/notification/component/notification-item.component.ts deleted file mode 100644 index b080724e5..000000000 --- a/ui/src/app/notification/component/notification-item.component.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Component, Input, Output, EventEmitter, OnInit } from '@angular/core'; -import { Notification } from '../model/notification'; -import { LiveAnnouncer } from '@angular/cdk/a11y'; - -@Component({ - selector: 'notification-item', - templateUrl: './notification-item.component.html', - styleUrls: ['./notification-item.component.scss'] -}) -export class NotificationItemComponent implements OnInit { - @Input() notification: Notification; - @Output() clear: EventEmitter = new EventEmitter(); - readonly timerCallback = () => this.clear.emit(this.notification); - constructor( - private announce: LiveAnnouncer - ) {} - - ngOnInit(): void { - if (this.notification.timeout > 0) { - setTimeout(this.timerCallback, this.notification.timeout); - } - - this.announce.announce(`Error: ${this.notification.body}`); - } -} /* istanbul ignore next */ diff --git a/ui/src/app/notification/component/notification-list.component.html b/ui/src/app/notification/component/notification-list.component.html deleted file mode 100644 index 5b6e7d621..000000000 --- a/ui/src/app/notification/component/notification-list.component.html +++ /dev/null @@ -1,7 +0,0 @@ -
-
    -
  • - -
  • -
-
\ No newline at end of file diff --git a/ui/src/app/notification/component/notification-list.component.scss b/ui/src/app/notification/component/notification-list.component.scss deleted file mode 100644 index f90ee0ae8..000000000 --- a/ui/src/app/notification/component/notification-list.component.scss +++ /dev/null @@ -1,7 +0,0 @@ -:host { - & > .position-fixed { - bottom: 0px; - right: 0px; - z-index: 2000; - } -} \ No newline at end of file diff --git a/ui/src/app/notification/component/notification-list.component.spec.ts b/ui/src/app/notification/component/notification-list.component.spec.ts deleted file mode 100644 index a9c0db081..000000000 --- a/ui/src/app/notification/component/notification-list.component.spec.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; -import * as fromNotifications from '../reducer'; -import { NotificationListComponent } from './notification-list.component'; -import { NotificationItemComponent } from './notification-item.component'; -import { Notification } from '../model/notification'; - -describe('Notification List Component', () => { - let fixture: ComponentFixture; - let instance: NotificationListComponent; - let store: Store; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [], - imports: [ - NoopAnimationsModule, - StoreModule.forRoot({ - 'notifications': combineReducers(fromNotifications.reducers), - }) - ], - declarations: [ - NotificationListComponent, - NotificationItemComponent - ], - }); - store = TestBed.get(Store); - spyOn(store, 'dispatch').and.callThrough(); - - fixture = TestBed.createComponent(NotificationListComponent); - instance = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should compile', () => { - expect(fixture).toBeDefined(); - }); - - describe('clear function', () => { - it('should dispatch a clear action to the store', () => { - instance.clear(new Notification()); - expect(store.dispatch).toHaveBeenCalled(); - }); - }); - - describe('sorter function', () => { - it('should return -1 if the first parameter was created first', () => { - const a = new Notification(); - const b = new Notification(); - b.createdAt = Date.now() + 100; - expect(instance.sorter(a, b)).toBe(-1); - }); - it('should return -1 if the first parameter was created first', () => { - const a = new Notification(); - const b = new Notification(); - a.createdAt = Date.now() + 100; - expect(instance.sorter(a, b)).toBe(1); - }); - it('should return -1 if the first parameter was created first', () => { - const a = new Notification(); - const b = new Notification(); - expect(instance.sorter(a, b)).toBe(0); - }); - }); - - describe('limit function', () => { - it('should return true if index is > 5', () => { - expect(instance.filter(new Notification(), 4)).toBe(true); - }); - it('should return true if index is <= 5', () => { - expect(instance.filter(new Notification(), 5)).toBe(false); - }); - it('should return -1 if the first parameter was created first', () => { - const a = new Notification(); - const b = new Notification(); - a.createdAt = Date.now() + 1; - expect(instance.sorter(a, b)).toBe(1); - }); - it('should return -1 if the first parameter was created first', () => { - const a = new Notification(); - const b = new Notification(); - expect(instance.sorter(a, b)).toBe(0); - }); - }); -}); diff --git a/ui/src/app/notification/component/notification-list.component.ts b/ui/src/app/notification/component/notification-list.component.ts deleted file mode 100644 index 38531da51..000000000 --- a/ui/src/app/notification/component/notification-list.component.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { Component } from '@angular/core'; -import { Observable } from 'rxjs'; -import { map } from 'rxjs/operators'; -import { Store } from '@ngrx/store'; - -import * as fromNotifications from '../reducer'; -import { ClearNotification } from '../action/notification.action'; -import { Notification } from '../model/notification'; - -@Component({ - selector: 'notification-list', - templateUrl: './notification-list.component.html', - styleUrls: ['./notification-list.component.scss'] -}) -export class NotificationListComponent { - notifications$: Observable; - - max = 5; - - constructor( - private store: Store - ) { - this.notifications$ = this.store - .select(fromNotifications.getNotifications) - .pipe( - map(notifications => notifications.sort(this.sorter)), - map(notifications => notifications.filter(this.filter)) - ); - } - - sorter(a: Notification, b: Notification): number { - return(a.createdAt < b.createdAt) ? - 1 : (a.createdAt > b.createdAt) ? 1 : 0; - } - - filter(n: Notification, index): boolean { - return index < 5; - } - - clear(event: Notification): void { - this.store.dispatch(new ClearNotification(event)); - } -} /* istanbul ignore next */ diff --git a/ui/src/app/notification/model/notification.ts b/ui/src/app/notification/model/notification.ts deleted file mode 100644 index 4c7b237cd..000000000 --- a/ui/src/app/notification/model/notification.ts +++ /dev/null @@ -1,16 +0,0 @@ -export class Notification { - createdAt: number = Date.now(); - constructor( - public type: NotificationType = NotificationType.Info, - public body: string = '', - public timeout: number = 8000, - public closeable: boolean = true - ) {} -} - -export enum NotificationType { - Success = 'alert-success', - Info = 'alert-info', - Warning = 'alert-warning', - Danger = 'alert-danger' -} diff --git a/ui/src/app/notification/notification.module.ts b/ui/src/app/notification/notification.module.ts deleted file mode 100644 index 24b175df7..000000000 --- a/ui/src/app/notification/notification.module.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { NgModule, ModuleWithProviders } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { StoreModule } from '@ngrx/store'; - -import { reducers } from './reducer'; -import { NotificationListComponent } from './component/notification-list.component'; -import { NotificationItemComponent } from './component/notification-item.component'; - -const COMPONENTS = [ - NotificationListComponent, - NotificationItemComponent -]; - -@NgModule({ - declarations: COMPONENTS, - entryComponents: COMPONENTS, - imports: [ - CommonModule, - StoreModule.forFeature('notifications', reducers) - ], - exports: COMPONENTS, - providers: [] -}) -export class NotificationModule {} - diff --git a/ui/src/app/notification/reducer/index.ts b/ui/src/app/notification/reducer/index.ts deleted file mode 100644 index f8458bb12..000000000 --- a/ui/src/app/notification/reducer/index.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { createSelector, createFeatureSelector } from '@ngrx/store'; -import * as fromNotifications from './notification.reducer'; -import * as fromRoot from '../../core/reducer'; - -export interface State extends fromRoot.State { - notifications: NotificationState; -} - -export interface NotificationState { - notifications: fromNotifications.NotificationState; -} - -export const reducers = { - notifications: fromNotifications.reducer -}; - -export const getNotificationState = createFeatureSelector('notifications'); -export const getNotificationEntityState = createSelector(getNotificationState, (state: NotificationState) => state.notifications); -export const getNotifications = createSelector( - getNotificationEntityState, - (state: fromNotifications.NotificationState) => state.notifications -); diff --git a/ui/src/app/notification/reducer/notification.reducer.spec.ts b/ui/src/app/notification/reducer/notification.reducer.spec.ts deleted file mode 100644 index 50f43c869..000000000 --- a/ui/src/app/notification/reducer/notification.reducer.spec.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { reducer } from './notification.reducer'; -import * as fromNotifications from './notification.reducer'; -import * as notificationActions from '../action/notification.action'; -import { Notification } from '../model/notification'; - -let notifications: Notification[] = [ - new Notification(), - new Notification() -], -snapshot: fromNotifications.NotificationState = { - notifications: [] -}; - -describe('Notification Reducer', () => { - const initialState: fromNotifications.NotificationState = { - notifications: [] - }; - - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(undefined, {} as any); - - expect(result).toEqual(initialState); - }); - }); - - describe('create notification action', () => { - it('should update the status when a provider is saved', () => { - const n = new Notification(); - const action = new notificationActions.AddNotification(n); - const result = reducer(initialState, action); - expect(result).toEqual( - Object.assign({}, initialState, { - notifications: [n] - }) - ); - }); - }); - - describe('remove notification action', () => { - it('should update the status when a provider is saved', () => { - const n = new Notification(); - const action = new notificationActions.ClearNotification(n); - const state: fromNotifications.NotificationState = { - notifications: [n] - }; - const result = reducer(state, action); - expect(result).toEqual({notifications: []}); - }); - }); - - describe('get notifications selector', () => { - it('should update the status when a provider is saved', () => { - const n = new Notification(); - const action = new notificationActions.ClearNotification(n); - const state: fromNotifications.NotificationState = { - notifications: [n] - }; - const result = reducer(state, action); - expect(fromNotifications.getNotifications(state)).toEqual(state.notifications); - }); - }); -}); diff --git a/ui/src/app/notification/reducer/notification.reducer.ts b/ui/src/app/notification/reducer/notification.reducer.ts deleted file mode 100644 index 2a6ddbdde..000000000 --- a/ui/src/app/notification/reducer/notification.reducer.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { createSelector } from '@ngrx/store'; -import { Notification } from '../model/notification'; -import * as actions from '../action/notification.action'; - -export interface NotificationState { - notifications: Notification[]; -} - -export const initialState: NotificationState = { - notifications: [] -}; - -export function reducer(state = initialState, action: actions.Actions): NotificationState { - switch (action.type) { - case actions.ADD_NOTIFICATION: { - return { - notifications: [ - ...state.notifications, - action.payload - ] - }; - } - case actions.CLEAR_NOTIFICATION: { - return { - notifications: [ - ...state.notifications.filter(n => n !== action.payload) - ] - }; - } - default: { - return state; - } - } -} - -export const getNotifications = (state: NotificationState) => state.notifications; diff --git a/ui/src/app/notifications/component/NotificationItem.js b/ui/src/app/notifications/component/NotificationItem.js new file mode 100644 index 000000000..4884aa188 --- /dev/null +++ b/ui/src/app/notifications/component/NotificationItem.js @@ -0,0 +1,22 @@ +import React from 'react'; +import Alert from 'react-bootstrap/Alert'; +import { NotificationContext, removeNotificationAction } from '../hoc/Notifications'; + +export function NotificationItem ({ type, body, timeout, id }) { + + const { dispatch } = React.useContext(NotificationContext); + + React.useEffect(() => { + if (timeout) { + setTimeout(() => { + dispatch(removeNotificationAction(id)); + }, timeout); + } + }, [timeout, id, dispatch]); + + return ( + dispatch(removeNotificationAction(id))}> + {body} + + ) +} \ No newline at end of file diff --git a/ui/src/app/notifications/component/NotificationList.js b/ui/src/app/notifications/component/NotificationList.js new file mode 100644 index 000000000..07d6b03b2 --- /dev/null +++ b/ui/src/app/notifications/component/NotificationList.js @@ -0,0 +1,18 @@ +import React from 'react'; +import { NotificationContext } from '../hoc/Notifications'; +import { NotificationItem } from './NotificationItem'; + +export function NotificationList () { + + const { state } = React.useContext(NotificationContext); + + return ( +
    + {state.notifications.map((n) => ( +
  • + +
  • + ))} +
+ ); +} \ No newline at end of file diff --git a/ui/src/app/notifications/hoc/Notifications.js b/ui/src/app/notifications/hoc/Notifications.js new file mode 100644 index 000000000..874a3fb28 --- /dev/null +++ b/ui/src/app/notifications/hoc/Notifications.js @@ -0,0 +1,88 @@ +import React from "react"; +import { uuid } from '../../core/utility/uuid'; + +const NotificationContext = React.createContext(); + +const { Provider, Consumer } = NotificationContext; + +const initialState = { + notifications: [] +}; + +export const NotificationActions = { + ADD_NOTIFICATION: 'add notification', + REMOVE_NOTIFICATION: 'remove notification' +}; + +export const NotificationTypes = { + SUCCESS: 'success', + DANGER: 'danger', + ERROR: 'danger', + WARNING: 'warn', + INFO: 'info' +}; + +export const createNotificationAction = (body, type = NotificationTypes.SUCCESS, timeout=5000) => { + return { + type: NotificationActions.ADD_NOTIFICATION, + payload: { + id: uuid(), + type, + body, + timeout + } + } +} + +export const removeNotificationAction = (id) => { + return { + type: NotificationActions.REMOVE_NOTIFICATION, + payload: id + } +} + +function reducer(state, action) { + switch (action.type) { + case NotificationActions.ADD_NOTIFICATION: + return { + notifications: [ + ...state.notifications, + { + ...action.payload + } + ] + }; + case NotificationActions.REMOVE_NOTIFICATION: + return { + notifications: [ + ...state.notifications.filter(n => n.id !== action.payload) + ] + }; + default: + throw new Error(); + } +} + +/*eslint-disable react-hooks/exhaustive-deps*/ +function Notifications ({ children }) { + const [state, dispatch] = React.useReducer(reducer, initialState); + + const contextValue = React.useMemo(() => ({ state, dispatch }), [state, dispatch]); + + return ( + {children} + ); +} + +function useNotificationDispatcher() { + const {dispatch} = React.useContext(NotificationContext); + return dispatch; +} + +export { + Notifications, + NotificationContext, + useNotificationDispatcher, + Provider as NotificationProvider, + Consumer as NotificationConsumer +}; \ No newline at end of file diff --git a/ui/src/app/schema-form/model/messages.ts b/ui/src/app/schema-form/model/messages.ts deleted file mode 100644 index 6d6fa61fd..000000000 --- a/ui/src/app/schema-form/model/messages.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const HARD_CODED_REQUIRED_MSG = RegExp('Missing required property'); - -export const REQUIRED_MSG_OVERRIDE = 'message.required'; \ No newline at end of file diff --git a/ui/src/app/schema-form/model/one-of.ts b/ui/src/app/schema-form/model/one-of.ts deleted file mode 100644 index 7a33306e4..000000000 --- a/ui/src/app/schema-form/model/one-of.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface OneOf { - enum: string[]; - description: string; -} diff --git a/ui/src/app/schema-form/registry.ts b/ui/src/app/schema-form/registry.ts deleted file mode 100644 index 428d2d7fa..000000000 --- a/ui/src/app/schema-form/registry.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { BooleanRadioComponent } from './widget/boolean-radio/boolean-radio.component'; -import { FieldsetComponent } from './widget/fieldset/fieldset.component'; -import { CustomStringComponent } from './widget/string/string.component'; - -import { WidgetRegistry } from 'ngx-schema-form'; - -import { ButtonWidget } from 'ngx-schema-form'; -import { FileWidget } from 'ngx-schema-form'; -import { RangeWidget } from 'ngx-schema-form'; -import { CustomSelectComponent } from './widget/select/select.component'; -import { DatalistComponent } from './widget/datalist/datalist.component'; -import { CustomCheckboxComponent } from './widget/check/checkbox.component'; -import { CustomTextAreaComponent } from './widget/textarea/textarea.component'; -import { CustomArrayComponent } from './widget/array/array.component'; -import { CustomIntegerComponent } from './widget/number/number.component'; -import { FilterTargetComponent } from './widget/filter-target/filter-target.component'; -import { ChecklistComponent } from './widget/check/checklist.component'; -import { IconButtonComponent } from './widget/button/icon-button.component'; -import { CustomObjectWidget } from './widget/object/object.component'; -import { CustomRadioComponent } from './widget/radio/radio.component'; -import { InlineObjectListComponent } from './widget/array/inline-obj-list.component'; -import { InlineObjectComponent } from './widget/object/inline-obj.component'; -import { CustomFloatComponent } from './widget/number/float.component'; -import { Injectable } from "@angular/core"; - -@Injectable() -export class CustomWidgetRegistry extends WidgetRegistry { - constructor() { - super(); - - /* Custom */ - this.register('string', CustomStringComponent); - this.register('search', CustomStringComponent); - this.register('tel', CustomStringComponent); - this.register('url', CustomStringComponent); - this.register('email', CustomStringComponent); - this.register('password', CustomStringComponent); - this.register('color', CustomStringComponent); - this.register('date', CustomStringComponent); - this.register('date-time', CustomStringComponent); - this.register('time', CustomStringComponent); - - this.register('boolean-radio', BooleanRadioComponent); - - this.register('fieldset', FieldsetComponent); - this.register('object', CustomObjectWidget); - this.register('inline-obj-list', InlineObjectListComponent); - this.register('inline-obj', InlineObjectComponent); - - this.register('array', CustomArrayComponent); - this.register('checklist', ChecklistComponent); - - this.register('select', CustomSelectComponent); - this.register('boolean', CustomCheckboxComponent); - this.register('checkbox', CustomCheckboxComponent); - - this.register('textarea', CustomTextAreaComponent); - - this.register('integer', CustomIntegerComponent); - this.register('number', CustomIntegerComponent); - this.register('float', CustomFloatComponent); - - this.register('datalist', DatalistComponent); - - this.register('filter-target', FilterTargetComponent); - - this.register('icon-button', IconButtonComponent); - - this.register('radio', CustomRadioComponent); - - /* NGX-Form */ - this.register('range', RangeWidget); - - this.register('file', FileWidget); - this.register('button', ButtonWidget); - - this.setDefaultWidget(CustomStringComponent); - } -} diff --git a/ui/src/app/schema-form/schema-form.module.ts b/ui/src/app/schema-form/schema-form.module.ts deleted file mode 100644 index 034b895c1..000000000 --- a/ui/src/app/schema-form/schema-form.module.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { NgModule, ModuleWithProviders } from '@angular/core'; -import { SchemaFormModule } from 'ngx-schema-form'; -import { CommonModule } from '@angular/common'; -import { ReactiveFormsModule } from '@angular/forms'; - -import { BooleanRadioComponent } from './widget/boolean-radio/boolean-radio.component'; -import { SchemaService } from './service/schema.service'; -import { FieldsetComponent } from './widget/fieldset/fieldset.component'; -import { CustomStringComponent } from './widget/string/string.component'; -import { NgbPopoverModule, NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; -import { SharedModule } from '../shared/shared.module'; -import { CustomSelectComponent } from './widget/select/select.component'; -import { DatalistComponent } from './widget/datalist/datalist.component'; -import { CustomCheckboxComponent } from './widget/check/checkbox.component'; -import { CustomTextAreaComponent } from './widget/textarea/textarea.component'; -import { CustomArrayComponent } from './widget/array/array.component'; -import { CustomIntegerComponent } from './widget/number/number.component'; -import { CustomFloatComponent } from './widget/number/float.component'; -import { FilterTargetComponent } from './widget/filter-target/filter-target.component'; -import { ChecklistComponent } from './widget/check/checklist.component'; -import { IconButtonComponent } from './widget/button/icon-button.component'; -import { I18nModule } from '../i18n/i18n.module'; -import { CustomObjectWidget } from './widget/object/object.component'; -import { CustomRadioComponent } from './widget/radio/radio.component'; -import { InlineObjectListComponent } from './widget/array/inline-obj-list.component'; -import { InlineObjectComponent } from './widget/object/inline-obj.component'; - -export const COMPONENTS = [ - BooleanRadioComponent, - FieldsetComponent, - CustomStringComponent, - CustomSelectComponent, - DatalistComponent, - CustomCheckboxComponent, - CustomTextAreaComponent, - CustomArrayComponent, - CustomIntegerComponent, - CustomFloatComponent, - FilterTargetComponent, - ChecklistComponent, - IconButtonComponent, - CustomRadioComponent, - CustomObjectWidget, - InlineObjectListComponent, - InlineObjectComponent -]; - -@NgModule({ - imports: [ - CommonModule, - ReactiveFormsModule, - NgbPopoverModule, - NgbDropdownModule, - SharedModule, - I18nModule, - SchemaFormModule.forRoot() - ], - declarations: COMPONENTS, - entryComponents: COMPONENTS, - exports: [ - ...COMPONENTS, - SchemaFormModule, - SharedModule - ], -}) -export class FormModule { - static forRoot(): ModuleWithProviders { - return { - ngModule: RootFormModule, - providers: [ - SchemaService - ] - }; -} -} - -@NgModule({ - imports: [], -}) -export class RootFormModule { } diff --git a/ui/src/app/schema-form/service/schema.service.spec.ts b/ui/src/app/schema-form/service/schema.service.spec.ts deleted file mode 100644 index eac84cd95..000000000 --- a/ui/src/app/schema-form/service/schema.service.spec.ts +++ /dev/null @@ -1,261 +0,0 @@ -import { TestBed, inject } from '@angular/core/testing'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; -import { HttpClientModule } from '@angular/common/http'; -import { SchemaService } from './schema.service'; - -describe(`Schema Service`, () => { - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - HttpClientModule, - HttpClientTestingModule - ], - providers: [ - SchemaService - ] - }); - }); - - describe('isRequired method', () => { - it(`should return false if no property is provided`, inject([SchemaService], (service: SchemaService) => { - expect(service.isRequired(null)).toBe(false); - })); - it(`should return false if no properties are defined`, inject([SchemaService], (service: SchemaService) => { - expect(service.isRequired({ - parent: { schema: {} }, - path: '' - })).toBe(false); - })); - - it(`should return true if the property is required`, inject([SchemaService], (service: SchemaService) => { - expect(service.isRequired({ - parent: { schema: { - properties: { - foo: { - type: 'string' - } - }, - required: ['foo'] - } }, - path: '/foo' - })).toBe(true); - })); - - it(`should return true if the property is currently required based on anyOf`, - inject([SchemaService], (service: SchemaService) => { - expect(service.isRequired({ - parent: { - schema: { - properties: { - foo: { type: 'string' }, - bar: { type: 'string' } - }, - anyOf: [ - { - properties: { - foo: { enum: [ true ] } - }, - required: [ 'bar' ] - }, - { - properties: { - foo: { enum: [ false ] } - } - } - ] - }, - value: { foo: true } - }, - path: '/bar' - })).toBe(true); - }) - ); - - it(`should return true if the property is NOT currently required based on anyOf`, - inject([SchemaService], (service: SchemaService) => { - expect(service.isRequired({ - parent: { - schema: { - properties: { - foo: { type: 'string' }, - bar: { type: 'string' } - }, - anyOf: [ - { - properties: { - foo: { enum: [true] } - }, - required: ['bar'] - }, - { - properties: { - foo: { enum: [false] } - } - } - ] - }, - value: { foo: false } - }, - path: '/bar' - })).toBe(false); - }) - ); - - it(`should return false if the property is NOT currently in any values`, - inject([SchemaService], (service: SchemaService) => { - expect(service.isRequired({ - parent: { - schema: { - properties: { - foo: { type: 'string' }, - bar: { type: 'string' } - }, - anyOf: [ - { - properties: { - foo: { enum: [true] } - }, - required: ['bar'] - }, - { - properties: { - foo: { enum: [false] } - } - } - ] - }, - value: {} - }, - path: '/bar' - })).toBe(false); - }) - ); - - it(`should return true if dependant on multiple values and any is true`, - inject([SchemaService], (service: SchemaService) => { - expect(service.isRequired({ - parent: { - schema: { - properties: { - foo: { type: 'string' }, - bar: { type: 'string' }, - baz: { type: 'string' } - }, - anyOf: [ - { - properties: { - foo: { enum: [true] } - }, - required: ['bar'] - }, - { - properties: { - baz: { enum: [true] } - }, - required: ['bar'] - }, - { - properties: { - foo: { enum: [false] } - } - } - ] - }, - value: { - foo: true, - baz: true - } - }, - path: '/bar' - })).toBe(true); - }) - ); - - it(`should return true if dependency is active`, - inject([SchemaService], (service: SchemaService) => { - expect(service.isRequired({ - parent: { - schema: { - properties: { - foo: { type: 'string' }, - bar: { type: 'string' }, - baz: { type: 'string' } - }, - dependencies: { - foo: { required: ['bar', 'baz'] }, - bar: { required: ['foo', 'baz'] }, - baz: { required: ['foo', 'bar'] } - } - }, - value: { - foo: 'abcdef' - } - }, - path: '/bar' - })).toBe(true); - }) - ); - - it(`should return true if the property has an active dependency`, - inject([SchemaService], (service: SchemaService) => { - expect(service.isRequired({ - parent: { - schema: { - properties: { - foo: { type: 'string' }, - bar: { type: 'string' }, - baz: { type: 'string' } - }, - dependencies: { - foo: { required: ['bar', 'baz'] }, - bar: { required: ['foo', 'baz'] }, - baz: { required: ['foo', 'bar'] } - } - }, - value: { - foo: 'abc', - bar: '123' - } - }, - path: '/foo' - })).toBe(true); - }) - ); - - it(`should return false if no dependencies are defined`, - inject([SchemaService], (service: SchemaService) => { - expect(service.isRequired({ - parent: { - schema: { - properties: { - foo: { type: 'string' }, - bar: { type: 'string' }, - baz: { type: 'string' } - } - }, - value: { - foo: true, - baz: true - } - }, - path: '/bar' - })).toBe(false); - }) - ); - }); - - describe('getRequiredDependencies method', () => { - it('should return the provided result if an array', inject([SchemaService], (service: SchemaService) => { - expect(service.getRequiredDependencies(['foo', 'bar'])).toEqual(['foo', 'bar']); - })); - - it('should return the content of the required attribute if provided', inject([SchemaService], (service: SchemaService) => { - expect(service.getRequiredDependencies({required: ['foo', 'bar'] })).toEqual(['foo', 'bar']); - })); - - it('should return an empty array if not provided with required property', inject([SchemaService], (service: SchemaService) => { - expect(service.getRequiredDependencies({ foo: 'bar' })).toEqual([]); - })); - }); -}); diff --git a/ui/src/app/schema-form/service/schema.service.ts b/ui/src/app/schema-form/service/schema.service.ts deleted file mode 100644 index 0e5905a8a..000000000 --- a/ui/src/app/schema-form/service/schema.service.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpClient, } from '@angular/common/http'; -import { Observable } from 'rxjs'; - -@Injectable() -export class SchemaService { - - constructor( - private http: HttpClient - ) { } - - get(path: string): Observable { - return this.http.get(`${path}`); - } - - isRequired(formProperty: any): boolean { - let required = false; - if (!formProperty || !formProperty.parent) { - return false; - } - - let requiredFields = formProperty.parent.schema.required || []; - let fieldPath = formProperty.path; - let controlName = fieldPath.substr(fieldPath.lastIndexOf('/') + 1); - required = requiredFields.indexOf(controlName) > -1; - - if (!required) { - const conditions = formProperty.parent.schema.anyOf || []; - const values = formProperty.parent.value; - const currentConditions = conditions.filter(condition => - 'properties' in condition ? Object - .keys(condition.properties) - .some( - key => values.hasOwnProperty(key) && condition.properties[key].enum ? - condition.properties[key].enum[0] === values[key] : false - ) - : false - ); - currentConditions.forEach(el => { - requiredFields = el.required || []; - required = !required ? requiredFields.indexOf(controlName) > -1 : required; - }); - } - - if (!required && formProperty.parent instanceof Object) { - const parent = formProperty.parent; - const dependencies = parent.schema.dependencies; - if (dependencies) { - const isDependencyOf = Object.keys(dependencies).filter(d => { - let dep = dependencies[d]; - return this.getRequiredDependencies(dep); - }); - const hasActiveDependencies = dependencies.hasOwnProperty(controlName) && - this.getRequiredDependencies(dependencies[controlName]).filter( - d => parent.value.hasOwnProperty(d) - ); - const isRequired = isDependencyOf.some(d => parent.value.hasOwnProperty(d) && !!parent.value[d]); - required = isRequired || !!hasActiveDependencies.length; - } - } - - return required; - } - - getRequiredDependencies(dep: any): string[] { - return (dep instanceof Array) ? dep : dep.hasOwnProperty('required') ? dep.required : []; - } -} diff --git a/ui/src/app/schema-form/widget/array/array.component.html b/ui/src/app/schema-form/widget/array/array.component.html deleted file mode 100644 index 84a5a1e9b..000000000 --- a/ui/src/app/schema-form/widget/array/array.component.html +++ /dev/null @@ -1,70 +0,0 @@ -
-
- -    - -   - - - - - - , - {{ error.message }} - - -
-
    -
  • -
    - - - -
    - -
    -
    - -
    -
    - - - -   - - - - (default) - - - -
    -
    -
    - -
    -
    -
    -
    -
    -
  • -
- - {{ schema.description }} - -
\ No newline at end of file diff --git a/ui/src/app/schema-form/widget/array/array.component.ts b/ui/src/app/schema-form/widget/array/array.component.ts deleted file mode 100644 index 82a089635..000000000 --- a/ui/src/app/schema-form/widget/array/array.component.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { Component, AfterViewInit } from '@angular/core'; - -import { ArrayWidget } from 'ngx-schema-form'; -import { map } from 'rxjs/operators'; -import { Observable, Subscription } from 'rxjs'; -import { FormProperty } from 'ngx-schema-form/lib/model/formproperty'; - -export interface FormError { - code: string; - description: string; - message: string; - params?: any[]; - path: string; - schemaId?: any; -} - -@Component({ - selector: 'array-component', - templateUrl: `./array.component.html` -}) -export class CustomArrayComponent extends ArrayWidget implements AfterViewInit { - errors$: Observable; - hasErrors$: Observable; - hasErrorSub: Subscription; - - messages = { - ARRAY_UNIQUE: 'message.array-items-must-be-unique' - }; - - ngAfterViewInit(): void { - this.errors$ = this.formProperty.errorsChanges.pipe( - map(errors => errors ? - errors.filter(err => err.code !== 'UNRESOLVABLE_REFERENCE').reduce((coll, err) => { - coll[err.code] = err; - return coll; - }, {}) : {}), - map(collection => Object.values(collection)) - ); - - this.hasErrors$ = this.errors$.pipe(map(errors => !!errors.length)); - } - - removeItem(item: FormProperty = null): void { - this.formProperty.properties = (this.formProperty.properties).filter(i => i !== item); - this.formProperty.updateValueAndValidity(false, true); - } - - addItem(): void { - super.addItem(); - } - - getListType(property: any): string { - return property.properties.length ? property.properties[0].type : null; - } -} diff --git a/ui/src/app/schema-form/widget/array/inline-obj-list.component.html b/ui/src/app/schema-form/widget/array/inline-obj-list.component.html deleted file mode 100644 index 2afe19994..000000000 --- a/ui/src/app/schema-form/widget/array/inline-obj-list.component.html +++ /dev/null @@ -1,56 +0,0 @@ -
-
- -    - -   - - - - - - , - {{ error.message }} - - -
-
    -
  • -
    -
    -
    -
    - - -   - - - - - (default) - - - - -
    -
    -
    - -
    -
    -
    -
    -
  • -
- - {{ schema.description }} - -
\ No newline at end of file diff --git a/ui/src/app/schema-form/widget/array/inline-obj-list.component.ts b/ui/src/app/schema-form/widget/array/inline-obj-list.component.ts deleted file mode 100644 index 0062cd0f3..000000000 --- a/ui/src/app/schema-form/widget/array/inline-obj-list.component.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Component } from '@angular/core'; - -import { CustomArrayComponent } from './array.component'; - -/* tslint:disable */ -@Component({ - selector: 'inline-obj-list', - templateUrl: `./inline-obj-list.component.html` -}) -export class InlineObjectListComponent extends CustomArrayComponent { } diff --git a/ui/src/app/schema-form/widget/boolean-radio/boolean-radio.component.html b/ui/src/app/schema-form/widget/boolean-radio/boolean-radio.component.html deleted file mode 100644 index 217dd94ee..000000000 --- a/ui/src/app/schema-form/widget/boolean-radio/boolean-radio.component.html +++ /dev/null @@ -1,29 +0,0 @@ -
- - {{ schema.description }} -
- -
- - -
-
-
- -
\ No newline at end of file diff --git a/ui/src/app/schema-form/widget/boolean-radio/boolean-radio.component.scss b/ui/src/app/schema-form/widget/boolean-radio/boolean-radio.component.scss deleted file mode 100644 index 333cbb84e..000000000 --- a/ui/src/app/schema-form/widget/boolean-radio/boolean-radio.component.scss +++ /dev/null @@ -1,5 +0,0 @@ -:host { - .control-label { - display: block; - } -} diff --git a/ui/src/app/schema-form/widget/boolean-radio/boolean-radio.component.spec.ts b/ui/src/app/schema-form/widget/boolean-radio/boolean-radio.component.spec.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/ui/src/app/schema-form/widget/boolean-radio/boolean-radio.component.ts b/ui/src/app/schema-form/widget/boolean-radio/boolean-radio.component.ts deleted file mode 100644 index d4ad09d6f..000000000 --- a/ui/src/app/schema-form/widget/boolean-radio/boolean-radio.component.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Component, AfterViewInit } from '@angular/core'; -import { ControlWidget } from 'ngx-schema-form'; - -@Component({ - selector: 'boolean-radio', - templateUrl: './boolean-radio.component.html', - styleUrls: ['./boolean-radio.component.scss'] -}) -export class BooleanRadioComponent extends ControlWidget implements AfterViewInit { - ngAfterViewInit(): void { - super.ngAfterViewInit(); - if (this.schema.readOnly) { - this.control.disable(); - } else { - this.control.enable(); - } - } -} diff --git a/ui/src/app/schema-form/widget/button/icon-button.component.html b/ui/src/app/schema-form/widget/button/icon-button.component.html deleted file mode 100644 index 7ed1f4f3b..000000000 --- a/ui/src/app/schema-form/widget/button/icon-button.component.html +++ /dev/null @@ -1,9 +0,0 @@ - \ No newline at end of file diff --git a/ui/src/app/schema-form/widget/button/icon-button.component.ts b/ui/src/app/schema-form/widget/button/icon-button.component.ts deleted file mode 100644 index f023330b6..000000000 --- a/ui/src/app/schema-form/widget/button/icon-button.component.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { - Component, AfterViewInit, ChangeDetectorRef -} from '@angular/core'; -import { ButtonWidget, ActionRegistry } from 'ngx-schema-form'; - -@Component({ - selector: 'icon-button', - templateUrl: `./icon-button.component.html` -}) -export class IconButtonComponent extends ButtonWidget implements AfterViewInit { - - visible = false; - - action = (e) => {}; - - constructor( - private actionRegistry: ActionRegistry, - private changeDetector: ChangeDetectorRef - ) { - super(); - } - - ngAfterViewInit(): void { - this.action = (e) => { - let action = this.actionRegistry.get(this.button.id); - if (this.button.id && action) { - action(this.formProperty, this.button.parameters); - } - e.preventDefault(); - }; - - this.visible = !!this.actionRegistry.get(this.button.id); - this.changeDetector.detectChanges(); - } -} diff --git a/ui/src/app/schema-form/widget/check/checkbox.component.html b/ui/src/app/schema-form/widget/check/checkbox.component.html deleted file mode 100644 index 538251826..000000000 --- a/ui/src/app/schema-form/widget/check/checkbox.component.html +++ /dev/null @@ -1,38 +0,0 @@ -
- -
-
- - -
-
- -
-
-
- -
- -
-
-
diff --git a/ui/src/app/schema-form/widget/check/checkbox.component.ts b/ui/src/app/schema-form/widget/check/checkbox.component.ts deleted file mode 100644 index ebb784d71..000000000 --- a/ui/src/app/schema-form/widget/check/checkbox.component.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Component } from '@angular/core'; - -import { CheckboxWidget } from 'ngx-schema-form'; - -@Component({ - selector: 'checkbox-component', - templateUrl: `./checkbox.component.html` -}) -export class CustomCheckboxComponent extends CheckboxWidget { } diff --git a/ui/src/app/schema-form/widget/check/checklist.component.html b/ui/src/app/schema-form/widget/check/checklist.component.html deleted file mode 100644 index ed7ac4fe6..000000000 --- a/ui/src/app/schema-form/widget/check/checklist.component.html +++ /dev/null @@ -1,57 +0,0 @@ -
- - {{ schema.title }} - - - - - - - - - - - - - - - - - - - - - - -
Attribute NameYes
{{ attr.label | translate }} -
-
- - -
-
-
Check All Attributes - -
Clear All Attributes - -
-
\ No newline at end of file diff --git a/ui/src/app/schema-form/widget/check/checklist.component.ts b/ui/src/app/schema-form/widget/check/checklist.component.ts deleted file mode 100644 index e7a056690..000000000 --- a/ui/src/app/schema-form/widget/check/checklist.component.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { Component, AfterViewInit, OnDestroy } from '@angular/core'; - -import { ArrayWidget } from 'ngx-schema-form'; -import { AttributesService } from '../../../metadata/domain/service/attributes.service'; -import { Observable, of, Subscription } from 'rxjs'; - -/* istanbul ignore next */ -@Component({ - selector: 'checklist-component', - templateUrl: `./checklist.component.html` -}) -export class ChecklistComponent extends ArrayWidget implements AfterViewInit, OnDestroy { - checked: any = {}; - currentData: { key: string, label: string }[]; - sub: Subscription; - - constructor( - private attributes: AttributesService - ) { - super(); - } - - ngAfterViewInit(): void { - super.ngAfterViewInit(); - this.formProperty.value.forEach(val => this.checked[val] = true); - - this.sub = this.data.subscribe(d => this.currentData = d); - } - - ngOnDestroy(): void { - this.sub.unsubscribe(); - } - - private commitValue(): void { - this.formProperty.setValue(Object.keys(this.checked), false); - } - - get data(): Observable<{ key: string, label: string }[]> { - return this.schema.widget.data ? of(this.schema.widget.data) : this.attributes.query(this.schema.widget.dataUrl); - } - - onCheck(value) { - if (!this.checked[value]) { - this.checked[value] = true; - } else { - delete this.checked[value]; - } - this.commitValue(); - } - - onCheckAll(): void { - this.currentData.forEach(attr => this.checked[attr.key] = true); - this.commitValue(); - } - onCheckNone(event: Event | null = null): void { - this.currentData.forEach(attr => { - delete this.checked[attr.key]; - }); - this.commitValue(); - } -} diff --git a/ui/src/app/schema-form/widget/datalist/datalist.component.html b/ui/src/app/schema-form/widget/datalist/datalist.component.html deleted file mode 100644 index cacc3c319..000000000 --- a/ui/src/app/schema-form/widget/datalist/datalist.component.html +++ /dev/null @@ -1,44 +0,0 @@ -
- - {{ schema.description }} - - - - - {{ schema.widget.help }} - - - - , - error - - - -
diff --git a/ui/src/app/schema-form/widget/datalist/datalist.component.ts b/ui/src/app/schema-form/widget/datalist/datalist.component.ts deleted file mode 100644 index 728af8f3f..000000000 --- a/ui/src/app/schema-form/widget/datalist/datalist.component.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { Component, AfterViewInit } from '@angular/core'; - -import { ControlWidget } from 'ngx-schema-form'; -import { SchemaService } from '../../service/schema.service'; -import { HARD_CODED_REQUIRED_MSG } from '../../model/messages'; - -@Component({ - selector: 'datalist-component', - templateUrl: `./datalist.component.html` -}) -export class DatalistComponent extends ControlWidget implements AfterViewInit { - - data: string[] = []; - - constructor( - private widgetService: SchemaService - ) { - super(); - } - - ngAfterViewInit(): void { - super.ngAfterViewInit(); - if (this.schema.readOnly) { - this.control.disable(); - } else { - this.control.enable(); - } - } - - getData(query: string): void { - this.data = [...this.schema.widget.data]; - } - - get required(): boolean { - return this.widgetService.isRequired(this.formProperty); - } - - get title(): string { - return this.schema.title || this.formProperty.parent.schema.title; - } - - getError(error: string): string { - return HARD_CODED_REQUIRED_MSG.test(error) ? 'message.required' : error; - } - - get showHint(): boolean { - return (this.control.touched ? !this.showError : true) && this.schema.widget.help; - } - - get showError(): boolean { - return !!this.errorMessages && this.errorMessages.length > 0; - } -} diff --git a/ui/src/app/schema-form/widget/fieldset/fieldset.component.html b/ui/src/app/schema-form/widget/fieldset/fieldset.component.html deleted file mode 100644 index 90a0e09ba..000000000 --- a/ui/src/app/schema-form/widget/fieldset/fieldset.component.html +++ /dev/null @@ -1,23 +0,0 @@ -
-
- -
- - {{ fieldset.title }} - -

{{ fieldset.description }}

-
-
- -
-
-
-
-
-
\ No newline at end of file diff --git a/ui/src/app/schema-form/widget/fieldset/fieldset.component.scss b/ui/src/app/schema-form/widget/fieldset/fieldset.component.scss deleted file mode 100644 index ac2db04af..000000000 --- a/ui/src/app/schema-form/widget/fieldset/fieldset.component.scss +++ /dev/null @@ -1,8 +0,0 @@ -:host { - fieldset { - margin-bottom: 1rem; - legend { - font-size: 1rem; - } - } -} diff --git a/ui/src/app/schema-form/widget/fieldset/fieldset.component.ts b/ui/src/app/schema-form/widget/fieldset/fieldset.component.ts deleted file mode 100644 index a7246cbfc..000000000 --- a/ui/src/app/schema-form/widget/fieldset/fieldset.component.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Component } from '@angular/core'; - -import { ObjectWidget } from 'ngx-schema-form'; - -@Component({ - selector: 'fieldset-object', - templateUrl: `./fieldset.component.html`, - styleUrls: ['./fieldset.component.scss'] -}) -export class FieldsetComponent extends ObjectWidget { } diff --git a/ui/src/app/schema-form/widget/filter-target/filter-target.component.html b/ui/src/app/schema-form/widget/filter-target/filter-target.component.html deleted file mode 100644 index 2f3cd28b0..000000000 --- a/ui/src/app/schema-form/widget/filter-target/filter-target.component.html +++ /dev/null @@ -1,124 +0,0 @@ -
-
-
-
- -
- - -
-
-
-
- -
-
- - - - - - You must add at least one entity id target and they must each be unique. - - - - -

- - - Required for Scripts - -   - -
- - - - Required for Regex -   - - - - , - {{ error.message }} - - - -
-
- -
-
-
-
-
- -
-
    -
  • - {{ id }} - - - - - -
  • -
-
-
-
-
\ No newline at end of file diff --git a/ui/src/app/schema-form/widget/filter-target/filter-target.component.scss b/ui/src/app/schema-form/widget/filter-target/filter-target.component.scss deleted file mode 100644 index 13926cdb3..000000000 --- a/ui/src/app/schema-form/widget/filter-target/filter-target.component.scss +++ /dev/null @@ -1,3 +0,0 @@ -:host { - -} \ No newline at end of file diff --git a/ui/src/app/schema-form/widget/filter-target/filter-target.component.ts b/ui/src/app/schema-form/widget/filter-target/filter-target.component.ts deleted file mode 100644 index 7eed2fca9..000000000 --- a/ui/src/app/schema-form/widget/filter-target/filter-target.component.ts +++ /dev/null @@ -1,172 +0,0 @@ -import { Component, OnDestroy, AfterViewInit } from '@angular/core'; -import { FormControl, Validators, AbstractControl, ValidatorFn } from '@angular/forms'; -import { ObjectWidget } from 'ngx-schema-form'; -import { Store } from '@ngrx/store'; -import { Observable, Subject } from 'rxjs'; -import { distinctUntilChanged, skipWhile, takeUntil, map, withLatestFrom, filter, switchMap, startWith } from 'rxjs/operators'; - -import * as fromRoot from '../../../app.reducer'; -import * as fromFilters from '../../../metadata/filter/reducer'; - -import { QueryEntityIds, ClearSearch } from '../../../metadata/filter/action/search.action'; - -/* istanbul ignore next */ -@Component({ - selector: 'filter-target', - templateUrl: `./filter-target.component.html`, - styleUrls: ['./filter-target.component.scss'] -}) -export class FilterTargetComponent extends ObjectWidget implements OnDestroy, AfterViewInit { - private ngUnsubscribe: Subject = new Subject(); - ids$: Observable; - idCount$: Observable; - - search: FormControl = new FormControl( - '', - [], - [] - ); - - script: FormControl = new FormControl( - '', - [Validators.required] - ); - - errors$: Observable; - hasErrors$: Observable; - - constructor( - private store: Store - ) { - super(); - this.ids$ = this.store.select(fromFilters.getEntityCollection); - - this.idCount$ = this.ids$.pipe(map(list => list.length)); - - this.search - .valueChanges - .pipe( - takeUntil(this.ngUnsubscribe), - distinctUntilChanged(), - withLatestFrom(this.ids$), - filter(([term, ids]) => term && term.length >= 4 && ids.indexOf(term) < 0), - map(([term]) => new QueryEntityIds({ - term, - limit: 10 - })) - ) - .subscribe(action => this.store.dispatch(action)); - - this.script - .valueChanges - .pipe( - takeUntil(this.ngUnsubscribe), - distinctUntilChanged(), - skipWhile(() => this.targetType === 'ENTITY') - ) - .subscribe(script => { - this.setTargetValue([script]); - }); - } - - ngAfterViewInit(): void { - super.ngAfterViewInit(); - this.script.setValue(this.targets[0]); - this.search.setValidators(this.unique()); - - this.errors$ = this.formProperty.errorsChanges.pipe( - map(errors => - errors && errors.length > 1 ? - Array - .from(new Set(errors.filter(e => e.code !== 'ARRAY_LENGTH_SHORT').map(e => e.code))) - .map(id => ({ ...errors.find(e => e.code === id) })) - : [] - )); - - this.errors$ - .pipe( - takeUntil(this.ngUnsubscribe), - map(errors => errors.reduce((collection, e) => ({ ...collection, [e.code]: e.message }), {})), - map(errors => Object.keys(errors).length > 0 ? errors : null) - ) - .subscribe(errors => this.script.setErrors( - errors, - { - emitEvent: true - } - ) - ); - - this.hasErrors$ = this.errors$.pipe(map(e => e && e.length > 0)); - } - - unique(): ValidatorFn { - return (control: AbstractControl): { [key: string]: any } | null => { - return this.targets.indexOf(control.value) > -1 ? { unique: true } : null; - }; - } - - getButtonConfig(id: string): any { - let buttons = this.formProperty.getProperty('value').schema.buttons; - return (buttons || []).map(btn => ({ - ...btn, - parameters: { - id - } - })); - } - - get targets(): string[] { - return this.formProperty.getProperty('value').value; - } - - get targetType(): string { - return this.formProperty.getProperty(this.targetAttribute).value; - } - - get displayType(): string { - if (!this.targetAttribute) { - return null; - } - return this.typeOptions.find(opt => opt.value === this.targetType).description; - } - - get targetAttribute(): string { - return this.formProperty.schema.widget.target; - } - - get typeOptions(): any[] { - return this.formProperty - .getProperty(this.targetAttribute) - .schema - .oneOf - .map(option => ({ ...option, value: option.enum[0] })); - } - - select(value: string): void { - this.formProperty.getProperty(this.targetAttribute).setValue(value); - this.setTargetValue([]); - this.script.reset(); - this.search.reset(); - } - - removeId(id: string): void { - let rest = this.targets.filter(target => target !== id); - this.setTargetValue(rest); - } - - setTargetValue(value: string[]): void { - this.formProperty.getProperty('value').setValue(value); - } - - onSelectValue(value: string): void { - this.setTargetValue([...this.formProperty.getProperty('value').value, value]); - this.search.reset(null); - } - - ngOnDestroy(): void { - this.store.dispatch(new ClearSearch()); - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - } -} diff --git a/ui/src/app/schema-form/widget/number/float.component.html b/ui/src/app/schema-form/widget/number/float.component.html deleted file mode 100644 index 3781e45e0..000000000 --- a/ui/src/app/schema-form/widget/number/float.component.html +++ /dev/null @@ -1,43 +0,0 @@ -
- - {{schema.description}} - - - - {{ schema.widget.help }} - - - - , - error - - - -
diff --git a/ui/src/app/schema-form/widget/number/float.component.ts b/ui/src/app/schema-form/widget/number/float.component.ts deleted file mode 100644 index bcdb2b5a8..000000000 --- a/ui/src/app/schema-form/widget/number/float.component.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { - Component, AfterViewInit, ViewChild, ElementRef, -} from '@angular/core'; -import { IntegerWidget } from 'ngx-schema-form'; -import { SchemaService } from '../../service/schema.service'; -import { HARD_CODED_REQUIRED_MSG, REQUIRED_MSG_OVERRIDE } from '../../model/messages'; - -@Component({ - selector: 'float-component', - templateUrl: `./float.component.html` -}) -export class CustomFloatComponent extends IntegerWidget implements AfterViewInit { - private _displayValue: string; - @ViewChild('input', { static: true }) element: ElementRef; - - constructor( - private widgetService: SchemaService - ) { - super(); - } - - ngAfterViewInit() { - const control = this.control; - - if (this.formProperty.value) { - control.setValue(this.formProperty.value, { emitEvent: false }); - } - this.formProperty.errorsChanges.subscribe((errors) => { - control.setErrors(errors, { emitEvent: true }); - const messages = (errors || []) - .filter(e => { - return e.path && e.path.slice(1) === this.formProperty.path; - }) - .map(e => e.message); - this.errorMessages = messages.filter((m, i) => messages.indexOf(m) === i); - }); - control.valueChanges.subscribe((newValue) => { - const native = (this.element.nativeElement); - this._displayValue = newValue; - if (newValue === '' && this.required) { - this.formProperty.setValue(native.valueAsNumber, false); - this.formProperty.extendErrors([{ - code: 'INVALID_NUMBER', - path: `#${this.formProperty.path}`, - message: 'Invalid number', - }]); - } else if (newValue === '' && !this.required) { - this.formProperty.setValue(null, false); - } else { - this.formProperty.setValue(newValue, false); - } - }); - } - - get required(): boolean { - return this.widgetService.isRequired(this.formProperty); - } - - get minimum(): number { - return this.required ? - this.schema.minimum : - this.formProperty.value === null ? null : this.schema.minimum; - } - - getError(error: string): string { - return HARD_CODED_REQUIRED_MSG.test(error) ? REQUIRED_MSG_OVERRIDE : error; - } - - get showHint(): boolean { - return (this.control.touched ? !this.showError : true) && this.schema.widget.help; - } - - get showError(): boolean { - return !!this.errorMessages && this.errorMessages.length > 0; - } -} diff --git a/ui/src/app/schema-form/widget/number/number.component.html b/ui/src/app/schema-form/widget/number/number.component.html deleted file mode 100644 index 053269b8c..000000000 --- a/ui/src/app/schema-form/widget/number/number.component.html +++ /dev/null @@ -1,45 +0,0 @@ -
- - - {{schema.description}} - - - - - {{ schema.widget.help }} - - - - , - error - - - -
diff --git a/ui/src/app/schema-form/widget/number/number.component.ts b/ui/src/app/schema-form/widget/number/number.component.ts deleted file mode 100644 index e6885edeb..000000000 --- a/ui/src/app/schema-form/widget/number/number.component.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { - Component, -} from '@angular/core'; -import { IntegerWidget } from 'ngx-schema-form'; -import { SchemaService } from '../../service/schema.service'; -import { HARD_CODED_REQUIRED_MSG, REQUIRED_MSG_OVERRIDE } from '../../model/messages'; - -@Component({ - selector: 'integer-component', - templateUrl: `./number.component.html` -}) -export class CustomIntegerComponent extends IntegerWidget { - constructor( - private widgetService: SchemaService - ) { - super(); - } - - get required(): boolean { - return this.widgetService.isRequired(this.formProperty); - } - - getError(error: string): string { - return HARD_CODED_REQUIRED_MSG.test(error) ? REQUIRED_MSG_OVERRIDE : error; - } - - get showHint(): boolean { - return (this.control.touched ? !this.showError : true) && this.schema.widget.help; - } - - get showError(): boolean { - return !!this.errorMessages && this.errorMessages.length > 0; - } -} diff --git a/ui/src/app/schema-form/widget/object/inline-obj.component.html b/ui/src/app/schema-form/widget/object/inline-obj.component.html deleted file mode 100644 index a9f57749f..000000000 --- a/ui/src/app/schema-form/widget/object/inline-obj.component.html +++ /dev/null @@ -1,9 +0,0 @@ -
- -
-
- -
-
-
-
\ No newline at end of file diff --git a/ui/src/app/schema-form/widget/object/inline-obj.component.ts b/ui/src/app/schema-form/widget/object/inline-obj.component.ts deleted file mode 100644 index 4ab29534a..000000000 --- a/ui/src/app/schema-form/widget/object/inline-obj.component.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Component } from '@angular/core'; - -import { CustomObjectWidget } from './object.component'; - -/* tslint:disable */ -@Component({ - selector: 'inline-obj', - templateUrl: `./inline-obj.component.html` -}) -export class InlineObjectComponent extends CustomObjectWidget { } diff --git a/ui/src/app/schema-form/widget/object/object.component.html b/ui/src/app/schema-form/widget/object/object.component.html deleted file mode 100644 index 7824ef6f6..000000000 --- a/ui/src/app/schema-form/widget/object/object.component.html +++ /dev/null @@ -1,29 +0,0 @@ -
- -
{{error.message | translate}}
-
-
- -
- - {{ fieldset.title }} - -

- {{ fieldset.description }} -

-
-
- -
-
-
-
-
-
\ No newline at end of file diff --git a/ui/src/app/schema-form/widget/object/object.component.ts b/ui/src/app/schema-form/widget/object/object.component.ts deleted file mode 100644 index da584b860..000000000 --- a/ui/src/app/schema-form/widget/object/object.component.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Component, AfterViewInit } from '@angular/core'; - -import { ObjectWidget } from 'ngx-schema-form'; -import { filter, map } from 'rxjs/operators'; -import { Observable } from 'rxjs'; -import { FormError } from '../array/array.component'; - -/* tslint:disable */ -@Component({ - selector: 'custom-object', - templateUrl: `./object.component.html` -}) -export class CustomObjectWidget extends ObjectWidget implements AfterViewInit { - - customErrors$: Observable; - - constructor() { - super(); - } - - ngAfterViewInit(): void { - super.ngAfterViewInit(); - if (this.formProperty) { - this.customErrors$ = this.formProperty.errorsChanges - .pipe( - map(errors => errors ? errors : []), - map(errors => { - return errors.filter(err => err.path.replace('#', '') === (this.formProperty.path)); - }), - map(errors => Object.values(errors.reduce((collection, error) => ({ ...collection, [error.code]: error }), {}))), - map(errors => errors.length ? errors : null) - ) as Observable; - } - } -} diff --git a/ui/src/app/schema-form/widget/radio/radio.component.html b/ui/src/app/schema-form/widget/radio/radio.component.html deleted file mode 100644 index de9187120..000000000 --- a/ui/src/app/schema-form/widget/radio/radio.component.html +++ /dev/null @@ -1,19 +0,0 @@ -
- - - {{schema.description}} - - -
- - -
-
-
\ No newline at end of file diff --git a/ui/src/app/schema-form/widget/radio/radio.component.ts b/ui/src/app/schema-form/widget/radio/radio.component.ts deleted file mode 100644 index 23faf2cc0..000000000 --- a/ui/src/app/schema-form/widget/radio/radio.component.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Component } from '@angular/core'; -import { RadioWidget } from 'ngx-schema-form'; - -@Component({ - selector: 'custom-radio-widget', - templateUrl: `./radio.component.html` -}) -export class CustomRadioComponent extends RadioWidget {} diff --git a/ui/src/app/schema-form/widget/select/select.component.html b/ui/src/app/schema-form/widget/select/select.component.html deleted file mode 100644 index aab941a48..000000000 --- a/ui/src/app/schema-form/widget/select/select.component.html +++ /dev/null @@ -1,69 +0,0 @@ -
- - - {{ schema.description }} - - - - - - {{ schema.widget.help }} - - - - , - error - - - - -
diff --git a/ui/src/app/schema-form/widget/select/select.component.ts b/ui/src/app/schema-form/widget/select/select.component.ts deleted file mode 100644 index a596d740e..000000000 --- a/ui/src/app/schema-form/widget/select/select.component.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { Component, AfterViewInit, OnDestroy } from '@angular/core'; - -import { SelectWidget } from 'ngx-schema-form'; -import { SchemaService } from '../../service/schema.service'; -import { map, shareReplay, startWith } from 'rxjs/operators'; -import { Subscription } from 'rxjs'; -import { HARD_CODED_REQUIRED_MSG } from '../../model/messages'; - -@Component({ - selector: 'select-component', - templateUrl: `./select.component.html` -}) -export class CustomSelectComponent extends SelectWidget implements AfterViewInit, OnDestroy { - - options$: any; - - errorSub: Subscription; - - constructor( - private widgetService: SchemaService - ) { - super(); - } - - ngAfterViewInit(): void { - super.ngAfterViewInit(); - if (this.schema.readOnly || this.schema.widget.disabled) { - this.control.disable(); - } else { - this.control.enable(); - } - - if (!(this.schema.widget instanceof String) && this.schema.widget.dataUrl) { - this.options$ = this.widgetService - .get(this.schema.widget.dataUrl) - .pipe( - shareReplay(), - map(opts => - opts.map(opt => - ({ label: opt.replace('Resolver', 'Provider'), value: opt }) - ) - ) - ); - } - - this.errorSub = this.control.valueChanges.pipe(startWith(this.control.value)).subscribe(v => { - if (!v && this.required && !this.errorMessages.some(msg => HARD_CODED_REQUIRED_MSG.test(msg))) { - this.errorMessages.push('message.required'); - } - }); - } - - ngOnDestroy(): void { - this.errorSub.unsubscribe(); - } - - get required(): boolean { - return this.widgetService.isRequired(this.formProperty); - } - - getError(error: string): string { - return HARD_CODED_REQUIRED_MSG.test(error) ? 'message.required' : error; - } - - get cleanId(): string { - return this.formProperty._canonicalPath.replace('@', ''); - } - - get showHint(): boolean { - return (this.control.touched ? !this.showError : true) && this.schema.widget.help; - } - - get showError(): boolean { - return !!this.errorMessages && this.errorMessages.length > 0; - } -} diff --git a/ui/src/app/schema-form/widget/string/string.component.html b/ui/src/app/schema-form/widget/string/string.component.html deleted file mode 100644 index 561d5f8e4..000000000 --- a/ui/src/app/schema-form/widget/string/string.component.html +++ /dev/null @@ -1,46 +0,0 @@ -
- - - {{ schema.description }} - - - - - - {{ schema.widget.help }} - - - - , - error - - - -
diff --git a/ui/src/app/schema-form/widget/string/string.component.scss b/ui/src/app/schema-form/widget/string/string.component.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/ui/src/app/schema-form/widget/string/string.component.ts b/ui/src/app/schema-form/widget/string/string.component.ts deleted file mode 100644 index d4a3c7ee1..000000000 --- a/ui/src/app/schema-form/widget/string/string.component.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { Component, AfterViewInit, OnDestroy } from '@angular/core'; -import { StringWidget } from 'ngx-schema-form'; -import { SchemaService } from '../../service/schema.service'; -import { startWith } from 'rxjs/operators'; -import { Subscription } from 'rxjs'; - -import { HARD_CODED_REQUIRED_MSG, REQUIRED_MSG_OVERRIDE } from '../../model/messages'; - -@Component({ - selector: 'custom-string', - templateUrl: `./string.component.html`, - styleUrls: ['../widget.component.scss'] -}) -export class CustomStringComponent extends StringWidget implements AfterViewInit, OnDestroy { - - errorSub: Subscription; - - constructor( - private widgetService: SchemaService - ) { - super(); - } - - ngAfterViewInit(): void { - super.ngAfterViewInit(); - let listener = this.formProperty.parent ? this.formProperty.parent : this.control; - this.errorSub = listener.valueChanges.pipe(startWith(listener.value)).subscribe(v => { - if (!this.control.value - && this.required - && !this.errorMessages.some(msg => HARD_CODED_REQUIRED_MSG.test(msg)) - && this.errorMessages.indexOf(REQUIRED_MSG_OVERRIDE) < 0) { - this.errorMessages.push(REQUIRED_MSG_OVERRIDE); - } - if (!this.required) { - this.errorMessages = this.errorMessages.filter(e => e !== REQUIRED_MSG_OVERRIDE); - } - }); - } - - ngOnDestroy(): void { - this.errorSub.unsubscribe(); - } - - get required(): boolean { - const req = this.widgetService.isRequired(this.formProperty); - - return req; - } - - getError(error: string): string { - return HARD_CODED_REQUIRED_MSG.test(error) ? REQUIRED_MSG_OVERRIDE : error; - } - - get showHint(): boolean { - return (this.control.touched ? !this.showError : true) && this.schema.widget.help; - } - - get showError(): boolean { - return !!this.errorMessages && this.errorMessages.length > 0; - } -} diff --git a/ui/src/app/schema-form/widget/textarea/textarea.component.html b/ui/src/app/schema-form/widget/textarea/textarea.component.html deleted file mode 100644 index 55b2587c7..000000000 --- a/ui/src/app/schema-form/widget/textarea/textarea.component.html +++ /dev/null @@ -1,43 +0,0 @@ -
- - - {{ schema.description }} - - - - - , - error - - - - {{ schema.widget.help }} - -
diff --git a/ui/src/app/schema-form/widget/textarea/textarea.component.ts b/ui/src/app/schema-form/widget/textarea/textarea.component.ts deleted file mode 100644 index fdbce4b35..000000000 --- a/ui/src/app/schema-form/widget/textarea/textarea.component.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { Component, AfterViewInit, OnDestroy } from '@angular/core'; - -import { TextAreaWidget } from 'ngx-schema-form'; -import { SchemaService } from '../../service/schema.service'; -import { Subscription } from 'rxjs'; -import { startWith } from 'rxjs/operators'; -import { HARD_CODED_REQUIRED_MSG } from '../../model/messages'; - -@Component({ - selector: 'textarea-component', - templateUrl: `./textarea.component.html` -}) -export class CustomTextAreaComponent extends TextAreaWidget implements AfterViewInit, OnDestroy { - - errorSub: Subscription; - - constructor( - private widgetService: SchemaService - ) { - super(); - } - - ngAfterViewInit(): void { - super.ngAfterViewInit(); - this.errorSub = this.control.valueChanges.pipe(startWith(this.control.value)).subscribe(v => { - if (!v && this.required && !this.errorMessages.some(msg => HARD_CODED_REQUIRED_MSG.test(msg))) { - this.errorMessages.push('message.required'); - } - }); - } - - ngOnDestroy(): void { - this.errorSub.unsubscribe(); - } - - get required(): boolean { - return this.widgetService.isRequired(this.formProperty); - } - - getError(error: string): string { - return error.match('required').length ? 'message.required' : error; - } -} diff --git a/ui/src/app/schema-form/widget/widget.component.scss b/ui/src/app/schema-form/widget/widget.component.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/ui/src/app/shared/autocomplete/autocomplete.component.html b/ui/src/app/shared/autocomplete/autocomplete.component.html deleted file mode 100644 index 7800382cd..000000000 --- a/ui/src/app/shared/autocomplete/autocomplete.component.html +++ /dev/null @@ -1,61 +0,0 @@ -
- -
- -
-
- diff --git a/ui/src/app/shared/autocomplete/autocomplete.component.scss b/ui/src/app/shared/autocomplete/autocomplete.component.scss deleted file mode 100644 index 2bd2273d3..000000000 --- a/ui/src/app/shared/autocomplete/autocomplete.component.scss +++ /dev/null @@ -1,33 +0,0 @@ -@import "~bootstrap/scss/functions"; -@import "~bootstrap/scss/variables"; -@import "../../../theme/palette"; - -.dropdown.form-group { - margin-bottom: 0px; -} - -.dropdown-menu { - min-width: 100%; - width: auto; -} - -:host { - position: relative; - display: block; - - .btn-outline-secondary { - border-color: $input-border-color; - } - - &.is-invalid { - input.form-control { - border-color: $brand-danger; - } - } - - &.is-valid { - input.form-control { - border-color: $brand-success; - } - } -} \ No newline at end of file diff --git a/ui/src/app/shared/autocomplete/autocomplete.component.spec.ts b/ui/src/app/shared/autocomplete/autocomplete.component.spec.ts deleted file mode 100644 index c7fe5fc32..000000000 --- a/ui/src/app/shared/autocomplete/autocomplete.component.spec.ts +++ /dev/null @@ -1,386 +0,0 @@ -import { Component, ViewChild, SimpleChange, ElementRef, SimpleChanges } from '@angular/core'; -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { FormsModule, ReactiveFormsModule, FormBuilder } from '@angular/forms'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { AutoCompleteComponent } from './autocomplete.component'; -import { NavigatorService } from '../../core/service/navigator.service'; -import { ValidationClassDirective } from '../validation/validation-class.directive'; -import { HighlightPipe } from '../pipe/highlight.pipe'; -import { MockI18nModule } from '../../../testing/i18n.stub'; - -const iPodAgent = `Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) - AppleWebKit/534.46 (KHTML, like Gecko) - Version/5.1 Mobile/9A334 Safari/7534.48.3`; -const regularAgent = `Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) - AppleWebKit/537.36 (KHTML, like Gecko) - Chrome/64.0.3282.186 Safari/537.36`; - -@Component({ - template: ` -
- - -
- ` -}) -class TestHostComponent { - config: any = { - autoSelect: false, - options: [], - defaultValue: '', - id: 'foo', - allowCustom: false, - noneFoundText: 'None Found', - disabled: false - }; - - constructor(public fb: FormBuilder) {} - - group = this.fb.group({ - search: [''] - }); - - @ViewChild(AutoCompleteComponent, {static: true}) - public autoCompleteUnderTest: AutoCompleteComponent; - - configure(opts: any): void { - this.config = Object.assign({}, this.config, opts); - } - - search(query: string = ''): void {} -} - -describe('AutoComplete Input Component', () => { - let testHostInstance: TestHostComponent; - let testHostFixture: ComponentFixture; - let instanceUnderTest: AutoCompleteComponent; - let navigatorInstance: NavigatorService; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - NavigatorService - ], - imports: [ - NoopAnimationsModule, - FormsModule, - ReactiveFormsModule, - MockI18nModule - ], - declarations: [ - AutoCompleteComponent, - TestHostComponent, - ValidationClassDirective, - HighlightPipe - ], - }).compileComponents(); - }); - - beforeEach(() => { - testHostFixture = TestBed.createComponent(TestHostComponent); - testHostInstance = testHostFixture.componentInstance; - instanceUnderTest = testHostInstance.autoCompleteUnderTest; - navigatorInstance = TestBed.get(NavigatorService); - testHostFixture.detectChanges(); - }); - - it('should compile', () => { - expect(testHostFixture).toBeDefined(); - }); - - describe('ControlValueAccessor interface', () => { - describe('writeValue method', () => { - it('should set the value of the internal input element', () => { - let val = 'foo'; - instanceUnderTest.writeValue(val); - expect(instanceUnderTest.input.value).toBe(val); - }); - }); - - describe('registerOnChange method', () => { - it('should set the onChange callback method', () => { - let cb = jasmine.createSpy('registerOnChange'); - instanceUnderTest.registerOnChange(cb); - instanceUnderTest.propagateChange('foo'); - expect(cb).toHaveBeenCalledWith('foo'); - }); - }); - - describe('registerOnTouched method', () => { - it('should set the onTouched callback method', () => { - let cb = jasmine.createSpy('registerOnTouched'); - instanceUnderTest.registerOnTouched(cb); - instanceUnderTest.propagateTouched(null); - expect(cb).toHaveBeenCalledWith(null); - }); - }); - - describe('setDisabledState method', () => { - it('should set the disabled property to true', () => { - testHostInstance.group.get('search').disable(); - testHostFixture.detectChanges(); - expect(instanceUnderTest.input.disabled).toBe(true); - }); - it('should set the disabled property to false', () => { - testHostInstance.group.get('search').enable(); - testHostFixture.detectChanges(); - expect(instanceUnderTest.input.disabled).toBe(false); - }); - - it('should set the disabled property to false if not provided', () => { - instanceUnderTest.setDisabledState(); - expect(instanceUnderTest.input.disabled).toBe(false); - }); - }); - }); - - describe('handleKeyDown method', () => { - const keyCodes = { - 13: 'enter', - 27: 'escape', - 32: 'space', - 38: 'up', - 40: 'down' - }; - it('should call the handleUpArrow handler when the up arrow key is entered', () => { - spyOn(instanceUnderTest, 'handleUpArrow'); - instanceUnderTest.handleKeyDown({keyCode: 38} as KeyboardEvent); - expect(instanceUnderTest.handleUpArrow).toHaveBeenCalled(); - }); - it('should call the handleKeyDown handler when the down arrow key is entered', () => { - spyOn(instanceUnderTest, 'handleDownArrow'); - instanceUnderTest.handleKeyDown({ keyCode: 40 } as KeyboardEvent); - expect(instanceUnderTest.handleDownArrow).toHaveBeenCalled(); - }); - - it('should call the handleSpace handler when the arrow space is entered', () => { - spyOn(instanceUnderTest, 'handleSpace'); - instanceUnderTest.handleKeyDown({ keyCode: 32 } as KeyboardEvent); - expect(instanceUnderTest.handleSpace).toHaveBeenCalled(); - }); - - it('should call the handleEnter when the enter key is entered', () => { - spyOn(instanceUnderTest, 'handleEnter'); - instanceUnderTest.handleKeyDown({ keyCode: 13 } as KeyboardEvent); - expect(instanceUnderTest.handleEnter).toHaveBeenCalled(); - }); - it('should call the handleComponentBlur when the escape key is entered', () => { - spyOn(instanceUnderTest, 'handleComponentBlur'); - instanceUnderTest.handleKeyDown({ keyCode: 27 } as KeyboardEvent); - expect(instanceUnderTest.handleComponentBlur).toHaveBeenCalled(); - }); - }); - - describe('handleComponentBlur handler', () => { - const opts = ['foo', 'bar', 'baz']; - it('should set a new state', () => { - instanceUnderTest.state.setState({ selected: 0 }); - spyOn(instanceUnderTest.state, 'setState'); - instanceUnderTest.handleComponentBlur({menuOpen: true}); - expect(instanceUnderTest.state.setState).toHaveBeenCalledWith({ - focused: null, - selected: null, - menuOpen: true - }); - }); - - it('should set the menuOpen state to false if not provided', () => { - instanceUnderTest.state.setState({ selected: 0 }); - spyOn(instanceUnderTest.state, 'setState'); - instanceUnderTest.handleComponentBlur(); - expect(instanceUnderTest.state.setState).toHaveBeenCalledWith({ - focused: null, - selected: null, - menuOpen: false - }); - }); - - it('should allow custom values when the property is set', () => { - const val = 'hi'; - testHostInstance.configure({allowCustom: true}); - instanceUnderTest.input.setValue(val); - instanceUnderTest.state.setState({ selected: -1 }); - testHostFixture.detectChanges(); - spyOn(instanceUnderTest, 'propagateChange'); - instanceUnderTest.handleComponentBlur(); - expect(instanceUnderTest.propagateChange).toHaveBeenCalledWith(val); - }); - - it('should detect if query is in current options', () => { - const val = 'foo'; - instanceUnderTest.input.setValue(val); - testHostInstance.configure({options: [val]}); - instanceUnderTest.state.setState({ selected: -1 }); - testHostFixture.detectChanges(); - spyOn(instanceUnderTest, 'propagateChange'); - instanceUnderTest.handleComponentBlur(); - expect(instanceUnderTest.propagateChange).toHaveBeenCalledWith('foo'); - }); - }); - - describe('handleEnter handler', () => { - const opts = ['foo', 'bar', 'baz']; - it('should call preventDefault on the provided event if the menu is currently open', () => { - const ev = { preventDefault: () => {} } as KeyboardEvent; - spyOn(ev, 'preventDefault'); - instanceUnderTest.state.setState({ menuOpen: true}); - instanceUnderTest.handleEnter(ev); - expect(ev.preventDefault).toHaveBeenCalled(); - }); - it('should NOT call preventDefault on the provided event if the menu is not open', () => { - const ev = { preventDefault: () => { } } as KeyboardEvent; - spyOn(ev, 'preventDefault'); - instanceUnderTest.state.setState({ menuOpen: false }); - instanceUnderTest.handleEnter(ev); - expect(ev.preventDefault).not.toHaveBeenCalled(); - }); - - it('should call componentBlur if there is no selected option and the query is not in the options', () => { - const ev = { preventDefault: () => { } } as KeyboardEvent; - spyOn(ev, 'preventDefault'); - spyOn(instanceUnderTest, 'handleComponentBlur'); - instanceUnderTest.state.setState({ menuOpen: true, selected: -1 }); - instanceUnderTest.handleEnter(ev); - expect(instanceUnderTest.handleComponentBlur).toHaveBeenCalledWith({ - focused: -1, - selected: -1, - menuOpen: false - }); - }); - - it('should call handleOptionClick if there is no selected option but the query is in the options', () => { - const i = 0; - const val = opts[i]; - const ev = { preventDefault: () => { } } as KeyboardEvent; - spyOn(ev, 'preventDefault'); - testHostInstance.configure({ options: opts }); - instanceUnderTest.input.setValue(val); - testHostFixture.detectChanges(); - spyOn(instanceUnderTest, 'handleOptionClick'); - instanceUnderTest.state.setState({ menuOpen: true, selected: -1 }); - instanceUnderTest.handleEnter(ev); - expect(instanceUnderTest.handleOptionClick).toHaveBeenCalledWith(i); - }); - }); - - describe('handleInputFocus handler', () => { - it('should set the state focused attribute to the input fields index', () => { - spyOn(instanceUnderTest.state, 'setState'); - instanceUnderTest.handleInputFocus(); - expect(instanceUnderTest.state.setState).toHaveBeenCalledWith({focused: -1}); - }); - }); - - describe('handleOptionFocus handler', () => { - it('should set the state focused attribute to the focused option', () => { - spyOn(instanceUnderTest.state, 'setState'); - instanceUnderTest.handleOptionFocus(1); - expect(instanceUnderTest.state.setState).toHaveBeenCalledWith({focused: 1, selected: 1}); - }); - }); - - describe('handleOptionClick handler', () => { - const expected = { - menuOpen: false, - focused: -1, - selected: -1 - }; - it('should set the state to menuOpen: false, focused to -1, selected to -1, and the query to the selected option', () => { - const val = 'foo'; - instanceUnderTest.input.setValue(val); - testHostInstance.configure({ options: [val, 'bar', 'baz'] }); - testHostFixture.detectChanges(); - spyOn(instanceUnderTest.state, 'setState'); - instanceUnderTest.handleOptionClick(0); - expect(instanceUnderTest.state.setState).toHaveBeenCalledWith(expected); - }); - - it('should call propagateChange if the selected option is in the list of matches', () => { - const val = 'foo'; - instanceUnderTest.input.setValue(val); - testHostInstance.configure({ options: [val, 'bar', 'baz'] }); - testHostFixture.detectChanges(); - spyOn(instanceUnderTest, 'propagateChange'); - instanceUnderTest.handleOptionClick(0); - expect(instanceUnderTest.propagateChange).toHaveBeenCalledWith(val); - }); - }); - - describe('handleOptionMouseDown method', () => { - it('should call the preventDefault method on the provided event', () => { - let spy = jasmine.createSpy('preventDefault'), - evt = {preventDefault: spy}; - instanceUnderTest.handleOptionMouseDown(evt); - expect(evt.preventDefault).toHaveBeenCalled(); - }); - }); - - describe('handleOptionMouseEnter method', () => { - it('should update the current state with the provided index', () => { - let index = 1; - spyOn(instanceUnderTest.state, 'setState'); - instanceUnderTest.handleOptionMouseEnter(index); - expect(instanceUnderTest.state.setState).toHaveBeenCalledWith({ hovered: index }); - }); - }); - - describe('handleOptionMouseOut method', () => { - it('should update the current state on the components model', () => { - spyOn(instanceUnderTest.state, 'setState'); - instanceUnderTest.handleOptionMouseOut(); - expect(instanceUnderTest.state.setState).toHaveBeenCalledWith({hovered: null}); - }); - }); - - describe('displayState getter function', () => { - it('should return the current state', () => { - let spy = spyOnProperty(instanceUnderTest.state, 'currentState', 'get'); - let state = instanceUnderTest.displayState; - expect(state).toEqual({}); - expect(spy).toHaveBeenCalled(); - }); - }); - - describe('hasAutoSelect getter', () => { - it('should return true if not an ios device and autoSelect is set to true', () => { - spyOn(instanceUnderTest, 'isIosDevice').and.returnValue(false); - testHostInstance.configure({autoSelect: true}); - testHostFixture.detectChanges(); - expect(instanceUnderTest.hasAutoselect).toBe(true); - }); - - it('should return false if an ios device', () => { - spyOn(instanceUnderTest, 'isIosDevice').and.returnValue(true); - expect(instanceUnderTest.hasAutoselect).toBe(false); - }); - }); - - describe('activeDescendant getter', () => { - it('should return a formatted string of an item is focused', () => { - let id = 'foo', - focused = 1, - matches = ['foo']; - testHostInstance.configure({id}); - spyOnProperty(instanceUnderTest.state, 'currentState', 'get').and.returnValue({focused, matches}); - testHostFixture.detectChanges(); - expect(instanceUnderTest.activeDescendant).toBe(`${id}__option--${focused}`); - }); - }); - - describe('isIosDevice method', () => { - it('should return true if navigator.userAgent is an ipad', () => { - spyOnProperty(navigatorInstance, 'native', 'get').and.returnValue({ userAgent: iPodAgent }); - expect(instanceUnderTest.isIosDevice()).toBe(true); - }); - it('should return false if navigator.userAgent is not an ios device', () => { - spyOnProperty(navigatorInstance, 'native', 'get').and.returnValue({ userAgent: regularAgent }); - expect(instanceUnderTest.isIosDevice()).toBe(false); - }); - }); -}); diff --git a/ui/src/app/shared/autocomplete/autocomplete.component.ts b/ui/src/app/shared/autocomplete/autocomplete.component.ts deleted file mode 100644 index cda5d6406..000000000 --- a/ui/src/app/shared/autocomplete/autocomplete.component.ts +++ /dev/null @@ -1,377 +0,0 @@ -import { - Component, - Input, - Output, - EventEmitter, - OnInit, - OnDestroy, - OnChanges, - AfterViewInit, - ViewChild, - ViewChildren, - QueryList, - ElementRef, - forwardRef, - HostListener, - SimpleChanges -} from '@angular/core'; -import { FormControl, ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; -import { Observable, Subject, Subscription, interval } from 'rxjs'; -import { takeUntil, combineLatest, map } from 'rxjs/operators'; - -import { LiveAnnouncer } from '@angular/cdk/a11y'; - -import { keyCodes } from '../../shared/keycodes'; -import { AutoCompleteStateEmitter } from './autocomplete.model'; -import { NavigatorService } from '../../core/service/navigator.service'; - -const POLL_TIMEOUT = 1000; -const INPUT_FIELD_INDEX = -1; - -@Component({ - selector: 'auto-complete', - templateUrl: './autocomplete.component.html', - styleUrls: ['./autocomplete.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => AutoCompleteComponent), - multi: true - } - ] -}) -export class AutoCompleteComponent implements OnInit, OnDestroy, OnChanges, AfterViewInit, ControlValueAccessor { - @Input() defaultValue = ''; - @Input() matches: string[] = []; - @Input() id: string; - @Input() fieldId: string; - @Input() autoSelect = false; - @Input() noneFoundText = 'No Options Found'; - @Input() limit = 0; - @Input() processing = false; - @Input() dropdown = false; - @Input() placeholder = ''; - @Input() count = null; - - @Output() more: EventEmitter = new EventEmitter(); - @Output() onChange: EventEmitter = new EventEmitter(); - - @ViewChild('inputField', { static: true }) inputField: ElementRef; - @ViewChildren('matchElement', { read: ElementRef }) listItems: QueryList; - - focused: number; - selected: number; - - isMenuOpen$: Observable; - query$: Observable; - - $pollInput: Observable; - $checkInputValue: Observable; - $pollSubscription: Subscription; - - showMoreAvailable: boolean; - numMatches: number; - - input: FormControl = new FormControl(); - elementReferences: {[id: number]: ElementRef} = {}; - state: AutoCompleteStateEmitter = new AutoCompleteStateEmitter(); - - menuIsVisible$: Observable; - - private ngUnsubscribe: Subject = new Subject(); - - propagateChange = (_: any | null) => { }; - propagateTouched = (_: any | null) => { }; - - constructor(private navigator: NavigatorService, private live: LiveAnnouncer) {} - - ngOnInit(): void { - this.$pollInput = interval(POLL_TIMEOUT); - this.$checkInputValue = this.$pollInput - .pipe( - takeUntil(this.ngUnsubscribe), - combineLatest(this.input.valueChanges) - ); - this.$pollSubscription = this.$checkInputValue.subscribe(([polled, value]) => { - const inputReference = this.inputField.nativeElement; - const queryHasChanged = inputReference && inputReference.value !== value; - if (queryHasChanged) { - this.input.setValue(inputReference.value); - this.input.updateValueAndValidity(); - } - }); - - this.input.valueChanges.subscribe(query => this.onChange.emit(query)); - this.input.valueChanges.subscribe(newValue => this.handleInputChange(newValue)); - this.input.setValue(this.defaultValue); - - this.menuIsVisible$ = this.state.changes$.pipe(map(state => state.menuOpen)); - } - - ngOnDestroy(): void { - this.$pollSubscription.unsubscribe(); - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - } - - ngAfterViewInit(): void { - this.listItems.changes.subscribe((changes) => this.setElementReferences(changes) ); - } - - ngOnChanges(changes: SimpleChanges): void { - if (changes.matches && this.matches && this.state.currentState.menuOpen) { - this.announceResults(); - } - } - - announceResults(): void { - const count = this.matches.length; - this.live.announce(count === 0 ? - `${this.noneFoundText}` : - `${count} result${count === 1 ? '' : 's'} available`, 'polite', 5000); - } - - writeValue(value: any): void { - this.input.setValue(value); - } - - registerOnChange(fn: any): void { - this.propagateChange = fn; - } - - registerOnTouched(fn: any): void { - this.propagateTouched = fn; - } - - setDisabledState(isDisabled: boolean = false): void { - if (isDisabled) { - this.input.disable(); - } else { - this.input.enable(); - } - } - - setElementReferences(changes): void { - this.elementReferences = { - [INPUT_FIELD_INDEX]: this.inputField - }; - this.listItems.map((item, index) => { - this.elementReferences[index] = item; - }); - } - - handleDropdown($event: MouseEvent | KeyboardEvent | Event): void { - const open = this.state.currentState.menuOpen; - this.state.setState({menuOpen: !open}); - this.handleOptionFocus(0); - } - - handleViewMore($event: MouseEvent | KeyboardEvent | Event): void { - $event.preventDefault(); - $event.stopPropagation(); - this.handleInputBlur(); - this.input.markAsTouched(); - this.more.emit(this.input.value); - } - - handleComponentBlur(newState: any = {}): void { - let { selected } = this.state.currentState, - query = this.input.value, - change = this.matches && this.matches[selected] ? this.matches[selected] : query; - this.propagateChange(change); - this.propagateTouched(null); - this.state.setState({ - focused: null, - selected: null, - menuOpen: newState.menuOpen || false - }); - } - - handleOptionBlur(event: FocusEvent, index): void { - const elm = event.relatedTarget as HTMLElement; - const { focused, menuOpen, selected } = this.state.currentState; - const focusingOutsideComponent = event.relatedTarget === null; - const focusingInput = elm.id === this.elementReferences[-1].nativeElement.id; - const focusingAnotherOption = focused !== index && focused !== -1; - const blurComponent = (!focusingAnotherOption && focusingOutsideComponent) || !(focusingAnotherOption || focusingInput); - if (blurComponent) { - const keepMenuOpen = menuOpen && this.isIosDevice(); - this.handleComponentBlur({ - menuOpen: keepMenuOpen, - query: this.matches[selected] - }); - } - } - - handleInputBlur(): void { - const { focused, menuOpen, selected } = this.state.currentState; - const query = this.input.value; - const focusingAnOption = focused !== -1; - const isIosDevice = this.isIosDevice(); - if (!focusingAnOption && this.matches) { - const keepMenuOpen = menuOpen && isIosDevice; - const newQuery = isIosDevice ? query : this.matches[selected]; - this.handleComponentBlur({ - menuOpen: keepMenuOpen, - query: newQuery - }); - } else { - this.handleComponentBlur({ - menuOpen: false, - query - }); - } - } - - handleInputChange(query: string): void { - query = query || ''; - const queryEmpty = query.length === 0; - const autoselect = this.hasAutoselect; - const optionsAvailable = this.matches.length > 0; - const searchForOptions = !queryEmpty; - const focused = this.state.currentState.focused !== null; - this.state.setState({ - menuOpen: searchForOptions && (focused && !this.matches.some(m => m === query)), - selected: searchForOptions ? ((autoselect && optionsAvailable) ? 0 : -1) : null - }); - this.propagateChange(query); - } - - handleInputFocus(): void { - this.state.setState({ - focused: INPUT_FIELD_INDEX - }); - } - handleOptionFocus(index: number) { - this.state.setState({ - focused: index, - selected: index - }); - } - handleOptionClick(index: number): void { - const selectedOption = this.matches[index]; - this.propagateChange(selectedOption); - this.input.setValue(selectedOption); - this.state.setState({ - focused: -1, - selected: -1, - menuOpen: false - }); - } - - @HostListener('keydown', ['$event']) - handleKeyDown(event: KeyboardEvent): void { - switch (keyCodes[event.keyCode]) { - case 'up': - this.handleUpArrow(event); - break; - case 'down': - this.handleDownArrow(event); - break; - case 'space': - this.handleSpace(event); - break; - case 'enter': - this.handleEnter(event); - break; - case 'escape': - this.handleComponentBlur(); - break; - } - } - - handleUpArrow(event: KeyboardEvent): void { - event.preventDefault(); - const isNotAtTop = this.state.currentState.selected !== 0; - const allowMoveUp = isNotAtTop && this.state.currentState.menuOpen; - if (allowMoveUp) { - this.handleOptionFocus(this.state.currentState.selected - 1); - } - } - - handleDownArrow(event: KeyboardEvent): void { - let isNotAtBottom = this.state.currentState.selected !== this.matches.length - 1; - if (this.showMoreAvailable) { - isNotAtBottom = this.state.currentState.selected !== this.matches.length; - } - const allowMoveDown = isNotAtBottom && this.state.currentState.menuOpen; - if (allowMoveDown) { - this.handleOptionFocus(this.state.currentState.selected + 1); - } - event.preventDefault(); - } - - handleSpace(event: KeyboardEvent): void { - const focusIsOnOption = this.state.currentState.focused !== -1; - if (focusIsOnOption) { - event.preventDefault(); - this.handleOptionClick(this.state.currentState.focused); - } - } - - handleEnter(event: KeyboardEvent): void { - let { selected, menuOpen } = this.state.currentState, - query = this.input.value; - if (menuOpen) { - event.preventDefault(); - let hasSelectedOption = selected >= 0; - if (!hasSelectedOption) { - const queryIndex = this.matches.indexOf(query); - hasSelectedOption = queryIndex > -1; - selected = hasSelectedOption ? queryIndex : selected; - } - if (hasSelectedOption && selected < this.matches.length) { - this.handleOptionClick(selected); - } else if (hasSelectedOption && selected === this.matches.length) { - this.handleViewMore(event as KeyboardEvent); - } else { - this.handleComponentBlur({ - focused: -1, - selected: -1, - menuOpen: false - }); - } - } - } - - handleOptionMouseDown(event: MouseEvent | { preventDefault: () => {} }): void { - event.preventDefault(); - } - - handleOptionMouseEnter(index: number): void { - this.state.setState({ - hovered: index - }); - } - - handleOptionMouseOut(): void { - this.state.setState({ - hovered: null - }); - } - - isIosDevice() { - let agent = this.navigator.native.userAgent; - return !!(agent.match(/(iPod|iPhone|iPad)/g) && agent.match(/AppleWebKit/g)); - } - - getOptionId(index: string | number): string { - return `${this.fieldId}__option--${index}`.replace('/', ''); - } - - get hasAutoselect(): boolean { - return this.isIosDevice() ? false : this.autoSelect; - } - - get activeDescendant (): string { - let { focused } = this.state.currentState, - optionFocused = focused !== -1 && focused !== null; - return optionFocused ? this.getOptionId(focused) : null; - } - - get displayState(): any { - return { - ...this.state.currentState - }; - } -} diff --git a/ui/src/app/shared/autocomplete/autocomplete.model.spec.ts b/ui/src/app/shared/autocomplete/autocomplete.model.spec.ts deleted file mode 100644 index 5719d3d7e..000000000 --- a/ui/src/app/shared/autocomplete/autocomplete.model.spec.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { AutoCompleteStateEmitter, AutoCompleteState, defaultState } from './autocomplete.model'; - -describe('AutoCompleteStateEmitter', () => { - let emitter: AutoCompleteStateEmitter; - - describe('constructor', () => { - it('should init with a default state', () => { - emitter = new AutoCompleteStateEmitter(); - expect(emitter.currentState).toEqual(defaultState); - }); - - it('should init with a provided state', () => { - const st: AutoCompleteState = { - ...defaultState - }; - emitter = new AutoCompleteStateEmitter(st); - expect(emitter.currentState).toEqual(st); - }); - }); -}); diff --git a/ui/src/app/shared/autocomplete/autocomplete.model.ts b/ui/src/app/shared/autocomplete/autocomplete.model.ts deleted file mode 100644 index 8e96dae05..000000000 --- a/ui/src/app/shared/autocomplete/autocomplete.model.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { ElementRef } from '@angular/core'; -import { Subject } from 'rxjs'; - -export const defaultState: AutoCompleteState = { - focused: null, - selected: null, - hovered: null, - menuOpen: false -}; - -export interface AutoCompleteState { - focused: number | null; - selected: number | null; - hovered: number | null; - menuOpen: boolean; -} - -export class AutoCompleteStateEmitter { - private subj = new Subject(); - - private state: AutoCompleteState; - - changes$ = this.subj.asObservable(); - - constructor( - public defaults: AutoCompleteState = defaultState - ) { - this.state = {...defaults}; - } - - get currentState(): AutoCompleteState { - return this.state; - } - - setState(change: Partial) { - this.state = { - ...this.state, - ...change - }; - this.subj.next(this.state); - } -} diff --git a/ui/src/app/shared/autocomplete/keys.service.ts b/ui/src/app/shared/autocomplete/keys.service.ts deleted file mode 100644 index dca1f77ee..000000000 --- a/ui/src/app/shared/autocomplete/keys.service.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface KeyService { - codes: any; - isPrintableKeyCode (): boolean; -} diff --git a/ui/src/app/shared/client.ts b/ui/src/app/shared/client.ts deleted file mode 100644 index 9942538fb..000000000 --- a/ui/src/app/shared/client.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function isIosDevice() { - return !!(navigator.userAgent.match(/(iPod|iPhone|iPad)/g) && navigator.userAgent.match(/AppleWebKit/g)); -} diff --git a/ui/src/app/shared/component/info-icon.component.html b/ui/src/app/shared/component/info-icon.component.html deleted file mode 100644 index ed7279e48..000000000 --- a/ui/src/app/shared/component/info-icon.component.html +++ /dev/null @@ -1,13 +0,0 @@ - - {{ description }} - - diff --git a/ui/src/app/shared/component/info-icon.component.scss b/ui/src/app/shared/component/info-icon.component.scss deleted file mode 100644 index 87b013155..000000000 --- a/ui/src/app/shared/component/info-icon.component.scss +++ /dev/null @@ -1,11 +0,0 @@ -:host { - .btn-nostyle { - margin: 0px; - padding: 0px; - background: none; - border: none; - display: inline; - } -} - - diff --git a/ui/src/app/shared/component/info-icon.component.spec.ts b/ui/src/app/shared/component/info-icon.component.spec.ts deleted file mode 100644 index e3b8c1347..000000000 --- a/ui/src/app/shared/component/info-icon.component.spec.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { Component, ViewChild, Renderer2 } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { NgbPopoverModule } from '@ng-bootstrap/ng-bootstrap'; -import { MockI18nModule } from '../../../testing/i18n.stub'; -import { InfoIconComponent } from './info-icon.component'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(InfoIconComponent, { static: true }) - public componentUnderTest: InfoIconComponent; - - public description = 'Foo bar baz'; -} - -describe('Info Icon Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: InfoIconComponent; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbPopoverModule, - MockI18nModule - ], - declarations: [ - TestHostComponent, - InfoIconComponent - ], - providers: [ - Renderer2 - ] - }).compileComponents(); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should display an information icon', waitForAsync(() => { - expect(app).toBeTruthy(); - })); -}); diff --git a/ui/src/app/shared/component/info-icon.component.ts b/ui/src/app/shared/component/info-icon.component.ts deleted file mode 100644 index ceba5f733..000000000 --- a/ui/src/app/shared/component/info-icon.component.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Component, Input, ChangeDetectionStrategy, Renderer2 } from '@angular/core'; -import { NgbPopover, NgbPopoverConfig } from '@ng-bootstrap/ng-bootstrap'; - -@Component({ - selector: 'info-icon', - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './info-icon.component.html', - styleUrls: ['./info-icon.component.scss'] -}) -export class InfoIconComponent { - @Input() description: string; - - id: string = String.fromCharCode(65 + Math.floor(Math.random() * 26)) + Date.now().toString(); - - // triggers = 'mouseenter:mouseleave focus:blur'; - triggers = 'click'; - container = 'body'; - placement = ['top']; - - constructor( - private renderer: Renderer2 - ) { } - focus(element): void { - element.elementRef.nativeElement.focus(); - } -} diff --git a/ui/src/app/shared/component/valid-form-icon.component.html b/ui/src/app/shared/component/valid-form-icon.component.html deleted file mode 100644 index ff292db23..000000000 --- a/ui/src/app/shared/component/valid-form-icon.component.html +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/ui/src/app/shared/component/valid-form-icon.component.spec.ts b/ui/src/app/shared/component/valid-form-icon.component.spec.ts deleted file mode 100644 index 146f6f44e..000000000 --- a/ui/src/app/shared/component/valid-form-icon.component.spec.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { Component, ViewChild, Renderer2 } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { NgbPopoverModule } from '@ng-bootstrap/ng-bootstrap'; -import { MockI18nModule } from '../../../testing/i18n.stub'; -import { ValidFormIconComponent } from './valid-form-icon.component'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(ValidFormIconComponent, { static: true }) - public componentUnderTest: ValidFormIconComponent; - - public status = 'INVALID'; -} - -describe('Info Icon Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: ValidFormIconComponent; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbPopoverModule, - MockI18nModule - ], - declarations: [ - TestHostComponent, - ValidFormIconComponent - ], - providers: [ - Renderer2 - ] - }).compileComponents(); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should display an information icon', waitForAsync(() => { - expect(app).toBeTruthy(); - })); -}); diff --git a/ui/src/app/shared/component/valid-form-icon.component.ts b/ui/src/app/shared/component/valid-form-icon.component.ts deleted file mode 100644 index 4528f273b..000000000 --- a/ui/src/app/shared/component/valid-form-icon.component.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Component, Input, ChangeDetectionStrategy } from '@angular/core'; - -@Component({ - selector: 'valid-form-icon', - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './valid-form-icon.component.html' -}) -export class ValidFormIconComponent { - @Input() status: string; - - constructor() {} -} diff --git a/ui/src/app/shared/constant.ts b/ui/src/app/shared/constant.ts deleted file mode 100644 index a0eaf09b8..000000000 --- a/ui/src/app/shared/constant.ts +++ /dev/null @@ -1 +0,0 @@ -export const DEFAULT_FIELD_MAX_LENGTH = 255; diff --git a/ui/src/app/shared/contenteditable/contenteditable.directive.spec.ts b/ui/src/app/shared/contenteditable/contenteditable.directive.spec.ts deleted file mode 100644 index adbf77284..000000000 --- a/ui/src/app/shared/contenteditable/contenteditable.directive.spec.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { Component, DebugElement, Renderer2 } from '@angular/core'; -import { By } from '@angular/platform-browser'; -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { ContenteditableDirective } from './contenteditable.directive'; -import { FormControl, ReactiveFormsModule } from '@angular/forms'; -import { MockI18nModule } from '../../../testing/i18n.stub'; - - - -@Component({ - template: `
` -}) -class TestComponent { - control: FormControl = new FormControl(''); -} - -describe('Content Editable Directive', () => { - let component: TestComponent; - let fixture: ComponentFixture; - let element: DebugElement; - let renderer: Renderer2; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - { provide: Renderer2, useClass: Renderer2 } - ], - imports: [ - ReactiveFormsModule, - MockI18nModule - ], - declarations: [ - ContenteditableDirective, - TestComponent - ], - }); - - fixture = TestBed.createComponent(TestComponent); - element = fixture.debugElement.query(By.css('div')); - fixture.detectChanges(); - - renderer = TestBed.get(Renderer2); - }); - - describe('functions', () => { - it('should compile', () => { - expect(element).toBeDefined(); - }); - }); - - describe('setDisabledState', () => { - it('should set the field to disabled', () => { - fixture.componentInstance.control.disable(); - expect(element.attributes.disabled).toBeDefined(); - }); - - it('should set the field to enabled', () => { - fixture.componentInstance.control.disable(); - fixture.detectChanges(); - fixture.componentInstance.control.enable(); - expect(element.attributes.disabled).toBeUndefined(); - }); - - it('should set the field to enabled', () => { - fixture.componentInstance.control.enable(); - expect(element.attributes.disabled).toBeUndefined(); - }); - }); -}); diff --git a/ui/src/app/shared/contenteditable/contenteditable.directive.ts b/ui/src/app/shared/contenteditable/contenteditable.directive.ts deleted file mode 100644 index 13b90bd0f..000000000 --- a/ui/src/app/shared/contenteditable/contenteditable.directive.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { - Directive, - ElementRef, - Renderer2, - HostListener, - forwardRef, - Input, - OnInit -} from '@angular/core'; - -import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; - -@Directive({ - selector: '[contenteditable]', - providers: - [ - { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ContenteditableDirective), multi: true } - ] -}) -export class ContenteditableDirective implements ControlValueAccessor { - @Input() propValueAccessor = 'textContent'; - - private removeDisabledState: () => void; - - private propagateChange = (_: any | null) => { }; - private propagateTouched = (_: any | null) => { }; - - constructor(private elementRef: ElementRef, private renderer: Renderer2) {} - - @HostListener('input') - callOnChange() { - this.propagateChange(this.elementRef.nativeElement[this.propValueAccessor]); - } - - @HostListener('blur') - callOnTouched() { - this.propagateTouched(null); - } - writeValue(value: any): void { - const normalizedValue = value || ''; - this.renderer.setProperty(this.elementRef.nativeElement, this.propValueAccessor, normalizedValue); - } - registerOnChange(fn: any): void { - this.propagateChange = fn; - } - registerOnTouched(fn: any): void { - this.propagateTouched = fn; - } - setDisabledState(isDisabled: boolean): void { - if (isDisabled) { - this.renderer.setAttribute(this.elementRef.nativeElement, 'disabled', 'true'); - this.removeDisabledState = this.renderer.listen(this.elementRef.nativeElement, 'keydown', this.listenerDisabledState); - } else { - if (this.removeDisabledState) { - this.renderer.removeAttribute(this.elementRef.nativeElement, 'disabled'); - this.removeDisabledState(); - } - } - } - - private listenerDisabledState(e: KeyboardEvent) { - e.preventDefault(); - } -} diff --git a/ui/src/app/shared/keycodes.spec.ts b/ui/src/app/shared/keycodes.spec.ts deleted file mode 100644 index d5c68f22c..000000000 --- a/ui/src/app/shared/keycodes.spec.ts +++ /dev/null @@ -1,55 +0,0 @@ -import * as Keycodes from './keycodes'; - -function range (start, edge, step = 1) { - const ret = []; - edge = edge || 0; - step = step || 1; - for (ret; (edge - start) * step > 0; start += step) { - ret.push(start); - } - return ret; -} - -describe('Keycodes utility', () => { - describe('isPrintableKeyCode function', () => { - it('should return true if keycode is between (not including) 47 and 58', () => { - let rng = range(48, 57); - rng.forEach((num) => { - expect(Keycodes.isPrintableKeyCode(num)).toBe(true); - }); - }); - - it('should return true if keycode is between (not including) 64 and 91', () => { - let rng = range(64 + 1, 91 - 1); - rng.forEach((num) => { - expect(Keycodes.isPrintableKeyCode(num)).toBe(true); - }); - }); - - it('should return true if keycode is between (not including) 95 and 112', () => { - let rng = range(95 + 1, 112 - 1); - rng.forEach((num) => { - expect(Keycodes.isPrintableKeyCode(num)).toBe(true); - }); - }); - - it('should return true if keycode is between (not including) 185 and 193', () => { - let rng = range(185 + 1, 193 - 1); - rng.forEach((num) => { - expect(Keycodes.isPrintableKeyCode(num)).toBe(true); - }); - }); - - it('should return true if keycode is between (not including) 218 and 223', () => { - let rng = range(218 + 1, 223 - 1); - rng.forEach((num) => { - expect(Keycodes.isPrintableKeyCode(num)).toBe(true); - }); - }); - - it('should return true if keycode is 32 or 8', () => { - expect(Keycodes.isPrintableKeyCode(32)).toBe(true); - expect(Keycodes.isPrintableKeyCode(8)).toBe(true); - }); - }); -}); diff --git a/ui/src/app/shared/keycodes.ts b/ui/src/app/shared/keycodes.ts deleted file mode 100644 index 717c1bb22..000000000 --- a/ui/src/app/shared/keycodes.ts +++ /dev/null @@ -1,18 +0,0 @@ -export const keyCodes = { - 13: 'enter', - 27: 'escape', - 32: 'space', - 38: 'up', - 40: 'down' -}; - -export function isPrintableKeyCode (keyCode) { - return ( - (keyCode > 47 && keyCode < 58) || // number keys - keyCode === 32 || keyCode === 8 || // spacebar or backspace - (keyCode > 64 && keyCode < 91) || // letter keys - (keyCode > 95 && keyCode < 112) || // numpad keys - (keyCode > 185 && keyCode < 193) || // ;=,-./` (in order) - (keyCode > 218 && keyCode < 223) // [\]' (in order) - ); -} diff --git a/ui/src/app/shared/memo.spec.ts b/ui/src/app/shared/memo.spec.ts deleted file mode 100644 index 01fcd9898..000000000 --- a/ui/src/app/shared/memo.spec.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { memoize } from './memo'; - -const fns = { - square(n) { - return n * n; - } -}; - -describe('memoize function', () => { - it('should return a memoized function', () => { - spyOn(fns, 'square').and.callThrough(); - const memoized = memoize(fns.square); - const call1 = memoized(1); - const call2 = memoized(2); - const call3 = memoized(2); - expect(call1).toBe(1); - expect(call2).toBe(4); - expect(call3).toBe(4); - expect(fns.square).toHaveBeenCalledTimes(2); - }); -}); diff --git a/ui/src/app/shared/memo.ts b/ui/src/app/shared/memo.ts deleted file mode 100644 index 3f719142a..000000000 --- a/ui/src/app/shared/memo.ts +++ /dev/null @@ -1,15 +0,0 @@ -export function memoize(func) { - const cache = {}; - return function (...args: any[]) { - const key = JSON.stringify(args); - if (cache[key]) { - return cache[key]; - } else { - const val = func.apply(null, args); - cache[key] = val; - return val; - } - }; -} - -export default { memoize }; diff --git a/ui/src/app/shared/pipe/date.pipe.ts b/ui/src/app/shared/pipe/date.pipe.ts deleted file mode 100644 index 80f648ec4..000000000 --- a/ui/src/app/shared/pipe/date.pipe.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { PipeTransform, Pipe } from '@angular/core'; -import { DatePipe } from '@angular/common'; - -@Pipe({ name: 'customDate' }) -export class CustomDatePipe implements PipeTransform { - pipe: DatePipe; - constructor() { - this.pipe = new DatePipe('en'); - } - transform(value: string, format: string): string { - let transformed: string; - try { - transformed = this.pipe.transform(value, format); - } catch (err) { - transformed = value; - } - return transformed; - } -} diff --git a/ui/src/app/shared/pipe/highlight.pipe.spec.ts b/ui/src/app/shared/pipe/highlight.pipe.spec.ts deleted file mode 100644 index 40a5cffce..000000000 --- a/ui/src/app/shared/pipe/highlight.pipe.spec.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { HighlightPipe } from './highlight.pipe'; -import { DomSanitizer } from '@angular/platform-browser'; - -describe('Pipe: Highlight', () => { - let pipe: HighlightPipe; - - beforeEach(() => { - pipe = new HighlightPipe({ - bypassSecurityTrustHtml: jasmine.createSpy('bypassSecurityTrustHtml'), - sanitize: jasmine.createSpy('sanitize'), - bypassSecurityTrustStyle: jasmine.createSpy('bypassSecurityTrustStyle'), - bypassSecurityTrustScript: jasmine.createSpy('bypassSecurityTrustScript'), - bypassSecurityTrustUrl: jasmine.createSpy('bypassSecurityTrustUrl'), - bypassSecurityTrustResourceUrl: jasmine.createSpy('bypassSecurityTrustResourceUrl') - }); - }); - - it('should return the attribute value', () => { - const str = 'foobar'; - const query = 'foo'; - expect(pipe.transform(str, query)).toBeUndefined(); - }); - it('should return - if the attribute is null', () => { - expect(pipe.transform(null, null)).toBeNull(); - expect(pipe.transform('foo', null)).toEqual('foo'); - expect(pipe.transform(null, 'foo')).toBeNull(); - }); -}); diff --git a/ui/src/app/shared/pipe/highlight.pipe.ts b/ui/src/app/shared/pipe/highlight.pipe.ts deleted file mode 100644 index e3b20b10c..000000000 --- a/ui/src/app/shared/pipe/highlight.pipe.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { PipeTransform, Pipe } from '@angular/core'; -import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; - -@Pipe({ name: 'highlight' }) -export class HighlightPipe implements PipeTransform { - constructor(public sanitizer: DomSanitizer) {} - transform(value: string, query: string): SafeHtml { - if (!query || !value) { - return value; - } - let pattern = query.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&'); - pattern = pattern.split(' ').filter((t) => { - return t.length > 0; - }).join('|'); - const regex = new RegExp(pattern, 'gi'); - return this.sanitizer.bypassSecurityTrustHtml( - value.replace(regex, (match) => `${match}`) - ); - } -} diff --git a/ui/src/app/shared/pipe/pretty-xml.pipe.spec.ts b/ui/src/app/shared/pipe/pretty-xml.pipe.spec.ts deleted file mode 100644 index 9aa1d875a..000000000 --- a/ui/src/app/shared/pipe/pretty-xml.pipe.spec.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { PrettyXml } from './pretty-xml.pipe'; -import * as XmlFormatter from 'xml-formatter'; - -describe('Pipe: Pretty Xml', () => { - let pipe: PrettyXml; - - beforeEach(() => { - pipe = new PrettyXml(); - }); - - it('should return the formatted xml', () => { - const str = ''; - expect(pipe.transform(str)).toEqual(XmlFormatter(str)); - }); - - it('should return the provided string if not truthy', () => { - const str = ''; - expect(pipe.transform(str)).toEqual(''); - }); -}); diff --git a/ui/src/app/shared/pipe/pretty-xml.pipe.ts b/ui/src/app/shared/pipe/pretty-xml.pipe.ts deleted file mode 100644 index d0fc54d05..000000000 --- a/ui/src/app/shared/pipe/pretty-xml.pipe.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core'; -import * as XmlFormatter from 'xml-formatter'; - -@Pipe({ name: 'prettyXml' }) -export class PrettyXml implements PipeTransform { - transform(value: string): string { - if (!value) { - return value; - } - return XmlFormatter(value); - } -} /* istanbul ignore next */ diff --git a/ui/src/app/shared/regex.ts b/ui/src/app/shared/regex.ts deleted file mode 100644 index 3d84b2ee0..000000000 --- a/ui/src/app/shared/regex.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const URL_REGEX = /^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~:/?#[\]@!\$&'\(\)\*\+,;=.]+$/; -export const EMAIL_REGEX = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{1,})+$/; -export const INTEGER_REGEX = /^[0-9]+$/; diff --git a/ui/src/app/shared/shared.module.ts b/ui/src/app/shared/shared.module.ts deleted file mode 100644 index 720f2a407..000000000 --- a/ui/src/app/shared/shared.module.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { HighlightPipe } from './pipe/highlight.pipe'; -import { AutoCompleteComponent } from './autocomplete/autocomplete.component'; -import { ValidationClassDirective } from './validation/validation-class.directive'; -import { ValidFormIconComponent } from './component/valid-form-icon.component'; -import { PrettyXml } from './pipe/pretty-xml.pipe'; -import { ToggleSwitchComponent } from './switch/switch.component'; -import { ContenteditableDirective } from './contenteditable/contenteditable.directive'; -import { I18nModule } from '../i18n/i18n.module'; -import { CustomDatePipe } from './pipe/date.pipe'; -import { InfoIconComponent } from './component/info-icon.component'; -import { NgbPopoverModule } from '@ng-bootstrap/ng-bootstrap'; - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - ReactiveFormsModule, - I18nModule, - NgbPopoverModule - ], - declarations: [ - HighlightPipe, - AutoCompleteComponent, - ToggleSwitchComponent, - ValidationClassDirective, - ValidFormIconComponent, - PrettyXml, - CustomDatePipe, - ContenteditableDirective, - InfoIconComponent - ], - exports: [ - HighlightPipe, - AutoCompleteComponent, - ToggleSwitchComponent, - CommonModule, - ReactiveFormsModule, - FormsModule, - ValidFormIconComponent, - ValidationClassDirective, - ContenteditableDirective, - CustomDatePipe, - InfoIconComponent - ] -}) -export class SharedModule { } diff --git a/ui/src/app/shared/storage.spec.ts b/ui/src/app/shared/storage.spec.ts deleted file mode 100644 index 81f4f70e0..000000000 --- a/ui/src/app/shared/storage.spec.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { Storage } from './storage'; - -describe('storage class', () => { - describe('key', () => { - it('should set a readonly key', () => { - let key = 'foo'; - let storage: Storage = new Storage(key); - expect(storage.key).toBe(key); - }); - it('should check for a list in local storage', () => { - spyOn(localStorage, 'getItem').and.returnValue('[]'); - spyOn(localStorage, 'setItem'); - let key = 'foo'; - let storage: Storage = new Storage(key); - expect(localStorage.setItem).not.toHaveBeenCalled(); - }); - it('should check if the list in local storage is an array', () => { - spyOn(localStorage, 'getItem').and.returnValue('{}'); - spyOn(localStorage, 'setItem'); - let key = 'foo'; - let storage: Storage = new Storage(key); - expect(localStorage.setItem).toHaveBeenCalled(); - }); - }); - - describe('add method', () => { - it('should add the object to the stored list', () => { - let key = 'foo'; - let storage: Storage = new Storage(key); - let obj = 'foo'; - spyOn(storage, 'save'); - spyOn(storage, 'query').and.returnValue([]); - storage.add(obj); - expect(storage.query).toHaveBeenCalled(); - expect(storage.save).toHaveBeenCalledWith([obj]); - }); - }); - - describe('save method', () => { - it('should save the list to local storage', () => { - let key = 'foo'; - let storage: Storage = new Storage(key); - let list = ['foo']; - spyOn(localStorage, 'setItem'); - storage.save(list); - expect(localStorage.setItem).toHaveBeenCalledWith(key, JSON.stringify(list)); - }); - }); - - describe('findByAttr method', () => { - it('should retrieve an item from the list in local storage', () => { - let key = 'foo'; - let storage: Storage = new Storage(key); - let list = [{ id: 'foo', name: 'bar' }]; - spyOn(storage, 'query').and.returnValue(list); - expect(storage.findByAttr('foo')).toBe(list[0]); - }); - - it('should retrieve an item based on the provided key from the list in local storage', () => { - let key = 'foo'; - let storage: Storage = new Storage(key); - let list = [{ val: 'foo', name: 'bar' }]; - spyOn(storage, 'query').and.returnValue(list); - expect(storage.findByAttr('foo', 'val')).toBe(list[0]); - }); - - it('should return null if the item is not found', () => { - let key = 'foo'; - let storage: Storage = new Storage(key); - let list = [{ val: 'foo', name: 'bar' }]; - spyOn(storage, 'query').and.returnValue(list); - expect(storage.findByAttr('baz', 'val')).toBeUndefined(); - }); - }); - - describe('query method', () => { - it('should return the list from localStorage', () => { - let list = ['foo']; - let key = 'foo'; - spyOn(localStorage, 'getItem').and.returnValue(JSON.stringify(list)); - let storage: Storage = new Storage(key); - expect(storage.query()).toEqual(list); - }); - }); - - describe('removeByAttr method', () => { - it('should remove an item from the list in local storage', () => { - let key = 'foo'; - let storage: Storage = new Storage(key); - let list = [{ id: 'foo', name: 'bar' }]; - spyOn(storage, 'query').and.returnValue(list); - spyOn(storage, 'save'); - storage.removeByAttr('foo'); - expect(storage.save).toHaveBeenCalledWith([]); - }); - - it('should remove an item from the list in local storage', () => { - let key = 'foo'; - let storage: Storage = new Storage(key); - let list = [{ val: 'foo', name: 'bar' }]; - spyOn(storage, 'query').and.returnValue(list); - spyOn(storage, 'save'); - storage.removeByAttr('foo', 'val'); - expect(storage.save).toHaveBeenCalledWith([]); - }); - }); -}); diff --git a/ui/src/app/shared/storage.ts b/ui/src/app/shared/storage.ts deleted file mode 100644 index 6672ee2d5..000000000 --- a/ui/src/app/shared/storage.ts +++ /dev/null @@ -1,36 +0,0 @@ -export class Storage { - constructor(readonly key: string) { - const list = localStorage.getItem(key); - if (!list || !Array.isArray(JSON.parse(list))) { - localStorage.setItem(key, JSON.stringify([])); - } - } - - add(obj): T[] { - const list = this.query(); - list.push(obj); - this.save(list); - return list; - } - - save(list): T[] { - localStorage.setItem(this.key, JSON.stringify(list)); - return list; - } - - findByAttr(val, attr: string = 'id'): T { - const list = this.query(); - return list.find(entity => entity[attr] === val); - } - - query(): T[] { - const list = JSON.parse(localStorage.getItem(this.key)); - return [...list]; - } - - removeByAttr(val, attr: string = 'id'): void { - const list = this.query().filter(entity => entity[attr] !== val); - this.save(list); - return null; - } -} /* istanbul ignore next */ diff --git a/ui/src/app/shared/switch/switch.component.html b/ui/src/app/shared/switch/switch.component.html deleted file mode 100644 index cdc69e69d..000000000 --- a/ui/src/app/shared/switch/switch.component.html +++ /dev/null @@ -1,4 +0,0 @@ - \ No newline at end of file diff --git a/ui/src/app/shared/switch/switch.component.scss b/ui/src/app/shared/switch/switch.component.scss deleted file mode 100644 index 0571b7ce9..000000000 --- a/ui/src/app/shared/switch/switch.component.scss +++ /dev/null @@ -1,62 +0,0 @@ -@import '../../../theme/_palette'; - -:host { - - $width: 60px; - $height: 34px; - - $transition-duration: 400ms; - - $off-color: $brand-danger; - $on-color: $brand-info; - - $distance: 26px; - - & { - line-height: 1; - } - - .switch { - position: relative; - width: $width; - height: $height; - line-height: 1.5; - margin-bottom: 0px; - } - .slider { - position: absolute; - cursor: pointer; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: $off-color; - transition: $transition-duration; - border-radius: $height; - } - - .slider:before { - position: absolute; - content: ""; - height: 26px; - width: 26px; - left: 4px; - bottom: 4px; - background-color: $white; - transition: $transition-duration; - border-radius: 50%; - } - - input:checked + .slider { - background-color: $on-color; - } - - input:focus + .slider { - box-shadow: 0 0 1px $on-color; - } - - input:checked + .slider:before { - transform: translateX($distance); - } -} - diff --git a/ui/src/app/shared/switch/switch.component.spec.ts b/ui/src/app/shared/switch/switch.component.spec.ts deleted file mode 100644 index 52659f4df..000000000 --- a/ui/src/app/shared/switch/switch.component.spec.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { ReactiveFormsModule, FormsModule, FormControl } from '@angular/forms'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { ViewChild, Component } from '@angular/core'; -import { ToggleSwitchComponent } from './switch.component'; - - -@Component({ - template: `` -}) -class TestHostComponent { - - foo: FormControl = new FormControl(false); - - @ViewChild(ToggleSwitchComponent, {static: true}) - public instanceUnderTest: ToggleSwitchComponent; -} - - -describe('Toggle Switch Component', () => { - let fixture: ComponentFixture; - let instance: TestHostComponent; - let cmp: ToggleSwitchComponent; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [], - imports: [ - NoopAnimationsModule, - ReactiveFormsModule, - FormsModule - ], - declarations: [ - ToggleSwitchComponent, - TestHostComponent - ], - }); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - cmp = instance.instanceUnderTest; - fixture.detectChanges(); - }); - - it('should compile', () => { - expect(fixture).toBeDefined(); - }); - - describe('value getter', () => { - it('should return the checked value', () => { - expect(cmp.value).toBe(false); - }); - }); - - describe('setDisabledState', () => { - it('should set the disabled property', () => { - cmp.setDisabledState(true); - expect(cmp.disabled).toBe(true); - }) - }); -}); diff --git a/ui/src/app/shared/switch/switch.component.ts b/ui/src/app/shared/switch/switch.component.ts deleted file mode 100644 index e51919f87..000000000 --- a/ui/src/app/shared/switch/switch.component.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { Component, Input, forwardRef, HostBinding, HostListener } from '@angular/core'; -import { NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms'; - -@Component({ - selector: 'toggle-switch', - templateUrl: './switch.component.html', - styleUrls: ['./switch.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => ToggleSwitchComponent), - multi: true - } - ] -}) - -export class ToggleSwitchComponent implements ControlValueAccessor { - checked = false; - - @Input() disabled = false; - @HostBinding('style.opacity') - get opacity() { - return this.disabled ? 0.25 : 1; - } - - onChange = (checked: boolean) => { }; - - onTouched = () => { }; - - get value(): boolean { - return this.checked; - } - - writeValue(checked: boolean): void { - this.checked = checked; - } - registerOnChange(fn: (checked: boolean) => void): void { - this.onChange = fn; - this.onChange(this.checked); - } - registerOnTouched(fn: () => void): void { - this.onTouched = fn; - } - setDisabledState(isDisabled: boolean): void { - this.disabled = isDisabled; - } -} - diff --git a/ui/src/app/shared/util.spec.ts b/ui/src/app/shared/util.spec.ts deleted file mode 100644 index 2c4e1b957..000000000 --- a/ui/src/app/shared/util.spec.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { removeNulls, checkByType } from './util'; - -describe('removeNulls', () => { - let obj = { - foo: null, - bar: 'baz' - }, - expected = { - bar: 'baz' - }; - it(`should remove null values from the object provided`, () => { - expect(removeNulls(obj)).toEqual(expected); - }); - - it(`should return an empty object if passed a falsy value`, () => { - expect(removeNulls(undefined)).toEqual({}); - }); -}); - -describe('checkByType', () => { - it('should return false for an empty object', () => { - expect(checkByType({})).toBe(false); - }); - it('should return for a populated object', () => { - expect(checkByType({foo: 'bar'})).toBe(true); - }); - it('should return true for non-object types', () => { - expect(checkByType('foo')).toBe(true); - }); -}); diff --git a/ui/src/app/shared/util.ts b/ui/src/app/shared/util.ts deleted file mode 100644 index a5fe7f0df..000000000 --- a/ui/src/app/shared/util.ts +++ /dev/null @@ -1,114 +0,0 @@ -import { RouterStateSerializer } from '@ngrx/router-store'; -import { RouterStateSnapshot, Params } from '@angular/router'; -import { Injectable } from "@angular/core"; - -export interface RouterStateUrl { - url: string; - queryParams: Params; -} - -@Injectable() -export class CustomRouterStateSerializer implements RouterStateSerializer { - serialize(routerState: RouterStateSnapshot): RouterStateUrl { - const { url } = routerState; - const queryParams = routerState.root.queryParams; - - return { url, queryParams }; - } -} - -export function removeNulls(attribute: any, discardObjects: boolean = false): any { - if (!attribute) { return {}; } - let removed = Object.keys(attribute).reduce((coll, val, index) => { - if (attribute[val] !== null) { - if (!discardObjects || checkByType(attribute[val])) { - coll[val] = attribute[val]; - } - } - return coll; - }, {}); - return removed; -} - -export function checkByType(value): boolean { - switch (typeof value) { - case 'object': { - return Object.keys(value).filter(k => !!value[k]).length > 0; - } - default: { - return true; - } - } -} - -export function pick(approvedProperties: string[]): Function { - return (original) => - Object.keys(original) - .filter((key) => approvedProperties.indexOf(key) > -1) - .reduce((newObj, key) => { - let value = original[key]; - newObj[key] = value; - return newObj; - }, {}); -} - -export function array_move(arr, old_index, new_index): any[] { - if (new_index >= arr.length) { - let k = new_index - arr.length + 1; - while (k--) { - arr.push(undefined); - } - } - arr.splice(new_index, 0, arr.splice(old_index, 1)[0]); - return arr; -} - -export function getCurrentLanguage(navigator: any = null): string { - return getCurrentLocale(navigator).split('-', 1)[0]; -} - -export function getCurrentCountry(navigator: any = null): string { - return getCurrentLocale(navigator).split('-', 1)[1]; -} - -export function getCurrentLocale(nav: any = null): string { - nav = nav || navigator; - const getLocaleId = (lang: string) => lang.trim(); - // supported regional languages - const supportedLanguages: string[] = ['en', 'es', 'en-US', 'es-ES'].map(lang => getLocaleId(lang)); - // language code without regional details - const shortSupportedLanguages: string[] = supportedLanguages.map(lang => lang.substring(0, 2)); - - // look for an exact match to a regional translation - let preferredLanguage = getLocaleId(nav.language); - if (supportedLanguages.includes(preferredLanguage)) { - return preferredLanguage; - } - - // for language only match, no regional details - let shortPreferredLanguage: string = preferredLanguage.substring(0, 2); - let index = shortSupportedLanguages.indexOf(shortPreferredLanguage); - if (index > -1) { - return supportedLanguages[index]; - } - - // not all browsers share full language list - if (nav.languages instanceof Array) { - // get list of all languages user understands, check for an exact regional match - const allPreferredLanugages: string[] = nav.languages.map(lang => getLocaleId(lang)); - preferredLanguage = allPreferredLanugages.find(language => supportedLanguages.includes(language)); - if (preferredLanguage) { - return preferredLanguage; - } - - // from list of all languages user understand, check for language only match - const shortAllPreferredLanugages: string[] = allPreferredLanugages.map(language => language.substring(0, 2)); - index = shortAllPreferredLanugages.findIndex(language => shortSupportedLanguages.includes(language)); - if (index > -1) { - return supportedLanguages[index]; - } - } - - // if no match has been found return first (default) language - return supportedLanguages[0]; -} diff --git a/ui/src/app/shared/validation/regex.validator.spec.ts b/ui/src/app/shared/validation/regex.validator.spec.ts deleted file mode 100644 index 4835efd94..000000000 --- a/ui/src/app/shared/validation/regex.validator.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { RegexValidator } from './regex.validator'; - -describe('RegexValidator', () => { - describe('isValidRegex method', () => { - it('should return true if no error is thrown', () => { - expect(RegexValidator.isValidRegex('/abc/')).toBe(true); - expect(RegexValidator.isValidRegex('/*123/')).toBe(true); - }); - - it('should return false if an error is thrown trying to construct a regex', () => { - expect(RegexValidator.isValidRegex(')')).toBe(false); - }); - - it('should return true even if the regex doesnt begin and end with slashes', () => { - expect(RegexValidator.isValidRegex('abc')).toBe(true); - }); - }); -}); diff --git a/ui/src/app/shared/validation/regex.validator.ts b/ui/src/app/shared/validation/regex.validator.ts deleted file mode 100644 index f05fadf8d..000000000 --- a/ui/src/app/shared/validation/regex.validator.ts +++ /dev/null @@ -1,16 +0,0 @@ -export class RegexValidator { - static isValidRegex(pattern: string): boolean { - if (!pattern) { - return false; - } - let regex; - try { - regex = new RegExp(pattern); - } catch (err) { - return false; - } - return true; - } -} - -export default RegexValidator; diff --git a/ui/src/app/shared/validation/uri.validator.spec.ts b/ui/src/app/shared/validation/uri.validator.spec.ts deleted file mode 100644 index 617971831..000000000 --- a/ui/src/app/shared/validation/uri.validator.spec.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { UriValidator } from './uri.validator'; -import { FormControl } from '@angular/forms'; - -describe('UriValidator class', () => { - describe('isUri method', () => { - it('should return false if invalid', () => { - expect(UriValidator.isUri('foo')).toBe(false); - }); - - it('should return true if valid', () => { - expect(UriValidator.isUri('http://foo.bar')).toBe(true); - }); - }); - - describe('uri method', () => { - it('should return a validation object if invalid', () => { - let form: FormControl = new FormControl('foo'); - expect(UriValidator.uri(form)).toEqual({uri: true}); - }); - - it('should return null if valid', () => { - let form: FormControl = new FormControl('http://goo.gle'); - expect(UriValidator.uri(form)).toBeNull(); - }); - }); -}); diff --git a/ui/src/app/shared/validation/uri.validator.ts b/ui/src/app/shared/validation/uri.validator.ts deleted file mode 100644 index 243a099ad..000000000 --- a/ui/src/app/shared/validation/uri.validator.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { AbstractControl, ValidationErrors } from '@angular/forms'; - -export class UriValidator { - static uri(control: AbstractControl): ValidationErrors | null { - return UriValidator.isUri(control.value) ? null : { uri: true }; - } - - static isUri(value: string): boolean { - try { - let url = new URL(value); - } catch (err) { - return false; - } - return true; - } -} - -export default UriValidator; diff --git a/ui/src/app/shared/validation/validation-class.directive.spec.ts b/ui/src/app/shared/validation/validation-class.directive.spec.ts deleted file mode 100644 index ab662feb5..000000000 --- a/ui/src/app/shared/validation/validation-class.directive.spec.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { Component, DebugElement } from '@angular/core'; -import { By } from '@angular/platform-browser'; -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { ReactiveFormsModule, FormsModule, NgControl, AbstractControl } from '@angular/forms'; -import { ValidationClassDirective } from './validation-class.directive'; - -import * as constants from '../../shared/constant'; - -@Component({ - template: `` -}) -class TestComponent { - foo = ''; -} - -describe('Validation Classes Directive', () => { - let component: TestComponent; - let fixture: ComponentFixture; - let inputEl: DebugElement; - let ctrl: AbstractControl; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [], - imports: [ - FormsModule, - ReactiveFormsModule - ], - declarations: [ - ValidationClassDirective, - TestComponent - ], - }); - - fixture = TestBed.createComponent(TestComponent); - inputEl = fixture.debugElement.query(By.css('input')); - ctrl = inputEl.injector.get(NgControl).control; - fixture.detectChanges(); - }); - - describe('directive', () => { - it('should compile', () => { - expect(inputEl).toBeDefined(); - }); - }); - - describe('validation classes', () => { - it('should add the is-invalid class when the control is invalid and has been touched', () => { - ctrl.markAsTouched(); - fixture.detectChanges(); - expect(inputEl.classes['is-invalid']).toBe(true); - }); - - it('should add the is-valid class when the control is valid and has been touched', () => { - ctrl.markAsTouched(); - ctrl.setValue('foo'); - fixture.detectChanges(); - expect(inputEl.classes['is-valid']).toBe(true); - }); - }); -}); diff --git a/ui/src/app/shared/validation/validation-class.directive.ts b/ui/src/app/shared/validation/validation-class.directive.ts deleted file mode 100644 index 5459731c9..000000000 --- a/ui/src/app/shared/validation/validation-class.directive.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Directive, Self, HostBinding, Input } from '@angular/core'; -import { NgControl } from '@angular/forms'; - -@Directive({ - selector: '[formControlName],[ngModel],[formControl]' -}) -export class ValidationClassDirective { - public constructor( - @Self() private ngCtrl: NgControl - ) { } - - @Input() disableValidation = false; - - @HostBinding('class.is-invalid') - get hasErrors() { - const ctrl = this.ngCtrl.control; - return (ctrl.invalid && this.isTouched) && !this.disableValidation; - } - - @HostBinding('class.is-valid') - get hasSuccess() { - const ctrl = this.ngCtrl.control; - return (ctrl.valid && this.isTouched) && !this.disableValidation; - } - - get isTouched() { - const ctrl = this.ngCtrl.control; - return ctrl.touched; - } -} /* istanbul ignore next */ diff --git a/ui/src/app/wizard/action/wizard.action.ts b/ui/src/app/wizard/action/wizard.action.ts deleted file mode 100644 index 3e630f1a1..000000000 --- a/ui/src/app/wizard/action/wizard.action.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { Action } from '@ngrx/store'; -import { Wizard } from '../model'; - -export enum WizardActionTypes { - SET_INDEX = '[Wizard] Set Index', - SET_DEFINITION = '[Wizard] Set Definition', - UPDATE_DEFINITION = '[Wizard] Update Definition', - SET_DISABLED = '[Wizard] Set Disabled', - - ADD_SCHEMA = '[Wizard] Add Schema', - - NEXT = '[Wizard] Next Page', - PREVIOUS = '[Wizard] Previous Page', - - CLEAR = '[Wizard] Clear', - - LOAD_SCHEMA_REQUEST = '[Wizard] Load Schema Request', - LOAD_SCHEMA_SUCCESS = '[Wizard] Load Schema Success', - LOAD_SCHEMA_FAIL = '[Wizard] Load Schema Fail', - - LOCK = '[Wizard] Lock', - UNLOCK = '[Wizard] Unlock' -} - -export class SetIndex implements Action { - readonly type = WizardActionTypes.SET_INDEX; - - constructor(public payload: string) { } -} - -export class SetDefinition implements Action { - readonly type = WizardActionTypes.SET_DEFINITION; - - constructor(public payload: Wizard) { } -} - -export class UpdateDefinition implements Action { - readonly type = WizardActionTypes.UPDATE_DEFINITION; - - constructor(public payload: Wizard) { } -} - -export class SetDisabled implements Action { - readonly type = WizardActionTypes.SET_DISABLED; - - constructor(public payload: boolean) { } -} - -export class Next implements Action { - readonly type = WizardActionTypes.NEXT; - - constructor(public payload: string) { } -} - -export class Previous implements Action { - readonly type = WizardActionTypes.PREVIOUS; - - constructor(public payload: string) { } -} - -export class ClearWizard implements Action { - readonly type = WizardActionTypes.CLEAR; -} - -export class LoadSchemaRequest implements Action { - readonly type = WizardActionTypes.LOAD_SCHEMA_REQUEST; - - constructor(public payload: string) { } -} - -export class LoadSchemaSuccess implements Action { - readonly type = WizardActionTypes.LOAD_SCHEMA_SUCCESS; - - constructor(public payload: any) { } -} - -export class LoadSchemaFail implements Action { - readonly type = WizardActionTypes.LOAD_SCHEMA_FAIL; - - constructor(public payload: Error) { } -} - -export class LockEditor implements Action { - readonly type = WizardActionTypes.LOCK; -} - -export class UnlockEditor implements Action { - readonly type = WizardActionTypes.UNLOCK; -} - -export type WizardActionUnion = - | SetIndex - | SetDefinition - | UpdateDefinition - | SetDisabled - | Next - | Previous - | ClearWizard - | LoadSchemaRequest - | LoadSchemaSuccess - | LoadSchemaFail - | LockEditor - | UnlockEditor; diff --git a/ui/src/app/wizard/component/wizard.component.html b/ui/src/app/wizard/component/wizard.component.html deleted file mode 100644 index aca2a1e2e..000000000 --- a/ui/src/app/wizard/component/wizard.component.html +++ /dev/null @@ -1,63 +0,0 @@ - diff --git a/ui/src/app/wizard/component/wizard.component.scss b/ui/src/app/wizard/component/wizard.component.scss deleted file mode 100644 index fe24b9a93..000000000 --- a/ui/src/app/wizard/component/wizard.component.scss +++ /dev/null @@ -1,13 +0,0 @@ -:host { - .nav.nav-wizard { - justify-content: start; - - .nav-item { - &:last-child { - &:first-child { - margin-left: 0px; - } - } - } - } -} \ No newline at end of file diff --git a/ui/src/app/wizard/component/wizard.component.spec.ts b/ui/src/app/wizard/component/wizard.component.spec.ts deleted file mode 100644 index c694cbf91..000000000 --- a/ui/src/app/wizard/component/wizard.component.spec.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; - -import * as fromWizard from '../reducer'; -import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; -import { WizardComponent } from './wizard.component'; -import { WizardService } from '../service/wizard.service'; -import { MockI18nModule } from '../../../testing/i18n.stub'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(WizardComponent, {static: true}) - public componentUnderTest: WizardComponent; -} - -describe('Wizard Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: WizardComponent; - let store: Store; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - RouterTestingModule, - StoreModule.forRoot({ - wizard: combineReducers(fromWizard.reducers) - }), - MockI18nModule - ], - declarations: [ - WizardComponent, - TestHostComponent - ], - providers: [ - WizardService - ] - }).compileComponents(); - - store = TestBed.get(Store); - spyOn(store, 'dispatch'); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should compile without error', () => { - expect(app).toBeTruthy(); - }); -}); diff --git a/ui/src/app/wizard/component/wizard.component.ts b/ui/src/app/wizard/component/wizard.component.ts deleted file mode 100644 index 1b7103c93..000000000 --- a/ui/src/app/wizard/component/wizard.component.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { Component, Input, Output, EventEmitter, OnChanges } from '@angular/core'; -import { Store } from '@ngrx/store'; -import { Wizard, WizardStep } from '../model'; -import * as fromWizard from '../reducer'; -import { Observable } from 'rxjs'; -import { withLatestFrom, map } from 'rxjs/operators'; -import { WizardService } from '../service/wizard.service'; - -/*tslint:disable:component-selector */ -@Component({ - selector: 'wizard', - templateUrl: './wizard.component.html', - styleUrls: ['./wizard.component.scss'] -}) -export class WizardComponent { - @Output() onNext = new EventEmitter(); - @Output() onPrevious = new EventEmitter(); - @Output() onLast = new EventEmitter(); - @Output() onSave = new EventEmitter(); - - currentPage: any = {}; - previousPage: any = {}; - nextPage: any = {}; - - index$: Observable; - disabled$: Observable; - definition$: Observable>; - - previous$: Observable; - next$: Observable; - current$: Observable; - last$: Observable; - - currentIcon$: Observable; - - icons = this.service.icons; - - constructor( - private store: Store, - private service: WizardService - ) { - this.index$ = this.store.select(fromWizard.getWizardIndex); - this.definition$ = this.store.select(fromWizard.getWizardDefinition); - this.disabled$ = this.store.select(fromWizard.getWizardIsDisabled); - this.previous$ = this.store.select(fromWizard.getPrevious); - this.next$ = this.store.select(fromWizard.getNext); - this.current$ = this.store.select(fromWizard.getCurrent); - this.last$ = this.store.select(fromWizard.getLast); - - this.currentIcon$ = this.current$.pipe( - withLatestFrom(this.last$), - map(([current, last]) => this.service.getIcon(current, last)) - ); - } -} diff --git a/ui/src/app/wizard/model/form-definition.ts b/ui/src/app/wizard/model/form-definition.ts deleted file mode 100644 index 5e3cbb6ea..000000000 --- a/ui/src/app/wizard/model/form-definition.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Selector } from '@ngrx/store'; - -export interface FormDefinition { - label: string; - type: string; - schema: string; - bindings?: any; - validatorParams: any; - getEntity?(entity: any): any; - parser(changes: Partial, schema?: any); - formatter(changes: Partial, schema?: any); - getValidators?(...args: any[]): { [key: string]: any }; - schemaPreprocessor?(schema: any): any; -} diff --git a/ui/src/app/wizard/model/index.ts b/ui/src/app/wizard/model/index.ts deleted file mode 100644 index b42933239..000000000 --- a/ui/src/app/wizard/model/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './wizard'; -export * from './form-definition'; diff --git a/ui/src/app/wizard/model/wizard.ts b/ui/src/app/wizard/model/wizard.ts deleted file mode 100644 index 5729c4f24..000000000 --- a/ui/src/app/wizard/model/wizard.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { FormDefinition } from './form-definition'; - -export interface Wizard extends FormDefinition { - steps: WizardStep[]; - schema: string; -} - -export interface WizardStep { - id: string; - label: string; - initialValues?: WizardValue[]; - index: number; - locked?: boolean; - fields?: string[]; - fieldsets?: WizardFieldset[]; - summary?: boolean; - override?: any; - order?: string[]; -} - -export interface WizardFieldset { - type: string; - class?: string[]; - fields: (string | WizardFieldsubset)[]; -} - -export interface WizardValue { - key: string; - value: any; -} - -export interface WizardFieldsubset { - parent: string; - children: string[]; -} diff --git a/ui/src/app/wizard/reducer/index.spec.ts b/ui/src/app/wizard/reducer/index.spec.ts deleted file mode 100644 index 5f72dd71f..000000000 --- a/ui/src/app/wizard/reducer/index.spec.ts +++ /dev/null @@ -1,165 +0,0 @@ -import * as selectors from './'; -import { FileBackedHttpMetadataProviderWizard } from '../../metadata/provider/model'; - -describe('wizard index selectors', () => { - describe('getSchema method', () => { - it('should return the schema by index name', () => { - expect( - selectors.getSchemaPath(FileBackedHttpMetadataProviderWizard) - ).toBe(FileBackedHttpMetadataProviderWizard.schema); - }); - it('should return nothing if no schema is found', () => { - expect( - selectors.getSchemaPath(null) - ).toBeFalsy(); - }); - }); - describe('getPreviousFn method', () => { - it('should return the previous step', () => { - expect( - selectors.getPreviousFn('reloading', FileBackedHttpMetadataProviderWizard) - ).toBe(FileBackedHttpMetadataProviderWizard.steps[0]); - }); - it('should return null if the index is the first step', () => { - expect( - selectors.getPreviousFn('common', FileBackedHttpMetadataProviderWizard) - ).toBeFalsy(); - }); - it('should return nothing if no schema is found', () => { - expect( - selectors.getPreviousFn('common', null) - ).toBeFalsy(); - }); - }); - - describe('getNextFn method', () => { - it('should return the previous step', () => { - expect( - selectors.getNextFn('common', FileBackedHttpMetadataProviderWizard) - ).toBe(FileBackedHttpMetadataProviderWizard.steps[1]); - }); - it('should return null if the index is the last step', () => { - expect( - selectors.getNextFn('summary', FileBackedHttpMetadataProviderWizard) - ).toBeFalsy(); - }); - it('should return nothing if no schema is found', () => { - expect( - selectors.getNextFn('common', null) - ).toBeFalsy(); - }); - }); - - describe('getCurrentFn method', () => { - it('should return the current step', () => { - expect( - selectors.getCurrentFn('common', FileBackedHttpMetadataProviderWizard) - ).toBe(FileBackedHttpMetadataProviderWizard.steps[0]); - }); - it('should return nothing if no schema is found', () => { - expect( - selectors.getCurrentFn('common', null) - ).toBeFalsy(); - }); - }); - - describe('getLastFn method', () => { - it('should return the last step', () => { - expect( - selectors.getLastFn('summary', FileBackedHttpMetadataProviderWizard) - ).toBe(FileBackedHttpMetadataProviderWizard.steps.find(step => step.id === 'summary')); - }); - it('should return nothing if no definition is provided', () => { - expect( - selectors.getLastFn('common', null) - ).toBeFalsy(); - }); - it('should return nothing if no schema is found', () => { - expect( - selectors.getLastFn('common', FileBackedHttpMetadataProviderWizard) - ).toBeFalsy(); - }); - }); - - describe('getModelFn method', () => { - it('should return the model', () => { - const step = FileBackedHttpMetadataProviderWizard.steps.find(s => s.id === 'common'); - expect(selectors.getModelFn(step)).toEqual({}); - }); - }); - - describe(`reducer/selector logic functions`, () => { - - describe('getSchemaParseFn', () => { - const schema = { - properties: { - foo: { - type: 'string' - } - } - }; - const schema2 = { - properties: { - foo: { - type: 'object', - properties: { - bar: { - type: 'string' - } - } - } - } - }; - it('should lock all properties', () => { - expect(selectors.getSchemaParseFn(schema, true)).toEqual({ - ...schema, - properties: { - ...schema.properties, - foo: { - ...schema.properties.foo, - readOnly: true - } - } - }); - }); - - it('should unlock all properties', () => { - expect(selectors.getSchemaParseFn(schema, false)).toEqual({ - ...schema, - properties: { - ...schema.properties, - foo: { - type: 'string', - readOnly: false - } - } - }); - }); - - it('should lock child properties properties', () => { - expect(selectors.getSchemaParseFn(schema2, true)).toEqual({ - ...schema, - properties: { - ...schema2.properties, - foo: { - ...schema2.properties.foo, - readOnly: true, - properties: { - bar: { - ...schema2.properties.foo.properties.bar, - readOnly: true - } - } - } - } - }); - }); - }); - - describe('getSchemaLockedFn', () => { - it('should return true if the step is locked', () => { - expect(selectors.getSchemaLockedFn({ locked: true }, false)).toEqual(false); - }); - }); - }); -}); diff --git a/ui/src/app/wizard/reducer/index.ts b/ui/src/app/wizard/reducer/index.ts deleted file mode 100644 index ca4cdb0f7..000000000 --- a/ui/src/app/wizard/reducer/index.ts +++ /dev/null @@ -1,144 +0,0 @@ -import * as fromRoot from '../../app.reducer'; -import * as fromWizard from './wizard.reducer'; -import { createFeatureSelector, createSelector } from '@ngrx/store'; -import { Wizard, WizardStep } from '../model'; - -export interface WizardState { - wizard: fromWizard.State; -} - -export const reducers = { - wizard: fromWizard.reducer, -}; - -export interface State extends fromRoot.State { - 'wizard': WizardState; -} - -export function getSchemaParseFn(schema, locked): any { - if (!schema || !schema.properties) { - return schema; - } - return { - ...schema, - properties: Object.keys(schema.properties).reduce((prev, current) => { - return { - ...prev, - [current]: { - ...schema.properties[current], - readOnly: locked, - ...(schema.properties[current].hasOwnProperty('properties') ? - getSchemaParseFn(schema.properties[current], locked) : - {} - ) - } - }; - }, {}) - }; -} - -export const getWizardState = createFeatureSelector('wizard'); -export const getWizardStateFn = (state: WizardState) => state.wizard; -export const getState = createSelector(getWizardState, getWizardStateFn); - -export const getWizardIndex = createSelector(getState, fromWizard.getIndex); -export const getWizardIsDisabled = createSelector(getState, fromWizard.getDisabled); -export const getWizardDefinition = createSelector(getState, fromWizard.getDefinition); - -export const getSchemaPath = (wizard: Wizard) => wizard ? wizard.schema : null; - -export const getSplitSchema = (schema: any, step: WizardStep) => { - if (!schema || !step || !step.fields || !step.fields.length || !schema.properties) { - return schema; - } - const keys = Object.keys(schema.properties).filter(key => step.fields.indexOf(key) > -1); - const required = (schema.required || []).filter(val => keys.indexOf(val) > -1); - let s: any = { - type: schema.type, - properties: { - ...keys.reduce( (properties, key) => ({ ...properties, [key]: schema.properties[key] }) , {}) - } - }; - - if (step.override) { - Object.keys(step.override).forEach(key => { - let override = step.override[key]; - if (s.properties.hasOwnProperty(key)) { - s.properties[key] = { ...s.properties[key], ...override }; - } - }); - } - - if (step.order) { - s.order = step.order; - } - - if (schema.definitions) { - s.definitions = schema.definitions; - } - if (required && required.length) { - s.required = required; - } - if (step.fieldsets) { - s.fieldsets = step.fieldsets; - } - - return s; -}; - -export const getCurrentWizardSchema = createSelector(getWizardDefinition, getSchemaPath); - -export const getPreviousFn = (index: string, wizard: Wizard) => { - if (!wizard) { return null; } - const step = wizard.steps.findIndex(s => s.id === index); - return wizard.steps[step - 1]; -}; - -export const getNextFn = (index: string, wizard: Wizard) => { - if (!wizard) { return null; } - const step = wizard.steps.findIndex(s => s.id === index); - return wizard.steps[step + 1]; -}; - -export const getCurrentFn = (index: string, wizard: Wizard) => { - if (!wizard) { return null; } - return wizard.steps.find(s => s.id === index); -}; - -export const getLastFn = (index: string, wizard: Wizard) => { - if (!wizard) { return null; } - const step = wizard.steps.length > 1 && wizard.steps[wizard.steps.length - 1]; - return index === step.id ? step : null; -}; - -export const getModelFn = (currentStep: WizardStep) => { - const model = (currentStep && currentStep.initialValues) ? currentStep.initialValues : []; - return model.reduce((m, property) => ({...m, [property.key]: property.value }), {}); -}; - -export const getPrevious = createSelector(getWizardIndex, getWizardDefinition, getPreviousFn); -export const getCurrent = createSelector(getWizardIndex, getWizardDefinition, getCurrentFn); -export const getNext = createSelector(getWizardIndex, getWizardDefinition, getNextFn); -export const getLast = createSelector(getWizardIndex, getWizardDefinition, getLastFn); -export const getModel = createSelector(getCurrent, getModelFn); - -export const getRoutes = createSelector(getWizardDefinition, d => d ? d.steps.map(step => ({ path: step.id, label: step.label })) : [] ); - -export const getLockedStatus = createSelector(getState, fromWizard.getLocked); -export const getSchemaLockedFn = (step, locked) => step ? step.locked ? locked : false : false; -export const getLocked = createSelector(getCurrent, getLockedStatus, getSchemaLockedFn); - -export const getSchemaProcessedFn = (schema, definition) => - definition && definition.schemaPreprocessor ? definition.schemaPreprocessor(schema) : schema; - -export const getSchemaObject = createSelector(getState, fromWizard.getSchema); -export const getProcessedSchema = createSelector(getSchemaObject, getWizardDefinition, getSchemaProcessedFn); -export const getParsedSchema = createSelector(getProcessedSchema, getLocked, getSchemaParseFn); - -export const getSchema = createSelector(getParsedSchema, getCurrent, getSplitSchema); - -export const getWizardDefinitionValidationParams = createSelector(getWizardDefinition, def => def.validatorParams); - -export const getValidators = (params: any) => createSelector(getWizardDefinition, (definition) => { - return definition.getValidators(...params); -}); diff --git a/ui/src/app/wizard/reducer/wizard.reducer.spec.ts b/ui/src/app/wizard/reducer/wizard.reducer.spec.ts deleted file mode 100644 index 8276a2d68..000000000 --- a/ui/src/app/wizard/reducer/wizard.reducer.spec.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { reducer, initialState as snapshot } from './wizard.reducer'; -import * as selectors from './wizard.reducer'; -import { - WizardActionTypes, - ClearWizard, - SetDisabled, - SetDefinition, - SetIndex, - LockEditor, - LoadSchemaRequest, - LoadSchemaFail, - LoadSchemaSuccess, - UnlockEditor, - UpdateDefinition -} from '../action/wizard.action'; -import { SCHEMA } from '../../../testing/form-schema.stub'; -import { MetadataProviderWizard, FileBackedHttpMetadataProviderWizard } from '../../metadata/provider/model'; - - - -describe('Wizard Reducer', () => { - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(snapshot, {} as any); - - expect(result).toEqual(snapshot); - }); - }); - - describe(`${WizardActionTypes.CLEAR}`, () => { - it('should reset to initial state', () => { - expect(reducer(snapshot, new ClearWizard())).toEqual(snapshot); - }); - }); - - describe(`${WizardActionTypes.SET_DISABLED}`, () => { - it('should set the disabled property on the wizard', () => { - expect(reducer(snapshot, new SetDisabled(true)).disabled).toBe(true); - expect(reducer(snapshot, new SetDisabled(false)).disabled).toBe(false); - }); - }); - - describe(`${WizardActionTypes.SET_DEFINITION}`, () => { - it('should set the definition property on the wizard', () => { - expect(reducer(snapshot, new SetDefinition(MetadataProviderWizard)).definition).toBe(MetadataProviderWizard); - }); - }); - - describe(`${WizardActionTypes.SET_INDEX}`, () => { - it('should set the definition property on the wizard', () => { - expect(reducer(snapshot, new SetIndex(MetadataProviderWizard.steps[0].id)).index).toBe('new'); - }); - }); - - describe(`${WizardActionTypes.SET_INDEX}`, () => { - let state = reducer(snapshot, new SetDefinition(MetadataProviderWizard)); - it('should set the definition property on the wizard', () => { - expect(reducer(state, new UpdateDefinition(FileBackedHttpMetadataProviderWizard))).toEqual({ - ...state, - definition: { - ...MetadataProviderWizard, - ...FileBackedHttpMetadataProviderWizard, - steps: [ - ...MetadataProviderWizard.steps, - ...FileBackedHttpMetadataProviderWizard.steps - ] - } - }); - }); - }); - - describe(`${WizardActionTypes.LOCK}`, () => { - it('should reset to initial state', () => { - expect(reducer(snapshot, new LockEditor())).toEqual({ ...snapshot, locked: true }); - }); - }); - - describe(`${WizardActionTypes.UNLOCK}`, () => { - it('should reset to initial state', () => { - expect(reducer(snapshot, new UnlockEditor())).toEqual({ ...snapshot, locked: false }); - }); - }); - - describe(`${WizardActionTypes.LOAD_SCHEMA_REQUEST}`, () => { - it('should reset to initial state', () => { - expect(reducer(snapshot, new LoadSchemaRequest('foo'))).toEqual({ ...snapshot, schemaPath: 'foo', loading: true }); - }); - }); - - describe(`${WizardActionTypes.LOAD_SCHEMA_FAIL}`, () => { - it('should reset to initial state', () => { - expect(reducer(snapshot, new LoadSchemaFail(new Error('fail')))).toEqual({ ...snapshot }); - }); - }); - - describe(`${WizardActionTypes.LOAD_SCHEMA_REQUEST}`, () => { - it('should reset to initial state', () => { - expect(reducer(snapshot, new LoadSchemaSuccess({}))).toEqual({ ...snapshot, schema: {} }); - }); - }); - - describe('selector functions', () => { - it('should return pieces of state', () => { - expect(selectors.getDefinition(snapshot)).toEqual(snapshot.definition); - expect(selectors.getDisabled(snapshot)).toEqual(snapshot.disabled); - expect(selectors.getIndex(snapshot)).toEqual(snapshot.index); - }); - }); -}); diff --git a/ui/src/app/wizard/reducer/wizard.reducer.ts b/ui/src/app/wizard/reducer/wizard.reducer.ts deleted file mode 100644 index 819a82533..000000000 --- a/ui/src/app/wizard/reducer/wizard.reducer.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { Wizard } from '../model'; -import { WizardActionUnion, WizardActionTypes } from '../action/wizard.action'; - -export interface State { - index: string; - disabled: boolean; - definition: Wizard; - schemaPath: string; - loading: boolean; - schema: any; - locked: boolean; -} - -export const initialState: State = { - index: null, - disabled: false, - definition: null, - schemaPath: null, - loading: false, - schema: null, - locked: false -}; - -export function reducer(state = initialState, action: WizardActionUnion): State { - switch (action.type) { - case WizardActionTypes.LOAD_SCHEMA_REQUEST: { - return { - ...state, - loading: true, - schemaPath: action.payload - }; - } - case WizardActionTypes.LOAD_SCHEMA_SUCCESS: { - return { - ...state, - loading: false, - schema: action.payload - }; - } - case WizardActionTypes.LOAD_SCHEMA_FAIL: { - return { - ...state, - loading: false, - schema: initialState.schema - }; - } - - case WizardActionTypes.LOCK: { - return { - ...state, - locked: true - }; - } - - case WizardActionTypes.UNLOCK: { - return { - ...state, - locked: false - }; - } - case WizardActionTypes.SET_DISABLED: { - return { - ...state, - disabled: action.payload - }; - } - case WizardActionTypes.SET_INDEX: { - return { - ...state, - index: action.payload - }; - } - case WizardActionTypes.SET_DEFINITION: { - return { - ...state, - definition: action.payload - }; - } - case WizardActionTypes.UPDATE_DEFINITION: { - const current = state.definition; - return { - ...state, - definition: { - ...current, - ...action.payload, - steps: [ - ...current.steps, - ...action.payload.steps - ] - } - }; - } - case WizardActionTypes.CLEAR: { - return { - ...initialState - }; - } - default: { - return state; - } - } -} - -export const getSchema = (state: State) => state.schema; -export const getLocked = (state: State) => state.locked; - -export const getIndex = (state: State) => state.index; -export const getDisabled = (state: State) => state.disabled; -export const getDefinition = (state: State) => state.definition; diff --git a/ui/src/app/wizard/service/wizard.service.spec.ts b/ui/src/app/wizard/service/wizard.service.spec.ts deleted file mode 100644 index f7aa204cd..000000000 --- a/ui/src/app/wizard/service/wizard.service.spec.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { WizardService, ICONS } from './wizard.service'; -import { TestBed } from '@angular/core/testing'; - -describe('Wizard Service', () => { - let service: WizardService; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - WizardService - ] - }); - - service = TestBed.get(WizardService); - }); - - describe('getIcon method', () => { - it('should return the check string for the last index', () => { - expect(service.getIcon({ index: 'foo' }, { index: 'foo' })).toEqual(ICONS.CHECK); - }); - it('should return the index icon for other indexes', () => { - expect(service.getIcon({ index: 'foo' }, { index: 'bar' })).toEqual(ICONS.INDEX); - expect(service.getIcon({ index: 'foo' }, null)).toEqual(ICONS.INDEX); - }); - }); -}); diff --git a/ui/src/app/wizard/service/wizard.service.ts b/ui/src/app/wizard/service/wizard.service.ts deleted file mode 100644 index 83eebe089..000000000 --- a/ui/src/app/wizard/service/wizard.service.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Injectable } from '@angular/core'; - - -export enum ICONS { - CHECK = 'CHECK', - INDEX = 'INDEX' -} - -@Injectable() -export class WizardService { - - public icons = ICONS; - - constructor() { } - - getIcon(current, last): string { - return (last && current.index === last.index) ? ICONS.CHECK : ICONS.INDEX; - } -} diff --git a/ui/src/app/wizard/wizard.module.spec.ts b/ui/src/app/wizard/wizard.module.spec.ts deleted file mode 100644 index 547090d8f..000000000 --- a/ui/src/app/wizard/wizard.module.spec.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { WizardModule } from './wizard.module'; -import { TestBed } from '@angular/core/testing'; -import { WizardService } from './service/wizard.service'; -import { StoreModule } from '@ngrx/store'; -import { EffectsModule } from '@ngrx/effects'; - -describe('Wizard Module', () => { - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - StoreModule.forRoot({}), - EffectsModule.forRoot([]), - WizardModule.forRoot() - ] - }); - }); - - it('should compile', () => { - expect(TestBed.get(WizardService)).toBeDefined(); - }); -}); diff --git a/ui/src/app/wizard/wizard.module.ts b/ui/src/app/wizard/wizard.module.ts deleted file mode 100644 index 75fdb7e39..000000000 --- a/ui/src/app/wizard/wizard.module.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { NgModule, ModuleWithProviders } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { StoreModule } from '@ngrx/store'; -import { EffectsModule } from '@ngrx/effects'; - -import { WizardComponent } from './component/wizard.component'; -import { reducers } from './reducer'; -import { I18nModule } from '../i18n/i18n.module'; -import { WizardService } from './service/wizard.service'; - -@NgModule({ - declarations: [ - WizardComponent - ], - entryComponents: [], - imports: [ - CommonModule, - I18nModule - ], - exports: [ - WizardComponent - ] -}) -export class WizardModule { - static forRoot(): ModuleWithProviders { - return { - ngModule: RootWizardModule, - providers: [WizardService] - }; - } -} - -@NgModule({ - imports: [ - WizardModule, - StoreModule.forFeature('wizard', reducers), - EffectsModule.forFeature([]), - ], -}) -export class RootWizardModule { } diff --git a/ui/src/assets/schema/filter/entity-attributes.schema.json b/ui/src/assets/schema/filter/entity-attributes.schema.json deleted file mode 100644 index 2350a345c..000000000 --- a/ui/src/assets/schema/filter/entity-attributes.schema.json +++ /dev/null @@ -1,226 +0,0 @@ -{ - "title": "EntityAttributes Filter", - "type": "object", - "widget": { - "id": "fieldset" - }, - "properties": { - "name": { - "title": "label.filter-name", - "description": "tooltip.filter-name", - "type": "string", - "widget": { - "id": "string", - "help": "message.must-be-unique" - } - }, - "@type": { - "type": "string", - "widget": { - "id": "hidden" - }, - "default": "EntityAttributes" - }, - "resourceId": { - "type": "string", - "widget": { - "id": "hidden" - } - }, - "version": { - "type": "integer", - "widget": { - "id": "hidden" - } - }, - "filterEnabled": { - "title": "label.enable-filter", - "description": "tooltip.enable-filter", - "type": "boolean", - "default": false - }, - "entityAttributesFilterTarget": { - "title": "label.search-criteria", - "description": "tooltip.search-criteria", - "type": "object", - "widget": { - "id": "filter-target" - }, - "properties": { - "entityAttributesFilterTargetType": { - "title": "", - "type": "string", - "default": "ENTITY", - "oneOf": [ - { - "enum": [ - "ENTITY" - ], - "description": "value.entity-id" - }, - { - "enum": [ - "REGEX" - ], - "description": "value.regex" - }, - { - "enum": [ - "CONDITION_SCRIPT" - ], - "description": "value.script" - } - ] - }, - "value": { - "type": "array", - "buttons": [ - { - "id": "preview", - "label": "action.preview", - "widget": "icon-button" - } - ], - "minItems": 1, - "uniqueItems": true, - "items": { - "type": "string" - } - } - }, - "required": ["value", "entityAttributesFilterTargetType"] - }, - "relyingPartyOverrides": { - "type": "object", - "properties": { - "signAssertion": { - "title": "label.sign-the-assertion", - "description": "tooltip.sign-assertion", - "type": "boolean", - "default": false - }, - "dontSignResponse": { - "title": "label.dont-sign-the-response", - "description": "tooltip.dont-sign-response", - "type": "boolean", - "default": false - }, - "turnOffEncryption": { - "title": "label.turn-off-encryption-of-response", - "description": "tooltip.turn-off-encryption", - "type": "boolean", - "default": false - }, - "useSha": { - "title": "label.use-sha1-signing-algorithm", - "description": "tooltip.usa-sha-algorithm", - "type": "boolean", - "default": false - }, - "ignoreAuthenticationMethod": { - "title": "label.ignore-any-sp-requested-authentication-method", - "description": "tooltip.ignore-auth-method", - "type": "boolean", - "default": false - }, - "forceAuthn": { - "title": "label.force-authn", - "description": "tooltip.force-authn", - "type": "boolean", - "default": false - }, - "omitNotBefore": { - "title": "label.omit-not-before-condition", - "type": "boolean", - "description": "tooltip.omit-not-before-condition", - "default": false - }, - "responderId": { - "title": "label.responder-id", - "description": "tooltip.responder-id", - "type": "string" - }, - "nameIdFormats": { - "title": "label.nameid-format-to-send", - "placeholder": "label.nameid-format", - "description": "tooltip.nameid-format", - "type": "array", - "uniqueItems": true, - "items": { - "title": "label.nameid-format", - "type": "string", - "widget": { - "id": "datalist", - "data": [ - "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified", - "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress", - "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent", - "urn:oasis:names:tc:SAML:2.0:nameid-format:transient" - ] - } - }, - "default": null - }, - "authenticationMethods": { - "title": "label.authentication-methods-to-use", - "description": "tooltip.authentication-methods-to-use", - "type": "array", - "placeholder": "label.authentication-method", - "uniqueItems": true, - "items": { - "type": "string", - "title": "label.authentication-method", - "widget": { - "id": "datalist", - "data": [ - "https://refeds.org/profile/mfa", - "urn:oasis:names:tc:SAML:2.0:ac:classes:TimeSyncToken", - "urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport" - ] - } - }, - "default": null - } - } - }, - "attributeRelease": { - "type": "array", - "description": "Attribute release table - select the attributes you want to release (default unchecked)", - "widget": { - "id": "checklist", - "dataUrl": "/customAttributes" - }, - "items": { - "type": "string" - } - } - }, - "required": [ - "name" - ], - "fieldsets": [ - { - "type": "group-lg", - "fields": [ - "name", - "@type", - "resourceId", - "version", - "entityAttributesFilterTarget" - ] - }, - { - "type": "group", - "fields": [ - "filterEnabled", - "relyingPartyOverrides" - ] - }, - { - "type": "group", - "fields": [ - "attributeRelease" - ] - } - ] -} \ No newline at end of file diff --git a/ui/src/assets/schema/provider/file-system.schema.json b/ui/src/assets/schema/provider/file-system.schema.json deleted file mode 100644 index 122f46cc8..000000000 --- a/ui/src/assets/schema/provider/file-system.schema.json +++ /dev/null @@ -1,143 +0,0 @@ -{ - "type": "object", - "required": [ - "name", - "@type", - "xmlId", - "metadataFile" - ], - "properties": { - "name": { - "title": "label.service-provider-name-dashboard-display-only", - "description": "tooltip.metadata-provider-name", - "type": "string", - "widget": { - "id": "string", - "help": "message.must-be-unique" - } - }, - "@type": { - "title": "label.metadata-provider-type", - "description": "tooltip.metadata-provider-type", - "placeholder": "label.select-metadata-type", - "type": "string", - "readOnly": true, - "widget": { - "id": "select", - "disabled": true - }, - "oneOf": [ - { - "enum": [ - "FileSystemMetadataResolver" - ], - "description": "value.file-system-metadata-provider" - } - ] - }, - "xmlId": { - "title": "label.xml-id", - "description": "tooltip.xml-id", - "type": "string", - "default": "", - "minLength": 1 - }, - "metadataFile": { - "title": "label.metadata-file", - "description": "tooltip.metadata-file", - "type": "string", - "default": "", - "minLength": 1 - }, - "enabled": { - "title": "label.enable-provider-upon-saving", - "description": "tooltip.enable-provider-upon-saving", - "type": "boolean", - "default": false - }, - "doInitialization": { - "title": "label.do-resolver-initialization", - "description": "tooltip.do-resolver-initialization", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ], - "default": false - }, - "reloadableMetadataResolverAttributes": { - "type": "object", - "properties": { - "minRefreshDelay": { - "title": "label.min-refresh-delay", - "description": "tooltip.min-refresh-delay", - "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, - "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" - }, - "maxRefreshDelay": { - "title": "label.max-refresh-delay", - "description": "tooltip.max-refresh-delay", - "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, - "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" - }, - "refreshDelayFactor": { - "title": "label.refresh-delay-factor", - "description": "tooltip.refresh-delay-factor", - "type": "string", - "widget": { - "id": "string", - "help": "message.real-number" - }, - "placeholder": "label.real-number", - "default": "", - "pattern": "^(?:([0]*(\\.[0-9]+)?|[0]*\\.[0-9]*[1-9][0-9]*)|)$" - } - } - } - } -} diff --git a/ui/src/assets/schema/provider/local-dynamic.schema.json b/ui/src/assets/schema/provider/local-dynamic.schema.json deleted file mode 100644 index 7f465221c..000000000 --- a/ui/src/assets/schema/provider/local-dynamic.schema.json +++ /dev/null @@ -1,188 +0,0 @@ -{ - "type": "object", - "required": [ - "name", - "@type", - "xmlId", - "sourceDirectory" - ], - "properties": { - "name": { - "title": "label.metadata-provider-name", - "description": "tooltip.metadata-provider-name", - "type": "string", - "widget": { - "id": "string", - "help": "message.must-be-unique" - } - }, - "@type": { - "title": "label.metadata-provider-type", - "description": "tooltip.metadata-provider-type", - "placeholder": "label.select-metadata-type", - "type": "string", - "readOnly": true, - "widget": { - "id": "select", - "disabled": true - }, - "oneOf": [ - { - "enum": [ - "FileSystemMetadataResolver" - ], - "description": "value.file-system-metadata-provider" - } - ] - }, - "xmlId": { - "title": "label.xml-id", - "description": "tooltip.xml-id", - "type": "string", - "default": "", - "minLength": 1 - }, - "sourceDirectory": { - "title": "label.source-directory", - "description": "tooltip.source-directory", - "type": "string", - "default": "", - "minLength": 1 - }, - "enabled": { - "title": "label.enable-provider-upon-saving", - "description": "tooltip.enable-provider-upon-saving", - "type": "boolean", - "default": false - }, - "reloadableMetadataResolverAttributes": { - "type": "object", - "properties": { - "refreshDelayFactor": { - "title": "label.refresh-delay-factor", - "description": "tooltip.refresh-delay-factor", - "type": "number", - "widget": { - "id": "number", - "step": 0.01 - }, - "placeholder": "label.real-number", - "minimum": 0, - "maximum": 1, - "default": null - }, - "minCacheDuration": { - "title": "label.min-cache-duration", - "description": "tooltip.min-cache-duration", - "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, - "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" - }, - "maxCacheDuration": { - "title": "label.max-cache-duration", - "description": "tooltip.max-cache-duration", - "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, - "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" - }, - "maxIdleEntityData": { - "title": "label.max-idle-entity-data", - "description": "tooltip.max-idle-entity-data", - "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, - "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" - }, - "removeIdleEntityData": { - "title": "label.remove-idle-entity-data", - "description": "tooltip.remove-idle-entity-data", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ], - "default": true - }, - "cleanupTaskInterval": { - "title": "label.cleanup-task-interval", - "description": "tooltip.cleanup-task-interval", - "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, - "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" - } - } - } - } -} \ No newline at end of file diff --git a/ui/src/brand.ts b/ui/src/brand.js similarity index 100% rename from ui/src/brand.ts rename to ui/src/brand.js diff --git a/ui/src/brand.scss b/ui/src/brand.scss index 71b60f991..e69de29bb 100644 --- a/ui/src/brand.scss +++ b/ui/src/brand.scss @@ -1,44 +0,0 @@ -// -// Color system -// Override these colors by uncommenting them and changing the value. -// - -// $white: #FFF; -// $gray-100: #f8f9fa; -// $gray-200: #e9ecef; -// $gray-300: #dee2e6; -// $gray-400: #ced4da; -// $gray-500: #adb5bd; -// $gray-600: #868e96; -// $gray-700: #495057; -// $gray-800: #343a40; -// $gray-900: #212529; -// $black: #000; - -// $blue: #00355f; -// $light-blue: #007db1; -// $indigo: #6610f2; -// $purple: #6f42c1; -// $pink: #e83e8c; -// $red: #d3190f; -// $orange: #fd7e14; -// $yellow: #ffc107; -// $green: #498500; -// $teal: #20c997; -// $cyan: #17a2b8; - -// $dark-grey: #666666; -// $light-grey: #EEEEEE; - -/* -*** Brand definitions -*/ - -// $brand-primary: $blue; -// $brand-secondary: $gray-700; -// $brand-success: $green; -// $brand-info: $light-blue; -// $brand-warning: $yellow; -// $brand-danger: $red; -// $brand-light: $light-grey; -// $brand-dark: $dark-grey; diff --git a/ui/src/data/descriptors.mock.ts b/ui/src/data/descriptors.mock.ts deleted file mode 100644 index acf15fc88..000000000 --- a/ui/src/data/descriptors.mock.ts +++ /dev/null @@ -1,52 +0,0 @@ -export const MOCK_DESCRIPTORS = [ - { - entityId: 'https://carmenwiki.osu.edu/enc/shibboleth', - serviceProviderName: 'Box.net Encrypted Metadata', - serviceEnabled: true - }, - { - entityId: 'https://carmenwiki.osu.edu/shibboleth', - serviceProviderName: 'Box.net Metadata', - serviceEnabled: true - }, - { - entityId: 'http://login.campustelevideo.com', - serviceProviderName: 'Campus Televideo Login SP Metadata', - serviceEnabled: false - }, - { - entityId: 'http://login.campustelevideo.com/test', - serviceProviderName: 'Campus Televideo Login TEST SP Metadata', - serviceEnabled: true - }, - { - entityId: 'http://corp.collegenet.com/shibboleth-sp', - serviceProviderName: 'Collegenet Corp Shibboleth SP', - serviceEnabled: true - }, - { - entityId: 'http://app.cvent.com', - serviceProviderName: 'Cvent App', - serviceEnabled: true - }, - { - entityId: 'http://casper.lmu.edu/shib-prot', - serviceProviderName: 'Casper IMU Shibboleth', - serviceEnabled: true - }, - { - entityId: 'http://confluence.unicon.net/shib', - serviceProviderName: 'Unicon Confluence', - serviceEnabled: true - }, - { - entityId: 'http://jira.unicon.net/shib', - serviceProviderName: 'Unicon Jira', - serviceEnabled: true - }, - { - entityId: 'http://web.unicon.net/shib', - serviceProviderName: 'Unicon Web', - serviceEnabled: true - } -]; diff --git a/ui/src/data/entities.json b/ui/src/data/entities.json deleted file mode 100644 index ad972d8b0..000000000 --- a/ui/src/data/entities.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "entityId": "string", - "serviceProviderName": "string", - "organization": { - "name": "string", - "displayName": "string", - "url": "string" - }, - "contacts": [ - { - "name": "string", - "displayName": "string", - "url": "string" - } - ], - "mdui": { - "displayName": "string", - "informationUrl": "string", - "privacyStatementUrl": "string", - "logoUrl": "string", - "logoHeight": 100, - "logoWidth": 100, - "description": "string" - }, - "securityInfo": { - "x509CertificateAvailable": true, - "authenticationRequestsSigned": true, - "wantAssertionsSigned": true, - "x509Certificates": [ - { - "name": "string", - "type": "string", - "value": "string" - } - ] - }, - "assertionConsumerServices": [ - { - "binding": "string", - "locationUrl": "string", - "makeDefault": true - } - ], - "serviceProviderSsoDescriptor": { - "protocolSupportEnum": "string", - "nameIdFormats": [ - "string" - ] - }, - - "logoutEndpoints": [ - { - "url": "string", - "bindingType": "string" - } - ], - - "serviceEnabled": true, - - "createdDate": "string (date)", - "modifiedDate": "string (date)", - - "relyingPartyOverrides": { - "signAssertion": true, - "dontSignResponse": true, - "turnOffEncryption": true, - "useSha": true, - "ignoreAuthenticationMethod": true, - "omitNotBefore": true, - "responderId": "string", - "nameIdFormats": [ - "string" - ], - "authenticationMethods": [ - "string" - ] - }, - - "attributeRelease": { - "eduPersonPrincipalName": true, - "uid": true, - "mail": true, - "surname": true, - "givenName": true, - "displayName": true, - "eduPersonAffiliation": true, - "eduPersonScopedAffiliation": true, - "eduPersonPrimaryAffiliation": true, - "eduPersonEntitlement": true, - "eduPersonAssurance": true, - "eduPersonUniqueId": true, - "employeeNumber": true - } -} \ No newline at end of file diff --git a/ui/src/data/ids.mock.ts b/ui/src/data/ids.mock.ts deleted file mode 100644 index 08b2ed4ab..000000000 --- a/ui/src/data/ids.mock.ts +++ /dev/null @@ -1,18 +0,0 @@ -export const IDS = [ - 'https://account.example.com/sso', - 'https://www.example.com/', - 'https://www.example.com/somewhere', - 'https://www.example.org/shib/login', - 'https://sso.example.net/baz', - 'https://www.example.com/foo-bar', - 'https://www.example.com/sp/login', - 'https://example.com/activity', - 'https://www.example.com/', - 'https://example.com/sso', - 'https://www.example.com/sso', - 'https://example.com/', - 'https://bee.example.com/bone', - 'https://example.com/random', - 'https://www.example.com/', - 'https://sso.example.net/foo/bar' -]; diff --git a/ui/src/environments/environment.prod.ts b/ui/src/environments/environment.prod.ts deleted file mode 100644 index 3612073bc..000000000 --- a/ui/src/environments/environment.prod.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const environment = { - production: true -}; diff --git a/ui/src/environments/environment.ts b/ui/src/environments/environment.ts deleted file mode 100644 index b7f639aec..000000000 --- a/ui/src/environments/environment.ts +++ /dev/null @@ -1,8 +0,0 @@ -// The file contents for the current environment will overwrite these during build. -// The build system defaults to the dev environment which uses `environment.ts`, but if you do -// `ng build --env=prod` then `environment.prod.ts` will be used instead. -// The list of which env maps to which file can be found in `.angular-cli.json`. - -export const environment = { - production: false -}; diff --git a/ui/src/index.html b/ui/src/index.html deleted file mode 100644 index 705257e2b..000000000 --- a/ui/src/index.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - Shibboleth IDP UI - - - - - - - - - - diff --git a/ui/src/index.js b/ui/src/index.js new file mode 100644 index 000000000..e0143847c --- /dev/null +++ b/ui/src/index.js @@ -0,0 +1,17 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import './index.scss'; +import App from './app/App'; +import reportWebVitals from './reportWebVitals'; + +ReactDOM.render( + + + , + document.getElementById('root') +); + +// If you want to start measuring performance in your app, pass a function +// to log results (for example: reportWebVitals(console.log)) +// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals +reportWebVitals(); diff --git a/ui/src/index.scss b/ui/src/index.scss new file mode 100644 index 000000000..8bb21904d --- /dev/null +++ b/ui/src/index.scss @@ -0,0 +1,7 @@ +@import './theme/variables.scss'; +@import './theme/override.scss'; +@import './theme/bootstrap'; + +// Project +@import './theme/project/index.scss'; + \ No newline at end of file diff --git a/ui/src/logo.svg b/ui/src/logo.svg new file mode 100644 index 000000000..9dfc1c058 --- /dev/null +++ b/ui/src/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ui/src/main.ts b/ui/src/main.ts deleted file mode 100644 index 401abe512..000000000 --- a/ui/src/main.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { enableProdMode } from '@angular/core'; -import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; - -import { AppModule } from './app/app.module'; -import { environment } from './environments/environment'; - -if (environment.production) { - enableProdMode(); -} - -platformBrowserDynamic().bootstrapModule(AppModule); diff --git a/ui/src/polyfills.ts b/ui/src/polyfills.ts deleted file mode 100644 index dd276b59c..000000000 --- a/ui/src/polyfills.ts +++ /dev/null @@ -1,62 +0,0 @@ -/*************************************************************************************************** - * Load `$localize` onto the global scope - used if i18n tags appear in Angular templates. - */ -import '@angular/localize/init'; -/** - * This file includes polyfills needed by Angular and is loaded before the app. - * You can add your own extra polyfills to this file. - * - * This file is divided into 2 sections: - * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. - * 2. Application imports. Files imported after ZoneJS that should be loaded before your main - * file. - * - * The current setup is for so-called "evergreen" browsers; the last versions of browsers that - * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), - * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. - * - * Learn more in https://angular.io/guide/browser-support - */ - -/*************************************************************************************************** -* BROWSER POLYFILLS -*/ - - -/** IE10 and IE11 requires the following for NgClass support on SVG elements */ -// import 'classlist.js'; // Run `npm install --save classlist.js`. - -/** Evergreen browsers require these. **/ -import 'core-js/es6/reflect'; -import 'core-js/es7/reflect'; -import 'core-js/es7/array'; -import 'core-js/es7/object'; - -/** - * Required to support Web Animations `@angular/animation`. - * Needed for: All but Chrome, Firefox and Opera. http://caniuse.com/#feat=web-animation - **/ -// import 'web-animations-js'; // Run `npm install --save web-animations-js`. - - - -/*************************************************************************************************** - * Zone JS is required by Angular itself. - */ -import 'zone.js/dist/zone'; // Included with Angular CLI. - - - -/*************************************************************************************************** - * APPLICATION IMPORTS - */ - -/** - * Date, currency, decimal and percent pipes. - * Needed for: All but Chrome, Firefox, Edge, IE11 and Safari 10 - */ -// import 'intl'; // Run `npm install --save intl`. -/** - * Need to import at least one locale-data with intl. - */ -// import 'intl/locale-data/jsonp/en'; diff --git a/ui/src/reportWebVitals.js b/ui/src/reportWebVitals.js new file mode 100644 index 000000000..5253d3ad9 --- /dev/null +++ b/ui/src/reportWebVitals.js @@ -0,0 +1,13 @@ +const reportWebVitals = onPerfEntry => { + if (onPerfEntry && onPerfEntry instanceof Function) { + import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { + getCLS(onPerfEntry); + getFID(onPerfEntry); + getFCP(onPerfEntry); + getLCP(onPerfEntry); + getTTFB(onPerfEntry); + }); + } +}; + +export default reportWebVitals; diff --git a/ui/src/setupProxy.js b/ui/src/setupProxy.js new file mode 100644 index 000000000..bbd4523b8 --- /dev/null +++ b/ui/src/setupProxy.js @@ -0,0 +1,42 @@ +const { createProxyMiddleware } = require('http-proxy-middleware'); + + +module.exports = function (app) { + + const port = 8080; + + app.use( + '/api', + createProxyMiddleware({ + target: `http://localhost:${port}`, + changeOrigin: true, + onProxyRes: function (proxyRes, req, res) { + proxyRes.headers['Access-Control-Allow-Origin'] = '*'; + } + }) + ); + + app.use( + '/actuator', + createProxyMiddleware({ + target: `http://localhost:${port}`, + changeOrigin: true + }) + ); + + app.use( + '/login', + createProxyMiddleware({ + target: `http://localhost:${port}`, + changeOrigin: true + }) + ); + + app.use( + '/logout', + createProxyMiddleware({ + target: `http://localhost:${port}`, + changeOrigin: true + }) + ); +}; diff --git a/ui/src/setupTests.js b/ui/src/setupTests.js new file mode 100644 index 000000000..8f2609b7b --- /dev/null +++ b/ui/src/setupTests.js @@ -0,0 +1,5 @@ +// jest-dom adds custom jest matchers for asserting on DOM nodes. +// allows you to do things like: +// expect(element).toHaveTextContent(/react/i) +// learn more: https://github.com/testing-library/jest-dom +import '@testing-library/jest-dom'; diff --git a/ui/src/static.scss b/ui/src/static.scss index 67ebeacae..5ca4c18de 100644 --- a/ui/src/static.scss +++ b/ui/src/static.scss @@ -1,11 +1,12 @@ @import '../node_modules/bootstrap/scss/bootstrap'; -@import './theme/palette'; +@import './theme/variables'; $font-size-xs: .75rem !default; $fa-font-path: "."; -@import '../node_modules/font-awesome/scss/font-awesome'; +@import '../node_modules/@fortawesome/fontawesome-free/scss/regular'; +@import '../node_modules/@fortawesome/fontawesome-free/scss/fontawesome'; body { background-color: map-get($theme-colors, light); diff --git a/ui/src/styles.scss b/ui/src/styles.scss deleted file mode 100644 index 30946aaf4..000000000 --- a/ui/src/styles.scss +++ /dev/null @@ -1,58 +0,0 @@ -@import './theme/bootstrap'; -@import './theme/breadcrumb'; -@import './theme/buttons'; -@import './theme/forms'; -@import './theme/modal'; -@import './theme/tags'; -@import './theme/alert'; -@import './theme/typography'; -@import './theme/list'; -@import './theme/utility'; - -body { - background-color: theme-color("light"); - padding-top: 56px; -} - -app-root { - min-height: calc(100vh - 56px); -} - -.pad-content { - height: 100%; -} - -.section { - .section-body { - background: $white; - } -} - -nav.fixed-top { - border-bottom: 3px solid map-get($theme-colors, primary); -} - -footer { - background-color: $white; - padding: 0 20px; - font-size: $font-size-xs; - border-top: 3px solid map-get($theme-colors, primary); - - .copyright { - padding-top: 10px; - - a { - color: map-get($theme-colors, primary); - text-decoration: underline; - } - } - - img { - max-height: 88px; - } -} - -label { - display: flex; - justify-content: space-between; -} diff --git a/ui/src/test.ts b/ui/src/test.ts deleted file mode 100644 index d762d1284..000000000 --- a/ui/src/test.ts +++ /dev/null @@ -1,34 +0,0 @@ -// This file is required by karma.conf.js and loads recursively all the .spec and framework files - -import 'zone.js/dist/long-stack-trace-zone'; -import 'zone.js/dist/proxy.js'; -import 'zone.js/dist/sync-test'; -import 'zone.js/dist/jasmine-patch'; -import 'zone.js/dist/async-test'; -import 'zone.js/dist/fake-async-test'; -import { getTestBed } from '@angular/core/testing'; -import { - BrowserDynamicTestingModule, - platformBrowserDynamicTesting -} from '@angular/platform-browser-dynamic/testing'; - -import 'rxjs'; - -// Unfortunately there's no typing for the `__karma__` variable. Just declare it as any. -declare const __karma__: any; -declare const require: any; - -// Prevent Karma from running prematurely. -__karma__.loaded = function () { }; - -// First, initialize the Angular testing environment. -getTestBed().initTestEnvironment( - BrowserDynamicTestingModule, - platformBrowserDynamicTesting() -); -// Then we find all the tests. -const context = require.context('./', true, /\.spec\.ts$/); -// And load the modules. -context.keys().map(context); -// Finally, start Karma to run the tests. -__karma__.start(); diff --git a/ui/src/testing/activated-route.stub.ts b/ui/src/testing/activated-route.stub.ts deleted file mode 100644 index 4f7a58f5b..000000000 --- a/ui/src/testing/activated-route.stub.ts +++ /dev/null @@ -1,61 +0,0 @@ -/* istanbul ignore */ - -import { Injectable } from '@angular/core'; -import { BehaviorSubject } from 'rxjs'; -import { convertToParamMap, ParamMap } from '@angular/router'; -import { Observable, of } from 'rxjs'; - -@Injectable() -export class ActivatedRouteStub { - - // ActivatedRoute.paramMap is Observable - private subject = new BehaviorSubject(convertToParamMap(this.testParamMap)); - paramMap = this.subject.asObservable(); - - // Test parameters - private _testParamMap: ParamMap; - private _params: any; - - private _firstChild: ActivatedRouteStub; - - private _data: Observable; - - get testParamMap() { return this._testParamMap; } - set testParamMap(params: {}) { - this._testParamMap = convertToParamMap(params); - this._params = params; - this.subject.next(this._testParamMap); - } - - // ActivatedRoute.snapshot.paramMap - get snapshot() { - return { - params: this._params, - paramMap: this.testParamMap, - }; - } - - get params() { - return this.paramMap; - } - - get queryParams() { - return this.paramMap; - } - - get firstChild(): ActivatedRouteStub { - return this._firstChild; - } - - set firstChild(stub: ActivatedRouteStub) { - this._firstChild = stub; - } - - get data(): Observable { - return this._data; - } - - set data(d: Observable) { - this._data = d; - } -} diff --git a/ui/src/testing/attributes.stub.ts b/ui/src/testing/attributes.stub.ts deleted file mode 100644 index d2d6f9575..000000000 --- a/ui/src/testing/attributes.stub.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Observable, of } from 'rxjs'; -import { Injectable } from '@angular/core'; -import { ReleaseAttribute } from '../app/metadata/domain/model/properties/release-attribute'; - -@Injectable() -export class MockAttributeService { - - readonly path = '/customAttributes'; - readonly base = 'api'; - - constructor() { } - - query(path: string = this.path): Observable { - return of([]); - } -} diff --git a/ui/src/testing/descriptor.service.stub.ts b/ui/src/testing/descriptor.service.stub.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/ui/src/testing/dynamic-http.schema.js b/ui/src/testing/dynamic-http.schema.js new file mode 100644 index 000000000..29d68da8c --- /dev/null +++ b/ui/src/testing/dynamic-http.schema.js @@ -0,0 +1,3 @@ +export const schema = { "type": "object", "required": ["name", "@type", "xmlId", "metadataRequestURLConstructionScheme"], "properties": { "name": { "title": "label.metadata-provider-name-dashboard-display-only", "description": "tooltip.metadata-provider-name-dashboard-display-only", "type": "string" }, "@type": { "title": "label.metadata-provider-type", "description": "tooltip.metadata-provider-type", "type": "string", "default": "DynamicHttpMetadataResolver" }, "enabled": { "title": "label.enable-provider-upon-saving", "description": "tooltip.enable-provider-upon-saving", "type": "boolean", "default": false }, "xmlId": { "title": "label.xml-id", "description": "tooltip.xml-id", "type": "string", "minLength": 1 }, "metadataRequestURLConstructionScheme": { "type": "object", "required": ["@type", "content"], "dependencies": { "@type": { "oneOf": [{ "properties": { "@type": { "enum": ["Regex"] }, "match": { "title": "label.match", "description": "tooltip.match", "type": "string", "widget": { "id": "string", "required": true } } }, "required": ["@type", "content", "match"] }, { "properties": { "@type": { "enum": ["MetadataQueryProtocol"] } }, "required": ["@type", "content"] }] } }, "properties": { "@type": { "title": "label.md-request-type", "description": "tooltip.md-request-type", "type": "string", "widget": { "id": "select" }, "enum": ["MetadataQueryProtocol", "Regex"] }, "content": { "title": "label.md-request-value", "description": "tooltip.md-request-value", "type": "string" } } }, "requireValidMetadata": { "title": "label.require-valid-metadata", "description": "tooltip.require-valid-metadata", "type": "boolean" }, "failFastInitialization": { "title": "label.fail-fast-init", "description": "tooltip.fail-fast-init", "type": "boolean" }, "dynamicMetadataResolverAttributes": { "type": "object", "dependencies": { "initializeFromPersistentCacheInBackground": { "oneOf": [{ "properties": { "initializeFromPersistentCacheInBackground": { "enum": [true] }, "backgroundInitializationFromCacheDelay": { "title": "label.background-init-from-cache-delay", "description": "tooltip.background-init-from-cache-delay", "type": "string", "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" } } }, { "properties": { "initializeFromPersistentCacheInBackground": { "enum": [false] } } }] } }, "properties": { "refreshDelayFactor": { "title": "label.refresh-delay-factor", "description": "tooltip.refresh-delay-factor", "type": "number", "multipleOf": 0.01, "minimum": 0.001, "maximum": 0.999 }, "minCacheDuration": { "title": "label.min-cache-duration", "description": "tooltip.min-cache-duration", "type": "string", "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" }, "maxCacheDuration": { "title": "label.max-cache-duration", "description": "tooltip.max-cache-duration", "type": "string", "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" }, "maxIdleEntityData": { "title": "label.max-idle-entity-data", "description": "tooltip.max-idle-entity-data", "type": "string", "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" }, "removeIdleEntityData": { "title": "label.remove-idle-entity-data", "description": "tooltip.remove-idle-entity-data", "type": "boolean" }, "cleanupTaskInterval": { "title": "label.cleanup-task-interval", "description": "tooltip.cleanup-task-interval", "type": "string", "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" }, "persistentCacheManagerDirectory": { "title": "label.persistent-cache-manager-directory", "description": "tooltip.persistent-cache-manager-directory", "type": "string", "minLength": 1 }, "initializeFromPersistentCacheInBackground": { "title": "label.initialize-from-persistent-cache-in-background", "description": "tooltip.initialize-from-persistent-cache-in-background", "type": "boolean" } } }, "httpMetadataResolverAttributes": { "order": [], "type": "object", "fieldsets": [{ "title": "label.http-security-attributes", "type": "section", "class": "col-12", "fields": ["disregardTLSCertificate"] }, { "title": "label.http-connection-attributes", "type": "section", "fields": ["connectionRequestTimeout", "connectionTimeout", "socketTimeout"] }, { "title": "label.http-proxy-attributes", "type": "section", "class": "col-12", "fields": ["proxyHost", "proxyPort", "proxyUser", "proxyPassword"] }, { "title": "label.http-caching-attributes", "type": "section", "class": "col-12", "fields": ["httpCaching", "httpCacheDirectory", "httpMaxCacheEntries", "httpMaxCacheEntrySize"] }, { "title": "", "type": "hidden", "class": "col-12", "fields": ["tlsTrustEngineRef", "httpClientSecurityParametersRef", "httpClientRef"] }], "properties": { "disregardTLSCertificate": { "type": "boolean", "title": "label.disregard-tls-cert", "description": "tooltip.disregard-tls-cert" }, "httpClientRef": { "type": "string", "title": "", "description": "", "widget": "hidden" }, "connectionRequestTimeout": { "type": "string", "title": "label.connection-request-timeout", "description": "tooltip.connection-request-timeout", "widget": { "id": "datalist", "data": ["PT0S", "PT30S", "PT1M", "PT10M", "PT30M", "PT1H", "PT4H", "PT12H", "PT24H"] }, "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" }, "connectionTimeout": { "type": "string", "title": "label.connection-timeout", "description": "tooltip.connection-timeout", "widget": { "id": "datalist", "data": ["PT0S", "PT30S", "PT1M", "PT10M", "PT30M", "PT1H", "PT4H", "PT12H", "PT24H"] }, "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" }, "socketTimeout": { "type": "string", "title": "label.socket-timeout", "description": "tooltip.socket-timeout", "widget": { "id": "datalist", "data": ["PT0S", "PT30S", "PT1M", "PT10M", "PT30M", "PT1H", "PT4H", "PT12H", "PT24H"] }, "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" }, "tlsTrustEngineRef": { "type": "string", "title": "", "description": "" }, "httpClientSecurityParametersRef": { "type": "string", "title": "", "description": "" }, "proxyHost": { "type": "string", "title": "label.proxy-host", "description": "tooltip.proxy-host" }, "proxyPort": { "type": "integer", "title": "label.proxy-port", "description": "tooltip.proxy-port" }, "proxyUser": { "type": "string", "title": "label.proxy-user", "description": "tooltip.proxy-user" }, "proxyPassword": { "type": "string", "title": "label.proxy-password", "description": "tooltip.proxy-password" }, "httpCaching": { "type": "string", "title": "label.http-caching", "description": "tooltip.http-caching", "widget": { "id": "select" }, "oneOf": [{ "enum": ["none"], "description": "value.none" }, { "enum": ["file"], "description": "value.file" }, { "enum": ["memory"], "description": "value.memory" }] }, "httpCacheDirectory": { "type": "string", "title": "label.http-caching-directory", "description": "tooltip.http-caching-directory" }, "httpMaxCacheEntries": { "type": "integer", "title": "label.http-max-cache-entries", "description": "tooltip.http-max-cache-entries", "minimum": 0 }, "httpMaxCacheEntrySize": { "type": "integer", "title": "label.max-cache-entry-size", "description": "tooltip.max-cache-entry-size", "minimum": 0 } } }, "metadataFilters": { "$id": "metadataFilters", "title": "", "description": "", "type": "array", "items": [{ "$id": "RequiredValidUntil", "title": "label.required-valid-until", "type": "object", "widget": { "id": "fieldset" }, "properties": { "@type": { "type": "string", "default": "RequiredValidUntil" }, "maxValidityInterval": { "title": "label.max-validity-interval", "description": "tooltip.max-validity-interval", "type": "string", "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" } } }, { "$id": "SignatureValidation", "title": "label.signature-validation-filter", "type": "object", "widget": { "id": "fieldset" }, "properties": { "@type": { "type": "string", "default": "SignatureValidation" }, "requireSignedRoot": { "title": "label.require-signed-root", "description": "tooltip.require-signed-root", "type": "boolean" }, "certificateFile": { "title": "label.certificate-file", "description": "tooltip.certificate-file", "type": "string" } }, "dependencies": { "requireSignedRoot": { "oneOf": [{ "properties": { "requireSignedRoot": { "enum": [true] } }, "required": ["certificateFile"] }, { "properties": { "requireSignedRoot": { "enum": [false] } } }] } } }, { "$id": "EntityRoleWhiteList", "title": "label.entity-role-whitelist", "type": "object", "widget": { "id": "fieldset" }, "properties": { "@type": { "type": "string", "default": "EntityRoleWhiteList" }, "retainedRoles": { "title": "label.retained-roles", "description": "tooltip.retained-roles", "type": "array", "items": { "widget": { "id": "select" }, "type": "string", "enum": ["SPSSODescriptor", "AttributeAuthorityDescriptor"], "enumNames": ["value.spdescriptor", "value.attr-auth-descriptor"] } }, "removeRolelessEntityDescriptors": { "title": "label.remove-roleless-entity-descriptors", "description": "tooltip.remove-roleless-entity-descriptors", "type": "boolean" }, "removeEmptyEntitiesDescriptors": { "title": "label.remove-empty-entities-descriptors", "description": "tooltip.remove-empty-entities-descriptors", "type": "boolean" } } }] } } }; + +export default schema; \ No newline at end of file diff --git a/ui/src/testing/effect.util.ts b/ui/src/testing/effect.util.ts deleted file mode 100644 index ffe98f4a7..000000000 --- a/ui/src/testing/effect.util.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Actions } from '@ngrx/effects'; -import { empty, Observable } from 'rxjs'; - -export class TestActions extends Actions { - constructor() { - super(empty()); - } - - set stream(source: Observable) { - this.source = source; - } -} - -export function getActions() { - return new TestActions(); -} diff --git a/ui/src/testing/file.service.stub.ts b/ui/src/testing/file.service.stub.ts deleted file mode 100644 index 4263836e5..000000000 --- a/ui/src/testing/file.service.stub.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Subject } from 'rxjs'; -import { Observable } from 'rxjs'; - -export class FileServiceStub { - readAsText(): Observable { - let subj = new Subject(); - subj.next('foo'); - subj.complete(); - return subj.asObservable(); - } -} diff --git a/ui/src/testing/filter-list.stub.ts b/ui/src/testing/filter-list.stub.ts deleted file mode 100644 index 37944825b..000000000 --- a/ui/src/testing/filter-list.stub.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Component, Input, Output, EventEmitter } from '@angular/core'; -import { MetadataFilter } from '../app/metadata/domain/model'; -import { NAV_FORMATS } from '../app/metadata/domain/component/editor-nav.component'; - -/* tslint:disable */ -@Component({ - selector: 'filter-list', - template: `
` -}) -export class FilterListComponentStub { - @Input() filters: MetadataFilter[]; - @Input() disabled: boolean; - - @Output() onUpdateOrderUp: EventEmitter = new EventEmitter(); - @Output() onUpdateOrderDown: EventEmitter = new EventEmitter(); - @Output() onRemove: EventEmitter = new EventEmitter(); - @Output() onToggleEnabled: EventEmitter = new EventEmitter(); - - formats = NAV_FORMATS; -} - -/* tslint:disable */ -@Component({ - selector: 'filter-configuration-list', - template: `
` -}) -export class FilterConfigurationListComponentStub extends FilterListComponentStub {} diff --git a/ui/src/testing/i18n.stub.ts b/ui/src/testing/i18n.stub.ts deleted file mode 100644 index 4f0f012b3..000000000 --- a/ui/src/testing/i18n.stub.ts +++ /dev/null @@ -1,102 +0,0 @@ -/* istanbul ignore */ - -import { PipeTransform, Pipe, NgModule, Directive, Component, Input } from '@angular/core'; - -import { Injectable } from '@angular/core'; -import { Observable, of } from 'rxjs'; -import { CommonModule } from '@angular/common'; - -/*tslint:disable:component-selector */ - -@Pipe({ - name: 'translate' -}) -export class MockTranslatePipe implements PipeTransform { - - constructor() {} - - transform(value: string, interpolated: { [prop: string]: string } = {}): any { - return value; - } -} - -@Directive({ - selector: '[translate]' -}) -export class MockTranslateDirective { - @Input() translate: any | null; - @Input() translateParams: any | null; -} - -@Component({ - selector: 'i18n-text', - template: '' -}) -export class MockI18nTextComponent { - @Input() key: any | null; -} - -@Component({ - selector: 'translate-i18n', - template: '' -}) -export class MockTranslateComponent { - @Input() key: any | null; - @Input() params: any | null; -} - -@Injectable() -export class MockI18nService { - - readonly path = '/messages'; - readonly base = 'api'; - - constructor() { } - - get(locale: string): Observable { - return of({}); - } - - getCurrentLanguage(): string { - return 'en'; - } - - getCurrentCountry(): string { - return 'US'; - } - - getCurrentLocale(): string { - return 'en-US'; - } - - translate (value: string, interpolated: any, messages): string { - return messages.hasOwnProperty(value) ? messages[value] : ''; - } - - interpolate(value: string, interpolated: { [prop: string]: string } = {}): string { - return value; - } -} - - -@NgModule({ - imports: [ - CommonModule - ], - declarations: [ - MockTranslatePipe, - MockTranslateDirective, - MockTranslateComponent, - MockI18nTextComponent - ], - exports: [ - MockTranslateComponent, - MockTranslateDirective, - MockI18nTextComponent, - MockTranslatePipe - ], - providers: [ - MockI18nService - ] -}) -export class MockI18nModule {} diff --git a/ui/src/testing/list-values.stub.ts b/ui/src/testing/list-values.stub.ts deleted file mode 100644 index 3e9ecf152..000000000 --- a/ui/src/testing/list-values.stub.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { Observable, of } from 'rxjs'; -import { Injectable } from '@angular/core'; -import { ReleaseAttribute } from '../app/metadata/domain/model/properties/release-attribute'; -import { debounceTime, distinctUntilChanged, combineLatest } from 'rxjs/operators'; - -@Injectable() -export class MockListValueService { - - constructor() { } - - readonly nameIdFormats: Observable = of([ - 'urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified', - 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress', - 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent', - 'urn:oasis:names:tc:SAML:2.0:nameid-format:transient' - ]); - - readonly authenticationMethods: Observable = of([ - 'https://refeds.org/profile/mfa', - 'urn:oasis:names:tc:SAML:2.0:ac:classes:TimeSyncToken', - 'urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport' - ]); - - get attributesToRelease(): Observable { - return of([]); - } - - searchStringList = (list: Observable): Function => - (text$: Observable) => - text$.pipe( - debounceTime(100), - distinctUntilChanged(), - combineLatest( - list, - (term, formats) => formats.filter( - v => v.toLowerCase().match(term.toLowerCase()) - ) - .slice(0, 4)) - ) - - get searchFormats(): Function { - return this.searchStringList(this.nameIdFormats); - } - get searchAuthenticationMethods(): Function { - return this.searchStringList(this.authenticationMethods); - } -} diff --git a/ui/src/testing/metadata-configuration.stub.ts b/ui/src/testing/metadata-configuration.stub.ts deleted file mode 100644 index c29e29d1b..000000000 --- a/ui/src/testing/metadata-configuration.stub.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Component, Input } from '@angular/core'; -import { MetadataConfiguration } from '../app/metadata/configuration/model/metadata-configuration'; -import { MetadataVersion } from '../app/metadata/configuration/model/version'; - -/* tslint:disable */ -@Component({ - selector: 'metadata-configuration', - template: `` -}) -export class MetadataConfigurationComponentStub { - @Input() configuration: MetadataConfiguration; -} - -@Component({ - selector: 'metadata-header', - template: `` -}) -export class MetadataHeaderComponentStub { - @Input() isEnabled: boolean; - @Input() version: MetadataVersion; - @Input() versionNumber: number; - @Input() isCurrent: boolean; -} diff --git a/ui/src/testing/mock-module.stub.ts b/ui/src/testing/mock-module.stub.ts deleted file mode 100644 index d311e90b6..000000000 --- a/ui/src/testing/mock-module.stub.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { NgModule } from '@angular/core'; -import { MockResolversListComponent } from './resolvers-list.component.stub'; - -export const DECLARATIONS = [ - MockResolversListComponent -]; - -@NgModule({ - declarations: DECLARATIONS, - entryComponents: DECLARATIONS, - imports: [], - exports: DECLARATIONS, - providers: [] -}) -export class MockModule {} diff --git a/ui/src/testing/mockMetadataWizard.ts b/ui/src/testing/mockMetadataWizard.ts deleted file mode 100644 index 95844f8a0..000000000 --- a/ui/src/testing/mockMetadataWizard.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { Wizard } from '../app/wizard/model/wizard'; - -export interface MockMetadata { - name: string; - serviceEnabled: boolean; - foo: { - bar: string; - baz: string; - }; -} - -export const MockMetadataWizard: Wizard = { - label: 'Metadata Source', - type: '@MetadataProvider', - validatorParams: [], - bindings: {}, - parser(changes: Partial, schema?: any): any { - return changes; - }, - formatter(changes: Partial, schema?: any): any { - return changes; - }, - getValidators(): { [key: string]: any } { - return {}; - }, - schema: 'api/ui/MetadataSources', - steps: [ - { - index: 1, - id: 'common', - label: 'label.sp-org-info', - fields: [ - 'name', - 'serviceEnabled' - ], - fieldsets: [ - { - type: 'group', - fields: [ - 'serviceProviderName', - 'entityId', - 'serviceEnabled', - 'organization' - ] - }, - { - type: 'group', - fields: [ - 'contacts' - ] - } - ] - }, - { - index: 2, - id: 'next', - label: 'something', - fields: [ - 'foo', - 'list' - ], - fieldsets: [ - { - type: 'group', - fields: [ - 'foo' - ] - }, - { - type: 'group', - fields: [ - 'list' - ] - } - ] - } - ] -}; diff --git a/ui/src/testing/modal.stub.ts b/ui/src/testing/modal.stub.ts deleted file mode 100644 index 91926192b..000000000 --- a/ui/src/testing/modal.stub.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Injectable } from '@angular/core'; -import { NgbModalOptions } from '@ng-bootstrap/ng-bootstrap'; - -@Injectable() -export class NgbModalStub { - open(content: any, options: NgbModalOptions): {result: Promise, componentInstance: any} { - return { - componentInstance: {}, - result: Promise.resolve(true) - }; - } -} - -@Injectable() -export class NgbActiveModalStub { - close = (result: any): void => {}; - dismiss = (reason: any): void => {}; -} diff --git a/ui/src/testing/navigation-service.stub.ts b/ui/src/testing/navigation-service.stub.ts deleted file mode 100644 index a0e745068..000000000 --- a/ui/src/testing/navigation-service.stub.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { of } from 'rxjs'; -import { NavigationService } from '../app/core/service/navigation.service'; - -export const definition: unknown = { - emitter: of([]), - actionList: [], - addAction: jasmine.createSpy('navService') -}; - -export const NavigationServiceStub = definition as NavigationService; diff --git a/ui/src/testing/page-title-component.stub.ts b/ui/src/testing/page-title-component.stub.ts deleted file mode 100644 index d3a1a748a..000000000 --- a/ui/src/testing/page-title-component.stub.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'page-title', - template: '', - styleUrls: [] -}) -export class MockPageTitleComponent {} diff --git a/ui/src/testing/property-component.stub.ts b/ui/src/testing/property-component.stub.ts deleted file mode 100644 index c09b7c579..000000000 --- a/ui/src/testing/property-component.stub.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { Component, Input, Output, EventEmitter } from '@angular/core'; -import { Property } from '../app/metadata/domain/model/property'; -import { Observable, of } from 'rxjs'; - -@Component({ - selector: 'configuration-property', - template: `` -}) -export class ConfigurationPropertyComponentStub { - - @Input() property: Property; - @Input() columns = 1; - - constructor() { } - - getKeys(schema): string[] { - return Object.keys(schema.properties); - } - - getItemType(property: Property): string { - return 'default'; - } - - get width(): string { - return `100%`; - } -} - -@Component({ - selector: 'array-property', - template: '' -}) -export class ArrayPropertyComponentStub extends ConfigurationPropertyComponentStub { - - @Output() preview: EventEmitter = new EventEmitter(); - - range = []; - - constructor() { - super(); - } - - isUrl(str: string): boolean { - return true; - } - - get attributeList$(): Observable<{ key: string, label: string }[]> { - return of([]); - } -} - -@Component({ - selector: 'primitive-property', - template: '', - styleUrls: [] -}) -export class PrimitivePropertyComponentStub extends ConfigurationPropertyComponentStub {} diff --git a/ui/src/testing/provider.stub.ts b/ui/src/testing/provider.stub.ts deleted file mode 100644 index 59fa89ea6..000000000 --- a/ui/src/testing/provider.stub.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { - MetadataProvider, - Contact, - SsoService, - Certificate, - SecurityInfo, - LogoutEndpoint -} from '../app/metadata/domain/model'; - -const d: unknown = { - serviceProviderName: 'bar' -}; - -export const draft = d as MetadataProvider; - -export const provider = { - ...draft, - id: '1' -} as MetadataProvider; - -export const contact = { - type: 'support', - name: 'hithere yo', - emailAddress: 'somewhere@something.com' -} as Contact; - -export const endpoint = { - binding: 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST', - locationUrl: 'http://unicon.net/location', - makeDefault: false -} as SsoService; - -export const certificate = { - name: 'foo', - type: 'signing', - value: 'xyz' -} as Certificate; - -export const secInfo = { - x509CertificateAvailable: false, - authenticationRequestsSigned: true, - wantAssertionsSigned: true, - x509Certificates: [] -} as SecurityInfo; - -export const logoutEndpoint = { - url: 'foo', - bindingType: 'bar' -} as LogoutEndpoint; diff --git a/ui/src/testing/resolver.stub.ts b/ui/src/testing/resolver.stub.ts deleted file mode 100644 index 7520e2606..000000000 --- a/ui/src/testing/resolver.stub.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { - MetadataProvider, - Contact, - SsoService, - Certificate, - SecurityInfo, - LogoutEndpoint, - MetadataResolver -} from '../app/metadata/domain/model'; - -export const draft = { - entityId: 'foo', - serviceProviderName: 'bar' -} as MetadataResolver; - -export const resolver = { - ...draft, - id: '1' -} as MetadataResolver; - -export const contact = { - type: 'support', - name: 'hithere yo', - emailAddress: 'somewhere@something.com' -} as Contact; - -export const endpoint = { - binding: 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST', - locationUrl: 'http://unicon.net/location', - makeDefault: false -} as SsoService; - -export const certificate = { - name: 'foo', - type: 'signing', - value: 'xyz' -} as Certificate; - -export const secInfo = { - x509CertificateAvailable: false, - authenticationRequestsSigned: true, - wantAssertionsSigned: true, - x509Certificates: [] -} as SecurityInfo; - -export const logoutEndpoint = { - url: 'foo', - bindingType: 'bar' -} as LogoutEndpoint; diff --git a/ui/src/testing/resolvers-list.component.stub.ts b/ui/src/testing/resolvers-list.component.stub.ts deleted file mode 100644 index 9912b0c2b..000000000 --- a/ui/src/testing/resolvers-list.component.stub.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Component, ChangeDetectionStrategy, Input, Output, EventEmitter } from '@angular/core'; - -import { MetadataEntity } from '../app/metadata/domain/model'; - -@Component({ - selector: 'resolvers-list', - changeDetection: ChangeDetectionStrategy.OnPush, - template: `
`, - styleUrls: [] -}) -export class MockResolversListComponent { - @Input() entities: MetadataEntity[]; - - @Output() scroll: EventEmitter = new EventEmitter(); - @Output() delete: EventEmitter = new EventEmitter(); - - @Output() toggleEnabled: EventEmitter = new EventEmitter(); -} diff --git a/ui/src/testing/router.stub.ts b/ui/src/testing/router.stub.ts deleted file mode 100644 index 74fcdf718..000000000 --- a/ui/src/testing/router.stub.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Component, Directive, Input, Injectable } from '@angular/core'; -import { NavigationExtras } from '@angular/router'; - -/*tslint:disable*/ -@Directive({ - selector: '[routerLink]', - host: { - '(click)': 'onClick()' - } -}) -export class RouterLinkStubDirective { - @Input('routerLink') linkParams: any; - navigatedTo: any = null; - onClick() { - this.navigatedTo = this.linkParams; - } -} -@Component({ - selector: 'router-outlet', - template: '' -}) -export class RouterOutletStubComponent {} - -@Injectable() -export class RouterStub { - navigate(commands: any[], extras?: NavigationExtras) { } -} diff --git a/ui/src/testing/sample-fbhttp-provider.json b/ui/src/testing/sample-fbhttp-provider.json deleted file mode 100644 index c5d344120..000000000 --- a/ui/src/testing/sample-fbhttp-provider.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "createdDate": "2019-09-12T10:40:41.941", - "modifiedDate": "2019-09-12T10:41:31.787", - "createdBy": "root", - "modifiedBy": "root", - "current": true, - "name": "Update Provider Name", - "resourceId": "e34f39a7-9934-43bf-80c1-3a4e76e6dee8", - "xmlId": "updateid", - "enabled": true, - "requireValidMetadata": true, - "failFastInitialization": true, - "useDefaultPredicateRegistry": true, - "satisfyAnyPredicates": false, - "doInitialization": true, - "metadataFilters": [ - { - "createdDate": "2019-09-12T10:40:41.945", - "modifiedDate": "2019-09-12T10:40:41.945", - "createdBy": "root", - "modifiedBy": "root", - "current": false, - "resourceId": "315bca8c-cc61-4425-af1a-72e0b913102f", - "filterEnabled": false, - "requireSignedRoot": false, - "audId": 10, - "@type": "SignatureValidation", - "version": -230919157 - }, - { - "createdDate": "2019-09-12T10:40:41.946", - "modifiedDate": "2019-09-12T10:40:41.946", - "createdBy": "root", - "modifiedBy": "root", - "current": false, - "resourceId": "0d46d4a9-b65e-440e-99c4-07203fe50921", - "filterEnabled": false, - "removeRolelessEntityDescriptors": true, - "removeEmptyEntitiesDescriptors": true, - "retainedRoles": [], - "audId": 11, - "@type": "EntityRoleWhiteList", - "version": 198629661 - }, - { - "createdDate": "2019-09-12T10:42:38.904", - "modifiedDate": "2019-09-12T10:42:38.904", - "createdBy": "root", - "modifiedBy": "root", - "current": false, - "resourceId": "860bf7f3-3b3c-4dc7-b19b-111c9043d446", - "filterEnabled": false, - "requireSignedRoot": false, - "audId": 15, - "@type": "SignatureValidation", - "version": -747367480 - }, - { - "createdDate": "2019-09-12T10:42:38.905", - "modifiedDate": "2019-09-12T10:42:38.905", - "createdBy": "root", - "modifiedBy": "root", - "current": false, - "resourceId": "7f24ff1d-cb52-422f-8594-682dec40b3b7", - "filterEnabled": false, - "removeRolelessEntityDescriptors": true, - "removeEmptyEntitiesDescriptors": true, - "retainedRoles": [ - "md:SPSSODescriptor" - ], - "audId": 16, - "@type": "EntityRoleWhiteList", - "version": -280104078 - } - ], - "metadataURL": "https://idp.unicon.net/idp/shibboleth", - "backingFile": "test", - "initializeFromBackupFile": false, - "backupFileInitNextRefreshDelay": "PT1H", - "reloadableMetadataResolverAttributes": { - "minRefreshDelay": "PT30S", - "maxRefreshDelay": "PT10M", - "refreshDelayFactor": 0.5 - }, - "httpMetadataResolverAttributes": { - "connectionRequestTimeout": "PT10M", - "connectionTimeout": "PT30M", - "socketTimeout": "PT12H", - "disregardTLSCertificate": false - }, - "audId": 9, - "@type": "FileBackedHttpMetadataResolver", - "version": -1622542052 -} \ No newline at end of file diff --git a/ui/src/testing/shared.stub.ts b/ui/src/testing/shared.stub.ts deleted file mode 100644 index 64d2ebd65..000000000 --- a/ui/src/testing/shared.stub.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { Component, Input, NgModule, Output, EventEmitter, forwardRef } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms'; - -@Component({ - selector: 'info-icon', - template: '{{ description }}' -}) -export class MockIconComponent { - @Input() description: string; -} - -@Component({ - selector: 'auto-complete', - template: '
', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => MockAutoCompleteComponent), - multi: true - } - ] -}) -export class MockAutoCompleteComponent implements ControlValueAccessor { - @Input() defaultValue = ''; - @Input() matches: string[] = []; - @Input() id: string; - @Input() fieldId: string; - @Input() autoSelect = false; - @Input() noneFoundText = 'No Options Found'; - @Input() limit = 0; - @Input() processing = false; - @Input() dropdown = false; - @Input() placeholder = ''; - - @Output() more: EventEmitter = new EventEmitter(); - @Output() onChange: EventEmitter = new EventEmitter(); - - propagateChange = (_: any | null) => { }; - propagateTouched = (_: any | null) => { }; - - constructor() { } - - writeValue(value: any): void {} - - registerOnChange(fn: any): void {} - - registerOnTouched(fn: any): void {} - - setDisabledState(isDisabled: boolean = false): void {} -} - -@NgModule({ - imports: [ - CommonModule - ], - declarations: [ - MockIconComponent, - MockAutoCompleteComponent - ], - exports: [ - MockIconComponent, - MockAutoCompleteComponent - ], - providers: [] -}) -export class MockSharedModule {} diff --git a/ui/src/testing/form-schema.stub.ts b/ui/src/testing/simpleSchema.js similarity index 99% rename from ui/src/testing/form-schema.stub.ts rename to ui/src/testing/simpleSchema.js index 01654b15a..43457ca7c 100644 --- a/ui/src/testing/form-schema.stub.ts +++ b/ui/src/testing/simpleSchema.js @@ -127,3 +127,5 @@ export const SCHEMA = { } } }; + +export default SCHEMA; \ No newline at end of file diff --git a/ui/src/testing/sourceSchema.js b/ui/src/testing/sourceSchema.js new file mode 100644 index 000000000..93262c5f4 --- /dev/null +++ b/ui/src/testing/sourceSchema.js @@ -0,0 +1,3 @@ +const SCHEMA = { "type": "object", "required": ["serviceProviderName", "entityId"], "properties": { "serviceProviderName": { "title": "label.service-provider-name", "description": "tooltip.service-provider-name", "type": "string", "minLength": 1, "maxLength": 255 }, "entityId": { "title": "label.entity-id", "description": "tooltip.entity-id", "type": "string", "minLength": 1, "maxLength": 255 }, "serviceEnabled": { "title": "label.enable-this-service", "description": "tooltip.enable-this-service-upon-saving", "type": "boolean", "default": false }, "organization": { "$ref": "#/definitions/Organization" }, "contacts": { "title": "label.contact-information", "description": "tooltip.contact-information", "type": "array", "items": { "$ref": "#/definitions/Contact" } }, "mdui": { "$ref": "#/definitions/MDUI" }, "securityInfo": { "type": "object", "widget": { "id": "fieldset" }, "dependencies": { "authenticationRequestsSigned": { "oneOf": [{ "properties": { "authenticationRequestsSigned": { "enum": [true] }, "x509Certificates": { "minItems": 1 } } }, { "properties": { "authenticationRequestsSigned": { "enum": [false] }, "x509Certificates": { "minItems": 0 } } }] } }, "properties": { "x509CertificateAvailable": { "type": "boolean", "default": true }, "authenticationRequestsSigned": { "title": "label.authentication-requests-signed", "description": "tooltip.authentication-requests-signed", "type": "boolean", "enumNames": ["value.true", "value.false"] }, "wantAssertionsSigned": { "title": "label.want-assertions-signed", "description": "tooltip.want-assertions-signed", "type": "boolean", "enumNames": ["value.true", "value.false"] }, "x509Certificates": { "title": "label.x509-certificates", "type": "array", "items": { "$ref": "#/definitions/Certificate" } } } }, "assertionConsumerServices": { "title": "label.assertion-consumer-service-endpoints", "description": "", "type": "array", "items": { "$ref": "#/definitions/AssertionConsumerService" } }, "serviceProviderSsoDescriptor": { "type": "object", "properties": { "protocolSupportEnum": { "title": "label.protocol-support-enumeration", "description": "tooltip.protocol-support-enumeration", "type": "string", "widget": { "id": "select" }, "oneOf": [{ "enum": ["SAML 2"], "description": "SAML 2" }, { "enum": ["SAML 1.1"], "description": "SAML 1.1" }] }, "nameIdFormats": { "$ref": "#/definitions/nameIdFormats" } }, "dependencies": { "nameIdFormats": ["protocolSupportEnum"] } }, "logoutEndpoints": { "title": "label.logout-endpoints", "description": "tooltip.logout-endpoints", "type": "array", "items": { "$ref": "#/definitions/LogoutEndpoint" } }, "relyingPartyOverrides": { "type": "object", "properties": { "signAssertion": { "title": "label.sign-the-assertion", "description": "tooltip.sign-assertion", "type": "boolean", "default": false }, "dontSignResponse": { "title": "label.dont-sign-the-response", "description": "tooltip.dont-sign-response", "type": "boolean", "default": false }, "turnOffEncryption": { "title": "label.turn-off-encryption-of-response", "description": "tooltip.turn-off-encryption", "type": "boolean", "default": false }, "useSha": { "title": "label.use-sha1-signing-algorithm", "description": "tooltip.usa-sha-algorithm", "type": "boolean", "default": false }, "ignoreAuthenticationMethod": { "title": "label.ignore-any-sp-requested-authentication-method", "description": "tooltip.ignore-auth-method", "type": "boolean", "default": false }, "omitNotBefore": { "title": "label.omit-not-before-condition", "description": "tooltip.omit-not-before-condition", "type": "boolean", "default": false }, "responderId": { "title": "label.responder-id", "description": "tooltip.responder-id", "type": "string", "default": "" }, "nameIdFormats": { "$ref": "#/definitions/nameIdFormats" }, "authenticationMethods": { "$ref": "#/definitions/authenticationMethods" }, "forceAuthn": { "title": "label.force-authn", "description": "tooltip.force-authn", "type": "boolean", "default": false } } }, "attributeRelease": { "type": "array", "title": "label.attribute-release", "description": "Attribute release table - select the attributes you want to release (default unchecked)", "items": { "type": "string", "enum": ["eduPersonPrincipalName", "uid", "mail", "surname", "givenName", "eduPersonAffiliation", "eduPersonScopedAffiliation", "eduPersonPrimaryAffiliation", "eduPersonEntitlement", "eduPersonAssurance", "eduPersonUniqueId", "employeeNumber"] }, "uniqueItems": true } }, "definitions": { "Contact": { "type": "object", "required": ["name", "type", "emailAddress"], "properties": { "name": { "title": "label.contact-name", "description": "tooltip.contact-name", "type": "string", "minLength": 1, "maxLength": 255 }, "type": { "title": "label.contact-type", "description": "tooltip.contact-type", "type": "string", "widget": "select", "minLength": 1, "oneOf": [{ "enum": ["support"], "description": "value.support" }, { "enum": ["technical"], "description": "value.technical" }, { "enum": ["administrative"], "description": "value.administrative" }, { "enum": ["other"], "description": "value.other" }] }, "emailAddress": { "title": "label.contact-email-address", "description": "tooltip.contact-email", "type": "string", "pattern": "^(mailto:)?(?=.{1,254}$)(?=.{1,64}@)[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+(\\.[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+)*@[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*$", "minLength": 1, "maxLength": 255 } } }, "Certificate": { "type": "object", "required": ["type", "value"], "properties": { "name": { "title": "label.certificate-name-display-only", "description": "tooltip.certificate-name", "type": "string", "maxLength": 255 }, "type": { "title": "label.certificate-type", "type": "string", "widget": { "id": "radio", "class": "form-check-inline" }, "oneOf": [{ "enum": ["signing"], "description": "value.signing" }, { "enum": ["encryption"], "description": "value.encryption" }, { "enum": ["both"], "description": "value.both" }] }, "value": { "title": "label.certificate", "description": "tooltip.certificate", "type": "string", "widget": "textarea", "minLength": 1 } } }, "AssertionConsumerService": { "type": "object", "required": ["locationUrl", "binding"], "properties": { "locationUrl": { "title": "label.assertion-consumer-service-location", "description": "tooltip.assertion-consumer-service-location", "type": "string", "widget": { "id": "string", "help": "message.valid-url" }, "minLength": 1, "maxLength": 255 }, "binding": { "title": "label.assertion-consumer-service-location-binding", "description": "tooltip.assertion-consumer-service-location-binding", "type": "string", "widget": "select", "oneOf": [{ "enum": ["urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"], "description": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" }, { "enum": ["urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST-SimpleSign"], "description": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST-SimpleSign" }, { "enum": ["urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact"], "description": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact" }, { "enum": ["urn:oasis:names:tc:SAML:2.0:bindings:PAOS"], "description": "urn:oasis:names:tc:SAML:2.0:bindings:PAOS" }, { "enum": ["urn:oasis:names:tc:SAML:1.0:profiles:browser-post"], "description": "urn:oasis:names:tc:SAML:1.0:profiles:browser-post" }, { "enum": ["urn:oasis:names:tc:SAML:1.0:profiles:artifact-01"], "description": "urn:oasis:names:tc:SAML:1.0:profiles:artifact-01" }] }, "makeDefault": { "title": "label.mark-as-default", "description": "tooltip.mark-as-default", "type": "boolean" } } }, "LogoutEndpoint": { "description": "tooltip.new-endpoint", "type": "object", "fieldsets": [{ "fields": ["url", "bindingType"] }], "required": ["url", "bindingType"], "properties": { "url": { "title": "label.url", "description": "tooltip.url", "type": "string", "minLength": 1, "maxLength": 255 }, "bindingType": { "title": "label.binding-type", "description": "tooltip.binding-type", "type": "string", "widget": "select", "oneOf": [{ "enum": ["urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"], "description": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" }, { "enum": ["urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"], "description": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" }, { "enum": ["urn:oasis:names:tc:SAML:2.0:bindings:SOAP"], "description": "urn:oasis:names:tc:SAML:2.0:bindings:SOAP" }, { "enum": ["urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact"], "description": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact" }] } } }, "MDUI": { "type": "object", "widget": { "id": "fieldset" }, "fieldsets": [{ "type": "group", "fields": ["displayName", "informationUrl", "description"] }, { "type": "group", "fields": ["privacyStatementUrl", "logoUrl", "logoWidth", "logoHeight"] }], "properties": { "displayName": { "title": "label.display-name", "description": "tooltip.mdui-display-name", "type": "string", "minLength": 1, "maxLength": 255 }, "informationUrl": { "title": "label.information-url", "description": "tooltip.mdui-information-url", "type": "string", "minLength": 1, "maxLength": 255 }, "privacyStatementUrl": { "title": "label.privacy-statement-url", "description": "tooltip.mdui-privacy-statement-url", "type": "string", "minLength": 1, "maxLength": 255 }, "description": { "title": "label.description", "description": "tooltip.mdui-description", "type": "string", "widget": { "id": "textarea" }, "minLength": 1, "maxLength": 255 }, "logoUrl": { "title": "label.logo-url", "description": "tooltip.mdui-logo-url", "type": "string", "minLength": 1, "maxLength": 255 }, "logoHeight": { "title": "label.logo-height", "description": "tooltip.mdui-logo-height", "minimum": 0, "type": "integer" }, "logoWidth": { "title": "label.logo-width", "description": "tooltip.mdui-logo-width", "minimum": 0, "type": "integer" } } }, "Organization": { "type": "object", "properties": { "name": { "title": "label.organization-name", "description": "tooltip.organization-name", "type": "string", "minLength": 1, "maxLength": 255 }, "displayName": { "title": "label.organization-display-name", "description": "tooltip.organization-display-name", "type": "string", "minLength": 1, "maxLength": 255 }, "url": { "title": "label.organization-url", "description": "tooltip.organization-url", "type": "string", "minLength": 1, "maxLength": 255 } }, "dependencies": { "name": { "required": ["displayName", "url"] }, "displayName": { "required": ["name", "url"] }, "url": { "required": ["name", "displayName"] } } }, "nameIdFormats": { "title": "label.nameid-format-to-send", "description": "tooltip.nameid-format", "type": "array", "uniqueItems": true, "items": { "type": "string", "minLength": 1, "maxLength": 255, "examples": ["urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified", "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress", "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent", "urn:oasis:names:tc:SAML:2.0:nameid-format:transient"] } }, "authenticationMethods": { "title": "label.authentication-methods-to-use", "description": "tooltip.authentication-methods-to-use", "type": "array", "uniqueItems": true, "items": { "type": "string", "minLength": 1, "maxLength": 255, "examples": ["https://refeds.org/profile/mfa", "urn:oasis:names:tc:SAML:2.0:ac:classes:TimeSyncToken", "urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport"] } } } }; + +export default SCHEMA; \ No newline at end of file diff --git a/ui/src/testing/uiSchema.js b/ui/src/testing/uiSchema.js new file mode 100644 index 000000000..eb557bcf2 --- /dev/null +++ b/ui/src/testing/uiSchema.js @@ -0,0 +1,216 @@ +const schema = { + "ui:order": { + "0": "serviceProviderName", + "1": "*", + "ui:widget": "hidden" + }, + "layout": { + "groups": [ + { + "size": 6, + "fields": [ + "serviceProviderName", + "entityId", + "serviceEnabled", + "organization" + ] + }, + { + "size": 6, + "fields": [ + "contacts" + ] + }, + { + "size": 12, + "fields": [ + "mdui" + ] + }, + { + "size": 6, + "fields": [ + "serviceProviderSsoDescriptor" + ] + }, + { + "size": 6, + "fields": [ + "logoutEndpoints" + ] + }, + { + "size": 12, + "fields": [ + "securityInfo" + ] + }, + { + "size": 6, + "fields": [ + "assertionConsumerServices" + ] + }, + { + "size": 6, + "fields": [ + "relyingPartyOverrides" + ] + }, + { + "size": 6, + "fields": [ + "attributeRelease" + ] + } + ], + "ui:widget": "hidden" + }, + "contacts": { + "ui:options": { + "orderable": false + }, + "type": "contact", + "ui:title": false + }, + "attributeRelease": { + "ui:widget": "hidden" + }, + "logoutEndpoints": { + "type": "endpoint", + "ui:options": { + "orderable": false + }, + "ui:title": false, + "ui:widget": "hidden" + }, + "assertionConsumerServices": { + "type": "service", + "ui:options": { + "orderable": false + }, + "ui:title": false, + "ui:widget": "hidden" + }, + "relyingPartyOverrides": { + "nameIdFormats": { + "ui:options": { + "orderable": false + }, + "items": { + "ui:widget": "OptionWidget" + } + }, + "authenticationMethods": { + "ui:options": { + "orderable": false + }, + "items": { + "ui:widget": "OptionWidget" + } + }, + "ui:widget": "hidden" + }, + "serviceProviderSsoDescriptor": { + "protocolSupportEnum": { + "ui:placeholder": "label.select-protocol" + }, + "nameIdFormats": { + "ui:options": { + "orderable": false + }, + "items": { + "ui:widget": "OptionWidget" + } + }, + "ui:widget": "hidden" + }, + "securityInfo": { + "layout": { + "groups": [ + { + "size": 6, + "fields": [ + "authenticationRequestsSigned", + "wantAssertionsSigned", + "x509Certificates" + ] + } + ] + }, + "x509CertificateAvailable": { + "ui:widget": "hidden" + }, + "authenticationRequestsSigned": { + "ui:widget": "radio", + "ui:options": { + "inline": true + } + }, + "wantAssertionsSigned": { + "ui:widget": "radio", + "ui:options": { + "inline": true + } + }, + "x509Certificates": { + "type": "certificate", + "ui:options": { + "orderable": false + }, + "items": { + "type": { + "ui:widget": "radio", + "ui:description": false, + "ui:options": { + "inline": true + } + }, + "value": { + "ui:widget": "textarea" + } + } + }, + "ui:widget": "hidden" + }, + "mdui": { + "layout": { + "groups": [ + { + "size": 6, + "fields": [ + "displayName", + "informationUrl", + "description" + ] + }, + { + "size": 6, + "fields": [ + "privacyStatementUrl", + "logoUrl", + "logoWidth", + "logoHeight" + ] + } + ] + }, + "description": { + "ui:widget": "textarea" + }, + "logoHeight": { + "ui:widget": "updown" + }, + "logoWidth": { + "ui:widget": "updown" + }, + "ui:widget": "hidden" + }, + "serviceProviderName": {}, + "entityId": {}, + "serviceEnabled": {}, + "organization": {}, + "ui:disabled": false +}; + +export default schema; \ No newline at end of file diff --git a/ui/src/testing/utility.ts b/ui/src/testing/utility.ts deleted file mode 100644 index 4ac00e572..000000000 --- a/ui/src/testing/utility.ts +++ /dev/null @@ -1,15 +0,0 @@ -export function dispatchKeyboardEvent(elm: HTMLElement, eventName: string, keyName: string) { - let event; - try { - // PhantomJS - event = document.createEvent('KeyboardEvent'); - event.initEvent(eventName, true, false); - event.key = keyName; - } catch (e) { - // Chrome - event = new KeyboardEvent(eventName, { 'key': keyName }); - } - elm.dispatchEvent(event); -} - -export default dispatchKeyboardEvent; diff --git a/ui/src/testing/wizard.stub.ts b/ui/src/testing/wizard.stub.ts deleted file mode 100644 index f8c5637c9..000000000 --- a/ui/src/testing/wizard.stub.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { Component, Output, Input, NgModule } from '@angular/core'; -import { EventEmitter } from '@angular/core'; -import { Wizard } from '../app/wizard/model'; -import { MetadataProvider, MetadataResolver } from '../app/metadata/domain/model'; - -/*tslint:disable:component-selector */ -@Component({ - selector: 'wizard', - template: '' -}) -export class MockWizardComponent { - @Output() onNext = new EventEmitter(); - @Output() onPrevious = new EventEmitter(); - @Output() onLast = new EventEmitter(); - @Output() onSave = new EventEmitter(); -} - -/*tslint:disable:component-selector */ -@Component({ - selector: 'wizard-summary', - template: '' -}) -export class MockWizardSummaryComponent { - @Input() summary: { definition: Wizard, schema: { [id: string]: any }, model: any }; - @Output() onPageSelect: EventEmitter = new EventEmitter(); -} - -@NgModule({ - imports: [ - CommonModule - ], - declarations: [ - MockWizardComponent, - MockWizardSummaryComponent - ], - exports: [ - MockWizardComponent, - MockWizardSummaryComponent - ], - providers: [] -}) -export class MockWizardModule { } diff --git a/ui/src/theme/_variables.scss b/ui/src/theme/_variables.scss deleted file mode 100644 index 8df205529..000000000 --- a/ui/src/theme/_variables.scss +++ /dev/null @@ -1,2 +0,0 @@ -$font-size-xs: .75rem !default; -$fa-font-path: "~font-awesome/fonts"; \ No newline at end of file diff --git a/ui/src/theme/assets/exclamation-circle.svg b/ui/src/theme/assets/exclamation-circle.svg new file mode 100644 index 000000000..8d35be07c --- /dev/null +++ b/ui/src/theme/assets/exclamation-circle.svg @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/ui/src/theme/bootstrap.scss b/ui/src/theme/bootstrap.scss index 7683e1dad..01b936b52 100644 --- a/ui/src/theme/bootstrap.scss +++ b/ui/src/theme/bootstrap.scss @@ -1,13 +1,10 @@ -@import "~bootstrap/scss/functions"; -@import "./palette"; -@import "./variables"; +$enable-responsive-font-sizes: true; + @import "~bootstrap/scss/functions"; @import "~bootstrap/scss/variables"; @import "~bootstrap/scss/mixins"; - @import "~bootstrap/scss/root"; @import "~bootstrap/scss/reboot"; - @import "~bootstrap/scss/type"; @import "~bootstrap/scss/images"; @import "~bootstrap/scss/code"; @@ -17,7 +14,7 @@ @import "~bootstrap/scss/buttons"; @import "~bootstrap/scss/transitions"; @import "~bootstrap/scss/dropdown"; -// @import "~bootstrap/scss/button-group"; +@import "~bootstrap/scss/button-group"; @import "~bootstrap/scss/input-group"; @import "~bootstrap/scss/custom-forms"; @import "~bootstrap/scss/nav"; @@ -26,18 +23,17 @@ @import "~bootstrap/scss/breadcrumb"; @import "~bootstrap/scss/pagination"; @import "~bootstrap/scss/badge"; -// @import "~bootstrap/scss/jumbotron"; +@import "~bootstrap/scss/jumbotron"; @import "~bootstrap/scss/alert"; -// @import "~bootstrap/scss/progress"; -// @import "~bootstrap/scss/media"; +@import "~bootstrap/scss/progress"; +@import "~bootstrap/scss/media"; @import "~bootstrap/scss/list-group"; @import "~bootstrap/scss/close"; +@import "~bootstrap/scss/toasts"; @import "~bootstrap/scss/modal"; -// @import "~bootstrap/scss/tooltip"; +@import "~bootstrap/scss/tooltip"; @import "~bootstrap/scss/popover"; -// @import "~bootstrap/scss/carousel"; +@import "~bootstrap/scss/carousel"; +@import "~bootstrap/scss/spinners"; @import "~bootstrap/scss/utilities"; - @import "~bootstrap/scss/print"; - -@import '~font-awesome/scss/font-awesome'; \ No newline at end of file diff --git a/ui/src/theme/_mixins.scss b/ui/src/theme/mixins.scss similarity index 100% rename from ui/src/theme/_mixins.scss rename to ui/src/theme/mixins.scss diff --git a/ui/src/theme/override.scss b/ui/src/theme/override.scss new file mode 100644 index 000000000..44f11ab61 --- /dev/null +++ b/ui/src/theme/override.scss @@ -0,0 +1 @@ +@import "./variables.scss"; diff --git a/ui/src/theme/alert.scss b/ui/src/theme/project/alert.scss similarity index 100% rename from ui/src/theme/alert.scss rename to ui/src/theme/project/alert.scss diff --git a/ui/src/theme/project/bootstrap.scss b/ui/src/theme/project/bootstrap.scss new file mode 100644 index 000000000..dc671f044 --- /dev/null +++ b/ui/src/theme/project/bootstrap.scss @@ -0,0 +1,42 @@ +@import "~bootstrap/scss/functions"; +@import "./variables"; +@import "~bootstrap/scss/functions"; +@import "~bootstrap/scss/variables"; +@import "~bootstrap/scss/mixins"; + +@import "~bootstrap/scss/root"; +@import "~bootstrap/scss/reboot"; + +@import "~bootstrap/scss/type"; +@import "~bootstrap/scss/images"; +@import "~bootstrap/scss/code"; +@import "~bootstrap/scss/grid"; +@import "~bootstrap/scss/tables"; +@import "~bootstrap/scss/forms"; +@import "~bootstrap/scss/buttons"; +@import "~bootstrap/scss/transitions"; +@import "~bootstrap/scss/dropdown"; +// @import "~bootstrap/scss/button-group"; +@import "~bootstrap/scss/input-group"; +@import "~bootstrap/scss/custom-forms"; +@import "~bootstrap/scss/nav"; +@import "~bootstrap/scss/navbar"; +@import "~bootstrap/scss/card"; +@import "~bootstrap/scss/breadcrumb"; +@import "~bootstrap/scss/pagination"; +@import "~bootstrap/scss/badge"; +// @import "~bootstrap/scss/jumbotron"; +@import "~bootstrap/scss/alert"; +// @import "~bootstrap/scss/progress"; +// @import "~bootstrap/scss/media"; +@import "~bootstrap/scss/list-group"; +@import "~bootstrap/scss/close"; +@import "~bootstrap/scss/modal"; +// @import "~bootstrap/scss/tooltip"; +@import "~bootstrap/scss/popover"; +// @import "~bootstrap/scss/carousel"; +@import "~bootstrap/scss/utilities"; + +@import "~bootstrap/scss/print"; + +@import '~font-awesome/scss/font-awesome'; \ No newline at end of file diff --git a/ui/src/theme/breadcrumb.scss b/ui/src/theme/project/breadcrumb.scss similarity index 100% rename from ui/src/theme/breadcrumb.scss rename to ui/src/theme/project/breadcrumb.scss diff --git a/ui/src/theme/buttons.scss b/ui/src/theme/project/buttons.scss similarity index 97% rename from ui/src/theme/buttons.scss rename to ui/src/theme/project/buttons.scss index 0897adbbe..c1e8c5d79 100644 --- a/ui/src/theme/buttons.scss +++ b/ui/src/theme/project/buttons.scss @@ -1,5 +1,4 @@ -@import './_palette'; -@import './_variables'; +@import '../variables'; @import '~bootstrap/scss/_mixins'; .btn.btn-text { @@ -15,6 +14,11 @@ } } +.resolver-nav-option { + min-width: 160px; + height: 100%; +} + .nav.nav-wizard { .nav-item { margin-right: $custom-control-spacer-x * 3; diff --git a/ui/src/theme/project/filters.scss b/ui/src/theme/project/filters.scss new file mode 100644 index 000000000..e38d11791 --- /dev/null +++ b/ui/src/theme/project/filters.scss @@ -0,0 +1,15 @@ +.filter-list.table { + .td-sm { + max-width: 100px; + } + .td-xs { + max-width: 20px; + } + .td-lg { + width: 30%; + } + + td { + vertical-align: middle; + } +} \ No newline at end of file diff --git a/ui/src/theme/forms.scss b/ui/src/theme/project/forms.scss similarity index 76% rename from ui/src/theme/forms.scss rename to ui/src/theme/project/forms.scss index c41c9172a..b200b8191 100644 --- a/ui/src/theme/forms.scss +++ b/ui/src/theme/project/forms.scss @@ -1,6 +1,5 @@ -@import './_palette'; -@import './_variables'; -@import './_mixins'; +@import '../variables'; +@import '../mixins'; /* @@ -88,6 +87,37 @@ select.form-control:disabled { } } +.toggle-typeahead { + padding-right: 34px; + input { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } +} + +.toggle-button { + bottom: 0; + position: absolute; + right: 0; + top: 0; + border-bottom-left-radius: 0; + border-top-left-radius: 0; + background: white; + border: 1px solid #ced4da; +} + +mark { + background: transparent; + font-weight: bold; + padding: 0; +} + +.dropdown-item.active { + &, & > mark { + color: white; + } +} + @media only screen and (max-width: 1200px) { .form-section:not(:first-child) { border-left: 0px; diff --git a/ui/src/theme/project/index.scss b/ui/src/theme/project/index.scss new file mode 100644 index 000000000..48b875785 --- /dev/null +++ b/ui/src/theme/project/index.scss @@ -0,0 +1,104 @@ +@import './breadcrumb'; +@import './buttons'; +@import './forms'; +@import './modal'; +@import './tags'; +@import './alert'; +@import './typography'; +@import './list'; +@import './tabs'; +@import './table'; +@import './utility'; +@import './notifications'; +@import './filters'; + +html, body { + height: 100%; +} + +body { + background-color: theme-color("light"); + padding-top: 56px; +} + +.app-root { + min-height: calc(100vh - 56px); +} + +.pad-content { + height: 100%; +} + +.section { + .section-body { + background: $white; + } +} + +nav.fixed-top { + border-bottom: 3px solid map-get($theme-colors, primary); +} + +.navbar-light .navbar-nav .nav-link { + color: #00355f; +} + +footer { + background-color: $white; + padding: 0 20px; + font-size: $font-size-xs; + border-top: 3px solid map-get($theme-colors, primary); + + .copyright { + padding-top: 10px; + + a { + color: map-get($theme-colors, primary); + text-decoration: underline; + } + } + + img { + max-height: 88px; + } +} + +label { + display: flex; + justify-content: space-between; +} + +nav.navbar { + background-color: $white; + + .dropdown-menu { + min-width: 12rem; + } +} + +.logo a { + img { + display: inline-block; + max-height: 60px; + } +} + +.col-6:empty { + display: none; +} + +.d-empty-none:empty { + display: none; +} + +@media only screen and (min-width: 1024px) { + .pad-content { + padding: 0 3rem; + } +} + +@media only screen and (min-width: 1200px) { + .pad-content { + padding: 0 5rem; + } +} \ No newline at end of file diff --git a/ui/src/theme/list.scss b/ui/src/theme/project/list.scss similarity index 85% rename from ui/src/theme/list.scss rename to ui/src/theme/project/list.scss index 5acc06806..be94eddd0 100644 --- a/ui/src/theme/list.scss +++ b/ui/src/theme/project/list.scss @@ -22,3 +22,7 @@ padding: 0px; } } + +.infinite-scroll-component { + overflow: unset !important; +} \ No newline at end of file diff --git a/ui/src/theme/modal.scss b/ui/src/theme/project/modal.scss similarity index 100% rename from ui/src/theme/modal.scss rename to ui/src/theme/project/modal.scss diff --git a/ui/src/theme/project/notifications.scss b/ui/src/theme/project/notifications.scss new file mode 100644 index 000000000..0914a0b33 --- /dev/null +++ b/ui/src/theme/project/notifications.scss @@ -0,0 +1,5 @@ +.notification-list { + bottom: 50px; + right: 0px; + z-index: 2000; +} \ No newline at end of file diff --git a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.scss b/ui/src/theme/project/table.scss similarity index 73% rename from ui/src/app/metadata/manager/container/dashboard-providers-list.component.scss rename to ui/src/theme/project/table.scss index 133f4a03c..53f8a3abb 100644 --- a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.scss +++ b/ui/src/theme/project/table.scss @@ -1,4 +1,8 @@ -@import '../../../../theme/palette'; +.source-list tr td:last-child { + width: 1%; + white-space: nowrap; +} + .provider-index { font-size: 1.8rem; line-height: 1.8rem; diff --git a/ui/src/theme/project/tabs.scss b/ui/src/theme/project/tabs.scss new file mode 100644 index 000000000..e89b78be6 --- /dev/null +++ b/ui/src/theme/project/tabs.scss @@ -0,0 +1,9 @@ + + +.nav-tabs, .nav-tabs .nav-link.active { + border-color: $brand-primary; +} + +.nav-tabs .nav-link:hover { + border-bottom-color: $brand-primary; +} \ No newline at end of file diff --git a/ui/src/theme/tags.scss b/ui/src/theme/project/tags.scss similarity index 97% rename from ui/src/theme/tags.scss rename to ui/src/theme/project/tags.scss index 817fb34f1..5b147b52d 100644 --- a/ui/src/theme/tags.scss +++ b/ui/src/theme/project/tags.scss @@ -1,5 +1,4 @@ -@import './_palette'; -@import './_variables'; +@import '../variables'; @import '~bootstrap/scss/_mixins'; @import '~bootstrap/scss/_utilities'; diff --git a/ui/src/theme/typography.scss b/ui/src/theme/project/typography.scss similarity index 79% rename from ui/src/theme/typography.scss rename to ui/src/theme/project/typography.scss index 76c9bc107..770baabb4 100644 --- a/ui/src/theme/typography.scss +++ b/ui/src/theme/project/typography.scss @@ -7,3 +7,7 @@ .br-word { word-break: break-word; } + +.lead { + line-height: 36px; +} \ No newline at end of file diff --git a/ui/src/theme/utility.scss b/ui/src/theme/project/utility.scss similarity index 75% rename from ui/src/theme/utility.scss rename to ui/src/theme/project/utility.scss index f3ff5e38b..1a79b3eec 100644 --- a/ui/src/theme/utility.scss +++ b/ui/src/theme/project/utility.scss @@ -28,14 +28,16 @@ position: relative; border-color: #CCC !important; &::before { - $size: 24px; - content: "\f06a"; + $size: 16px; + content: ""; + opacity: 0.75; + background: url('../assets/exclamation-circle.svg'); font-family: 'FontAwesome'; text-align: center; width: $size; height: $size; position: absolute; - left: -$size; - top: 0.5rem; + left: -$size - 4; + top: 0.75rem; } } \ No newline at end of file diff --git a/ui/src/theme/_palette.scss b/ui/src/theme/variables.scss similarity index 95% rename from ui/src/theme/_palette.scss rename to ui/src/theme/variables.scss index 0b91b3fee..662734626 100644 --- a/ui/src/theme/_palette.scss +++ b/ui/src/theme/variables.scss @@ -82,3 +82,6 @@ $theme-colors: ( // Set a specific jump point for requesting color jumps $theme-color-interval: 8%; + +$font-size-xs: .75rem !default; +$fa-font-path: "~font-awesome/fonts"; \ No newline at end of file diff --git a/ui/src/tsconfig.app.json b/ui/src/tsconfig.app.json deleted file mode 100644 index 901ac783c..000000000 --- a/ui/src/tsconfig.app.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "extends": "../tsconfig.json", - "compilerOptions": { - "outDir": "../out-tsc/app", - "baseUrl": "./", - "types": [] - }, - "files": [ - "main.ts", - "polyfills.ts" - ], - "include": [ - "**/*.d.ts" - ] -} \ No newline at end of file diff --git a/ui/src/tsconfig.spec.json b/ui/src/tsconfig.spec.json deleted file mode 100644 index fe8bdf70b..000000000 --- a/ui/src/tsconfig.spec.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "extends": "../tsconfig.json", - "compilerOptions": { - "outDir": "../out-tsc/spec", - "baseUrl": "./", - "types": [ - "jasmine", - "node" - ] - }, - "files": [ - "test.ts", - "polyfills.ts" - ], - "include": [ - "**/*.spec.ts", - "**/*.d.ts" - ] -} \ No newline at end of file diff --git a/ui/src/typings.d.ts b/ui/src/typings.d.ts deleted file mode 100644 index 5c408264a..000000000 --- a/ui/src/typings.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* SystemJS module definition */ -declare var module: NodeModule; -interface NodeModule { - id: string; -} - -declare module "*.json" { - const value: any; - export default value; -} \ No newline at end of file diff --git a/ui/tsconfig.json b/ui/tsconfig.json deleted file mode 100644 index 84c380f9f..000000000 --- a/ui/tsconfig.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "compileOnSave": false, - "compilerOptions": { - "module": "es2020", - "outDir": "./dist/out-tsc", - "sourceMap": true, - "declaration": false, - "moduleResolution": "node", - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "allowSyntheticDefaultImports": true, - "downlevelIteration": true, - "target": "es5", - "typeRoots": [ - "node_modules/@types" - ], - "lib": [ - "es2017", - "dom" - ] - } -} \ No newline at end of file diff --git a/ui/tslint.json b/ui/tslint.json deleted file mode 100644 index 09cb96eca..000000000 --- a/ui/tslint.json +++ /dev/null @@ -1,144 +0,0 @@ -{ - "rulesDirectory": [ - "node_modules/codelyzer" - ], - "rules": { - "arrow-return-shorthand": true, - "callable-types": true, - "class-name": true, - "comment-format": [ - true, - "check-space" - ], - "curly": true, - "eofline": true, - "forin": true, - "deprecation": { - "severity": "warning" - }, - "import-blacklist": [ - true - ], - "import-spacing": true, - "indent": [ - true, - "spaces", - 4 - ], - "interface-over-type-literal": true, - "label-position": true, - "max-line-length": [ - true, - 140 - ], - "member-access": false, - "member-ordering": [ - true, - { - "order": [ - "static-field", - "instance-field", - "static-method", - "instance-method" - ] - } - ], - "no-arg": true, - "no-bitwise": true, - "no-console": [ - true, - "debug", - "info", - "time", - "timeEnd", - "trace" - ], - "no-construct": true, - "no-debugger": true, - "no-duplicate-super": true, - "no-empty": false, - "no-empty-interface": true, - "no-eval": true, - "no-inferrable-types": [ - true, - "ignore-params" - ], - "no-misused-new": true, - "no-non-null-assertion": true, - "no-shadowed-variable": true, - "no-string-literal": false, - "no-string-throw": true, - "no-switch-case-fall-through": true, - "no-trailing-whitespace": true, - "no-unnecessary-initializer": true, - "no-unused-expression": true, - "no-var-keyword": true, - "object-literal-sort-keys": false, - "one-line": [ - true, - "check-open-brace", - "check-catch", - "check-else", - "check-whitespace" - ], - "prefer-const": false, - "quotemark": [ - true, - "single" - ], - "radix": true, - "semicolon": [ - true, - "always" - ], - "triple-equals": [ - true, - "allow-null-check" - ], - "typedef-whitespace": [ - true, - { - "call-signature": "nospace", - "index-signature": "nospace", - "parameter": "nospace", - "property-declaration": "nospace", - "variable-declaration": "nospace" - } - ], - "typeof-compare": true, - "unified-signatures": true, - "variable-name": false, - "whitespace": [ - true, - "check-branch", - "check-decl", - "check-operator", - "check-separator", - "check-type" - ], - "directive-selector": [ - true, - "attribute", - "", - "camelCase" - ], - "component-selector": [ - true, - "element", - "", - "kebab-case" - ], - "no-inputs-metadata-property": true, - "no-outputs-metadata-property": true, - "no-host-metadata-property": true, - "no-input-rename": true, - "no-output-rename": true, - "use-lifecycle-interface": true, - "use-pipe-transform-interface": true, - "component-class-suffix": true, - "directive-class-suffix": true, - "no-access-missing-member": true, - "templates-use-public": true, - "invoke-injectable": true - } -} \ No newline at end of file diff --git a/ui/yarn.lock b/ui/yarn.lock new file mode 100644 index 000000000..36cf32e13 --- /dev/null +++ b/ui/yarn.lock @@ -0,0 +1,12112 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" + integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/code-frame@7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.5.5": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" + integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g== + dependencies: + "@babel/highlight" "^7.12.13" + +"@babel/compat-data@^7.12.1", "@babel/compat-data@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.13.tgz#27e19e0ed3726ccf54067ced4109501765e7e2e8" + integrity sha512-U/hshG5R+SIoW7HVWIdmy1cB7s3ki+r3FpyEZiCgpi4tFgPnX/vynY80ZGSASOIrUM6O7VxOgCZgdt7h97bUGg== + +"@babel/core@7.12.3": + version "7.12.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.3.tgz#1b436884e1e3bff6fb1328dc02b208759de92ad8" + integrity sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.12.1" + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helpers" "^7.12.1" + "@babel/parser" "^7.12.3" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.12.1" + "@babel/types" "^7.12.1" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.5", "@babel/core@^7.8.4": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.17.tgz#993c5e893333107a2815d8e0d73a2c3755e280b2" + integrity sha512-V3CuX1aBywbJvV2yzJScRxeiiw0v2KZZYYE3giywxzFJL13RiyPjaaDwhDnxmgFTTS7FgvM2ijr4QmKNIu0AtQ== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.12.17" + "@babel/helper-module-transforms" "^7.12.17" + "@babel/helpers" "^7.12.17" + "@babel/parser" "^7.12.17" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.12.17" + "@babel/types" "^7.12.17" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.12.1", "@babel/generator@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.17.tgz#9ef1dd792d778b32284411df63f4f668a9957287" + integrity sha512-DSA7ruZrY4WI8VxuS1jWSRezFnghEoYEFrZcw9BizQRmOZiUsiHl59+qEARGPqPikwA/GPTyRCi7isuCK/oyqg== + dependencies: + "@babel/types" "^7.12.17" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.10.4", "@babel/helper-annotate-as-pure@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab" + integrity sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw== + dependencies: + "@babel/types" "^7.12.13" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz#6bc20361c88b0a74d05137a65cac8d3cbf6f61fc" + integrity sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.12.13" + "@babel/types" "^7.12.13" + +"@babel/helper-compilation-targets@^7.12.1", "@babel/helper-compilation-targets@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.17.tgz#91d83fae61ef390d39c3f0507cb83979bab837c7" + integrity sha512-5EkibqLVYOuZ89BSg2lv+GG8feywLuvMXNYgf0Im4MssE0mFWPztSpJbildNnUgw0bLI2EsIN4MpSHC2iUJkQA== + dependencies: + "@babel/compat-data" "^7.12.13" + "@babel/helper-validator-option" "^7.12.17" + browserslist "^4.14.5" + semver "^5.5.0" + +"@babel/helper-create-class-features-plugin@^7.12.1", "@babel/helper-create-class-features-plugin@^7.12.13", "@babel/helper-create-class-features-plugin@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.17.tgz#704b69c8a78d03fb1c5fcc2e7b593f8a65628944" + integrity sha512-I/nurmTxIxHV0M+rIpfQBF1oN342+yvl2kwZUrQuOClMamHF1w5tknfZubgNOLRoA73SzBFAdFcpb4M9HwOeWQ== + dependencies: + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-member-expression-to-functions" "^7.12.17" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/helper-replace-supers" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" + +"@babel/helper-create-regexp-features-plugin@^7.12.13": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz#a2ac87e9e319269ac655b8d4415e94d38d663cb7" + integrity sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.12.13" + regexpu-core "^4.7.1" + +"@babel/helper-explode-assignable-expression@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.13.tgz#0e46990da9e271502f77507efa4c9918d3d8634a" + integrity sha512-5loeRNvMo9mx1dA/d6yNi+YiKziJZFylZnCo1nmFF4qPU4yJ14abhWESuSMQSlQxWdxdOFzxXjk/PpfudTtYyw== + dependencies: + "@babel/types" "^7.12.13" + +"@babel/helper-function-name@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz#93ad656db3c3c2232559fd7b2c3dbdcbe0eb377a" + integrity sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA== + dependencies: + "@babel/helper-get-function-arity" "^7.12.13" + "@babel/template" "^7.12.13" + "@babel/types" "^7.12.13" + +"@babel/helper-get-function-arity@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" + integrity sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg== + dependencies: + "@babel/types" "^7.12.13" + +"@babel/helper-hoist-variables@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.12.13.tgz#13aba58b7480b502362316ea02f52cca0e9796cd" + integrity sha512-KSC5XSj5HreRhYQtZ3cnSnQwDzgnbdUDEFsxkN0m6Q3WrCRt72xrnZ8+h+pX7YxM7hr87zIO3a/v5p/H3TrnVw== + dependencies: + "@babel/types" "^7.12.13" + +"@babel/helper-member-expression-to-functions@^7.12.13", "@babel/helper-member-expression-to-functions@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.17.tgz#f82838eb06e1235307b6d71457b6670ff71ee5ac" + integrity sha512-Bzv4p3ODgS/qpBE0DiJ9qf5WxSmrQ8gVTe8ClMfwwsY2x/rhykxxy3bXzG7AGTnPB2ij37zGJ/Q/6FruxHxsxg== + dependencies: + "@babel/types" "^7.12.17" + +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.1", "@babel/helper-module-imports@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz#ec67e4404f41750463e455cc3203f6a32e93fcb0" + integrity sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g== + dependencies: + "@babel/types" "^7.12.13" + +"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.12.13", "@babel/helper-module-transforms@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.17.tgz#7c75b987d6dfd5b48e575648f81eaac891539509" + integrity sha512-sFL+p6zOCQMm9vilo06M4VHuTxUAwa6IxgL56Tq1DVtA0ziAGTH1ThmJq7xwPqdQlgAbKX3fb0oZNbtRIyA5KQ== + dependencies: + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-replace-supers" "^7.12.13" + "@babel/helper-simple-access" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/helper-validator-identifier" "^7.12.11" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.12.17" + "@babel/types" "^7.12.17" + lodash "^4.17.19" + +"@babel/helper-optimise-call-expression@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea" + integrity sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA== + dependencies: + "@babel/types" "^7.12.13" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz#174254d0f2424d8aefb4dd48057511247b0a9eeb" + integrity sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA== + +"@babel/helper-remap-async-to-generator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.13.tgz#170365f4140e2d20e5c88f8ba23c24468c296878" + integrity sha512-Qa6PU9vNcj1NZacZZI1Mvwt+gXDH6CTfgAkSjeRMLE8HxtDK76+YDId6NQR+z7Rgd5arhD2cIbS74r0SxD6PDA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-wrap-function" "^7.12.13" + "@babel/types" "^7.12.13" + +"@babel/helper-replace-supers@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.13.tgz#00ec4fb6862546bd3d0aff9aac56074277173121" + integrity sha512-pctAOIAMVStI2TMLhozPKbf5yTEXc0OJa0eENheb4w09SrgOWEs+P4nTOZYJQCqs8JlErGLDPDJTiGIp3ygbLg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.12.13" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/traverse" "^7.12.13" + "@babel/types" "^7.12.13" + +"@babel/helper-simple-access@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz#8478bcc5cacf6aa1672b251c1d2dde5ccd61a6c4" + integrity sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA== + dependencies: + "@babel/types" "^7.12.13" + +"@babel/helper-skip-transparent-expression-wrappers@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" + integrity sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA== + dependencies: + "@babel/types" "^7.12.1" + +"@babel/helper-split-export-declaration@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05" + integrity sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg== + dependencies: + "@babel/types" "^7.12.13" + +"@babel/helper-validator-identifier@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" + integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== + +"@babel/helper-validator-option@^7.12.1", "@babel/helper-validator-option@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" + integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== + +"@babel/helper-wrap-function@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.12.13.tgz#e3ea8cb3ee0a16911f9c1b50d9e99fe8fe30f9ff" + integrity sha512-t0aZFEmBJ1LojdtJnhOaQEVejnzYhyjWHSsNSNo8vOYRbAJNh6r6GQF7pd36SqG7OKGbn+AewVQ/0IfYfIuGdw== + dependencies: + "@babel/helper-function-name" "^7.12.13" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.12.13" + "@babel/types" "^7.12.13" + +"@babel/helpers@^7.12.1", "@babel/helpers@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.17.tgz#71e03d2981a6b5ee16899964f4101dc8471d60bc" + integrity sha512-tEpjqSBGt/SFEsFikKds1sLNChKKGGR17flIgQKXH4fG6m9gTgl3gnOC1giHNyaBCSKuTfxaSzHi7UnvqiVKxg== + dependencies: + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.12.17" + "@babel/types" "^7.12.17" + +"@babel/highlight@^7.10.4", "@babel/highlight@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.12.13.tgz#8ab538393e00370b26271b01fa08f7f27f2e795c" + integrity sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww== + dependencies: + "@babel/helper-validator-identifier" "^7.12.11" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.12.13", "@babel/parser@^7.12.17", "@babel/parser@^7.12.3", "@babel/parser@^7.7.0": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.17.tgz#bc85d2d47db38094e5bb268fc761716e7d693848" + integrity sha512-r1yKkiUTYMQ8LiEI0UcQx5ETw5dpTLn9wijn9hk6KkTtOK95FndDN10M+8/s6k/Ymlbivw0Av9q4SlgF80PtHg== + +"@babel/plugin-proposal-async-generator-functions@^7.12.1", "@babel/plugin-proposal-async-generator-functions@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.13.tgz#d1c6d841802ffb88c64a2413e311f7345b9e66b5" + integrity sha512-1KH46Hx4WqP77f978+5Ye/VUbuwQld2hph70yaw2hXS2v7ER2f3nlpNMu909HO2rbvP0NKLlMVDPh9KXklVMhA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-remap-async-to-generator" "^7.12.13" + "@babel/plugin-syntax-async-generators" "^7.8.0" + +"@babel/plugin-proposal-class-properties@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz#a082ff541f2a29a4821065b8add9346c0c16e5de" + integrity sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-proposal-class-properties@^7.12.1", "@babel/plugin-proposal-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.13.tgz#3d2ce350367058033c93c098e348161d6dc0d8c8" + integrity sha512-8SCJ0Ddrpwv4T7Gwb33EmW1V9PY5lggTO+A8WjyIwxrSHDUyBw4MtF96ifn1n8H806YlxbVCoKXbbmzD6RD+cA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-proposal-decorators@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.12.1.tgz#59271439fed4145456c41067450543aee332d15f" + integrity sha512-knNIuusychgYN8fGJHONL0RbFxLGawhXOJNLBk75TniTsZZeA+wdkDuv6wp4lGwzQEKjZi6/WYtnb3udNPmQmQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-decorators" "^7.12.1" + +"@babel/plugin-proposal-dynamic-import@^7.12.1", "@babel/plugin-proposal-dynamic-import@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.17.tgz#e0ebd8db65acc37eac518fa17bead2174e224512" + integrity sha512-ZNGoFZqrnuy9H2izB2jLlnNDAfVPlGl5NhFEiFe4D84ix9GQGygF+CWMGHKuE+bpyS/AOuDQCnkiRNqW2IzS1Q== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + +"@babel/plugin-proposal-export-namespace-from@^7.12.1", "@babel/plugin-proposal-export-namespace-from@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz#393be47a4acd03fa2af6e3cde9b06e33de1b446d" + integrity sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.12.1", "@babel/plugin-proposal-json-strings@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.13.tgz#ced7888a2db92a3d520a2e35eb421fdb7fcc9b5d" + integrity sha512-v9eEi4GiORDg8x+Dmi5r8ibOe0VXoKDeNPYcTTxdGN4eOWikrJfDJCJrr1l5gKGvsNyGJbrfMftC2dTL6oz7pg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-json-strings" "^7.8.0" + +"@babel/plugin-proposal-logical-assignment-operators@^7.12.1", "@babel/plugin-proposal-logical-assignment-operators@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.13.tgz#575b5d9a08d8299eeb4db6430da6e16e5cf14350" + integrity sha512-fqmiD3Lz7jVdK6kabeSr1PZlWSUVqSitmHEe3Z00dtGTKieWnX9beafvavc32kjORa5Bai4QNHgFDwWJP+WtSQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz#3ed4fff31c015e7f3f1467f190dbe545cd7b046c" + integrity sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.12.1", "@babel/plugin-proposal-nullish-coalescing-operator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.13.tgz#24867307285cee4e1031170efd8a7ac807deefde" + integrity sha512-Qoxpy+OxhDBI5kRqliJFAl4uWXk3Bn24WeFstPH0iLymFehSAUR8MHpqU7njyXv/qbo7oN6yTy5bfCmXdKpo1Q== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + +"@babel/plugin-proposal-numeric-separator@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.1.tgz#0e2c6774c4ce48be412119b4d693ac777f7685a6" + integrity sha512-MR7Ok+Af3OhNTCxYVjJZHS0t97ydnJZt/DbR4WISO39iDnhiD8XHrY12xuSJ90FFEGjir0Fzyyn7g/zY6hxbxA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-numeric-separator@^7.12.1", "@babel/plugin-proposal-numeric-separator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz#bd9da3188e787b5120b4f9d465a8261ce67ed1db" + integrity sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.12.1", "@babel/plugin-proposal-object-rest-spread@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.13.tgz#f93f3116381ff94bc676fdcb29d71045cd1ec011" + integrity sha512-WvA1okB/0OS/N3Ldb3sziSrXg6sRphsBgqiccfcQq7woEn5wQLNX82Oc4PlaFcdwcWHuQXAtb8ftbS8Fbsg/sg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.12.13" + +"@babel/plugin-proposal-optional-catch-binding@^7.12.1", "@babel/plugin-proposal-optional-catch-binding@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.13.tgz#4640520afe57728af14b4d1574ba844f263bcae5" + integrity sha512-9+MIm6msl9sHWg58NvqpNpLtuFbmpFYk37x8kgnGzAHvX35E1FyAwSUt5hIkSoWJFSAH+iwU8bJ4fcD1zKXOzg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + +"@babel/plugin-proposal-optional-chaining@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz#cce122203fc8a32794296fc377c6dedaf4363797" + integrity sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + +"@babel/plugin-proposal-optional-chaining@^7.12.1", "@babel/plugin-proposal-optional-chaining@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.17.tgz#e382becadc2cb16b7913b6c672d92e4b33385b5c" + integrity sha512-TvxwI80pWftrGPKHNfkvX/HnoeSTR7gC4ezWnAL39PuktYUe6r8kEpOLTYnkBTsaoeazXm2jHJ22EQ81sdgfcA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + +"@babel/plugin-proposal-private-methods@^7.12.1", "@babel/plugin-proposal-private-methods@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.13.tgz#ea78a12554d784ecf7fc55950b752d469d9c4a71" + integrity sha512-sV0V57uUwpauixvR7s2o75LmwJI6JECwm5oPUY5beZB1nBl2i37hc7CJGqB5G+58fur5Y6ugvl3LRONk5x34rg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-proposal-unicode-property-regex@^7.12.1", "@babel/plugin-proposal-unicode-property-regex@^7.12.13", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz#bebde51339be829c17aaaaced18641deb62b39ba" + integrity sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-async-generators@^7.8.0", "@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.1", "@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-decorators@^7.12.1": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.13.tgz#fac829bf3c7ef4a1bc916257b403e58c6bdaf648" + integrity sha512-Rw6aIXGuqDLr6/LoBBYE57nKOzQpz/aDkKlMqEwH+Vp0MXbG6H/TfRjaY343LKxzAKAMXIHsQ8JzaZKuDZ9MwA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-dynamic-import@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-flow@^7.12.1": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.12.13.tgz#5df9962503c0a9c918381c929d51d4d6949e7e86" + integrity sha512-J/RYxnlSLXZLVR7wTRsozxKT8qbsx1mNKJzXEEjQ0Kjx1ZACcyHgbanNWNCFtc36IzuWhYWPpvJFFoexoOWFmA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.0", "@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz#044fb81ebad6698fe62c478875575bcbb9b70f15" + integrity sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.0", "@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.0", "@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.12.1", "@babel/plugin-syntax-top-level-await@^7.12.13", "@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz#c5f0fa6e249f5b739727f923540cf7a806130178" + integrity sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-typescript@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz#9dff111ca64154cef0f4dc52cf843d9f12ce4474" + integrity sha512-cHP3u1JiUiG2LFDKbXnwVad81GvfyIOmCD6HIEId6ojrY0Drfy2q1jw7BwN7dE84+kTnBjLkXoL3IEy/3JPu2w== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-arrow-functions@^7.12.1", "@babel/plugin-transform-arrow-functions@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.13.tgz#eda5670b282952100c229f8a3bd49e0f6a72e9fe" + integrity sha512-tBtuN6qtCTd+iHzVZVOMNp+L04iIJBpqkdY42tWbmjIT5wvR2kx7gxMBsyhQtFzHwBbyGi9h8J8r9HgnOpQHxg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-async-to-generator@^7.12.1", "@babel/plugin-transform-async-to-generator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.13.tgz#fed8c69eebf187a535bfa4ee97a614009b24f7ae" + integrity sha512-psM9QHcHaDr+HZpRuJcE1PXESuGWSCcbiGFFhhwfzdbTxaGDVzuVtdNYliAwcRo3GFg0Bc8MmI+AvIGYIJG04A== + dependencies: + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-remap-async-to-generator" "^7.12.13" + +"@babel/plugin-transform-block-scoped-functions@^7.12.1", "@babel/plugin-transform-block-scoped-functions@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz#a9bf1836f2a39b4eb6cf09967739de29ea4bf4c4" + integrity sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-block-scoping@^7.12.1", "@babel/plugin-transform-block-scoping@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz#f36e55076d06f41dfd78557ea039c1b581642e61" + integrity sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-classes@^7.12.1", "@babel/plugin-transform-classes@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.13.tgz#9728edc1838b5d62fc93ad830bd523b1fcb0e1f6" + integrity sha512-cqZlMlhCC1rVnxE5ZGMtIb896ijL90xppMiuWXcwcOAuFczynpd3KYemb91XFFPi3wJSe/OcrX9lXoowatkkxA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-replace-supers" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.12.1", "@babel/plugin-transform-computed-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.13.tgz#6a210647a3d67f21f699cfd2a01333803b27339d" + integrity sha512-dDfuROUPGK1mTtLKyDPUavmj2b6kFu82SmgpztBFEO974KMjJT+Ytj3/oWsTUMBmgPcp9J5Pc1SlcAYRpJ2hRA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-destructuring@^7.12.1", "@babel/plugin-transform-destructuring@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.13.tgz#fc56c5176940c5b41735c677124d1d20cecc9aeb" + integrity sha512-Dn83KykIFzjhA3FDPA1z4N+yfF3btDGhjnJwxIj0T43tP0flCujnU8fKgEkf0C1biIpSv9NZegPBQ1J6jYkwvQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-dotall-regex@^7.12.1", "@babel/plugin-transform-dotall-regex@^7.12.13", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz#3f1601cc29905bfcb67f53910f197aeafebb25ad" + integrity sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-duplicate-keys@^7.12.1", "@babel/plugin-transform-duplicate-keys@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz#6f06b87a8b803fd928e54b81c258f0a0033904de" + integrity sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-exponentiation-operator@^7.12.1", "@babel/plugin-transform-exponentiation-operator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz#4d52390b9a273e651e4aba6aee49ef40e80cd0a1" + integrity sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-flow-strip-types@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.12.1.tgz#8430decfa7eb2aea5414ed4a3fa6e1652b7d77c4" + integrity sha512-8hAtkmsQb36yMmEtk2JZ9JnVyDSnDOdlB+0nEGzIDLuK4yR3JcEjfuFPYkdEPSh8Id+rAMeBEn+X0iVEyho6Hg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-flow" "^7.12.1" + +"@babel/plugin-transform-for-of@^7.12.1", "@babel/plugin-transform-for-of@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.13.tgz#561ff6d74d9e1c8879cb12dbaf4a14cd29d15cf6" + integrity sha512-xCbdgSzXYmHGyVX3+BsQjcd4hv4vA/FDy7Kc8eOpzKmBBPEOTurt0w5fCRQaGl+GSBORKgJdstQ1rHl4jbNseQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-function-name@^7.12.1", "@babel/plugin-transform-function-name@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz#bb024452f9aaed861d374c8e7a24252ce3a50051" + integrity sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ== + dependencies: + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-literals@^7.12.1", "@babel/plugin-transform-literals@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz#2ca45bafe4a820197cf315794a4d26560fe4bdb9" + integrity sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-member-expression-literals@^7.12.1", "@babel/plugin-transform-member-expression-literals@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz#5ffa66cd59b9e191314c9f1f803b938e8c081e40" + integrity sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-modules-amd@^7.12.1", "@babel/plugin-transform-modules-amd@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.13.tgz#43db16249b274ee2e551e2422090aa1c47692d56" + integrity sha512-JHLOU0o81m5UqG0Ulz/fPC68/v+UTuGTWaZBUwpEk1fYQ1D9LfKV6MPn4ttJKqRo5Lm460fkzjLTL4EHvCprvA== + dependencies: + "@babel/helper-module-transforms" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.12.1", "@babel/plugin-transform-modules-commonjs@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.13.tgz#5043b870a784a8421fa1fd9136a24f294da13e50" + integrity sha512-OGQoeVXVi1259HjuoDnsQMlMkT9UkZT9TpXAsqWplS/M0N1g3TJAn/ByOCeQu7mfjc5WpSsRU+jV1Hd89ts0kQ== + dependencies: + "@babel/helper-module-transforms" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-simple-access" "^7.12.13" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-systemjs@^7.12.1", "@babel/plugin-transform-modules-systemjs@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.13.tgz#351937f392c7f07493fc79b2118201d50404a3c5" + integrity sha512-aHfVjhZ8QekaNF/5aNdStCGzwTbU7SI5hUybBKlMzqIMC7w7Ho8hx5a4R/DkTHfRfLwHGGxSpFt9BfxKCoXKoA== + dependencies: + "@babel/helper-hoist-variables" "^7.12.13" + "@babel/helper-module-transforms" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-validator-identifier" "^7.12.11" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-umd@^7.12.1", "@babel/plugin-transform-modules-umd@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.13.tgz#26c66f161d3456674e344b4b1255de4d530cfb37" + integrity sha512-BgZndyABRML4z6ibpi7Z98m4EVLFI9tVsZDADC14AElFaNHHBcJIovflJ6wtCqFxwy2YJ1tJhGRsr0yLPKoN+w== + dependencies: + "@babel/helper-module-transforms" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.12.1", "@babel/plugin-transform-named-capturing-groups-regex@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz#2213725a5f5bbbe364b50c3ba5998c9599c5c9d9" + integrity sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.13" + +"@babel/plugin-transform-new-target@^7.12.1", "@babel/plugin-transform-new-target@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz#e22d8c3af24b150dd528cbd6e685e799bf1c351c" + integrity sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-object-super@^7.12.1", "@babel/plugin-transform-object-super@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz#b4416a2d63b8f7be314f3d349bd55a9c1b5171f7" + integrity sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-replace-supers" "^7.12.13" + +"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.13.tgz#461e76dfb63c2dfd327b8a008a9e802818ce9853" + integrity sha512-e7QqwZalNiBRHCpJg/P8s/VJeSRYgmtWySs1JwvfwPqhBbiWfOcHDKdeAi6oAyIimoKWBlwc8oTgbZHdhCoVZA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-property-literals@^7.12.1", "@babel/plugin-transform-property-literals@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz#4e6a9e37864d8f1b3bc0e2dce7bf8857db8b1a81" + integrity sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-react-constant-elements@^7.12.1": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.12.13.tgz#f8ee56888545d53d80f766b3cc1563ab2c241f92" + integrity sha512-qmzKVTn46Upvtxv8LQoQ8mTCdUC83AOVQIQm57e9oekLT5cmK9GOMOfcWhe8jMNx4UJXn/UDhVZ/7lGofVNeDQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-react-display-name@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.1.tgz#1cbcd0c3b1d6648c55374a22fc9b6b7e5341c00d" + integrity sha512-cAzB+UzBIrekfYxyLlFqf/OagTvHLcVBb5vpouzkYkBclRPraiygVnafvAoipErZLI8ANv8Ecn6E/m5qPXD26w== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-react-display-name@^7.12.1", "@babel/plugin-transform-react-display-name@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.13.tgz#c28effd771b276f4647411c9733dbb2d2da954bd" + integrity sha512-MprESJzI9O5VnJZrL7gg1MpdqmiFcUv41Jc7SahxYsNP2kDkFqClxxTZq+1Qv4AFCamm+GXMRDQINNn+qrxmiA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-react-jsx-development@^7.12.1", "@babel/plugin-transform-react-jsx-development@^7.12.12": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.17.tgz#f510c0fa7cd7234153539f9a362ced41a5ca1447" + integrity sha512-BPjYV86SVuOaudFhsJR1zjgxxOhJDt6JHNoD48DxWEIxUCAMjV1ys6DYw4SDYZh0b1QsS2vfIA9t/ZsQGsDOUQ== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.12.17" + +"@babel/plugin-transform-react-jsx-self@^7.12.1": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.12.13.tgz#422d99d122d592acab9c35ea22a6cfd9bf189f60" + integrity sha512-FXYw98TTJ125GVCCkFLZXlZ1qGcsYqNQhVBQcZjyrwf8FEUtVfKIoidnO8S0q+KBQpDYNTmiGo1gn67Vti04lQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-react-jsx-source@^7.12.1": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.12.13.tgz#051d76126bee5c9a6aa3ba37be2f6c1698856bcb" + integrity sha512-O5JJi6fyfih0WfDgIJXksSPhGP/G0fQpfxYy87sDc+1sFmsCS6wr3aAn+whbzkhbjtq4VMqLRaSzR6IsshIC0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-react-jsx@^7.12.1", "@babel/plugin-transform-react-jsx@^7.12.13", "@babel/plugin-transform-react-jsx@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.17.tgz#dd2c1299f5e26de584939892de3cfc1807a38f24" + integrity sha512-mwaVNcXV+l6qJOuRhpdTEj8sT/Z0owAVWf9QujTZ0d2ye9X/K+MTOTSizcgKOj18PGnTc/7g1I4+cIUjsKhBcw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-jsx" "^7.12.13" + "@babel/types" "^7.12.17" + +"@babel/plugin-transform-react-pure-annotations@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz#05d46f0ab4d1339ac59adf20a1462c91b37a1a42" + integrity sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-regenerator@^7.12.1", "@babel/plugin-transform-regenerator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.13.tgz#b628bcc9c85260ac1aeb05b45bde25210194a2f5" + integrity sha512-lxb2ZAvSLyJ2PEe47hoGWPmW22v7CtSl9jW8mingV4H2sEX/JOcrAj2nPuGWi56ERUm2bUpjKzONAuT6HCn2EA== + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-reserved-words@^7.12.1", "@babel/plugin-transform-reserved-words@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz#7d9988d4f06e0fe697ea1d9803188aa18b472695" + integrity sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-runtime@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.1.tgz#04b792057eb460389ff6a4198e377614ea1e7ba5" + integrity sha512-Ac/H6G9FEIkS2tXsZjL4RAdS3L3WHxci0usAnz7laPWUmFiGtj7tIASChqKZMHTSQTQY6xDbOq+V1/vIq3QrWg== + dependencies: + "@babel/helper-module-imports" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + resolve "^1.8.1" + semver "^5.5.1" + +"@babel/plugin-transform-shorthand-properties@^7.12.1", "@babel/plugin-transform-shorthand-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz#db755732b70c539d504c6390d9ce90fe64aff7ad" + integrity sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-spread@^7.12.1", "@babel/plugin-transform-spread@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.13.tgz#ca0d5645abbd560719c354451b849f14df4a7949" + integrity sha512-dUCrqPIowjqk5pXsx1zPftSq4sT0aCeZVAxhdgs3AMgyaDmoUT0G+5h3Dzja27t76aUEIJWlFgPJqJ/d4dbTtg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + +"@babel/plugin-transform-sticky-regex@^7.12.1", "@babel/plugin-transform-sticky-regex@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz#760ffd936face73f860ae646fb86ee82f3d06d1f" + integrity sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-template-literals@^7.12.1", "@babel/plugin-transform-template-literals@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.13.tgz#655037b07ebbddaf3b7752f55d15c2fd6f5aa865" + integrity sha512-arIKlWYUgmNsF28EyfmiQHJLJFlAJNYkuQO10jL46ggjBpeb2re1P9K9YGxNJB45BqTbaslVysXDYm/g3sN/Qg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-typeof-symbol@^7.12.1", "@babel/plugin-transform-typeof-symbol@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz#785dd67a1f2ea579d9c2be722de8c84cb85f5a7f" + integrity sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-typescript@^7.12.1": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.12.17.tgz#4aa6a5041888dd2e5d316ec39212b0cf855211bb" + integrity sha512-1bIYwnhRoetxkFonuZRtDZPFEjl1l5r+3ITkxLC3mlMaFja+GQFo94b/WHEPjqWLU9Bc+W4oFZbvCGe9eYMu1g== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.12.17" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-typescript" "^7.12.13" + +"@babel/plugin-transform-unicode-escapes@^7.12.1", "@babel/plugin-transform-unicode-escapes@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz#840ced3b816d3b5127dd1d12dcedc5dead1a5e74" + integrity sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-unicode-regex@^7.12.1", "@babel/plugin-transform-unicode-regex@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz#b52521685804e155b1202e83fc188d34bb70f5ac" + integrity sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/preset-env@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.1.tgz#9c7e5ca82a19efc865384bb4989148d2ee5d7ac2" + integrity sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg== + dependencies: + "@babel/compat-data" "^7.12.1" + "@babel/helper-compilation-targets" "^7.12.1" + "@babel/helper-module-imports" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-validator-option" "^7.12.1" + "@babel/plugin-proposal-async-generator-functions" "^7.12.1" + "@babel/plugin-proposal-class-properties" "^7.12.1" + "@babel/plugin-proposal-dynamic-import" "^7.12.1" + "@babel/plugin-proposal-export-namespace-from" "^7.12.1" + "@babel/plugin-proposal-json-strings" "^7.12.1" + "@babel/plugin-proposal-logical-assignment-operators" "^7.12.1" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.1" + "@babel/plugin-proposal-numeric-separator" "^7.12.1" + "@babel/plugin-proposal-object-rest-spread" "^7.12.1" + "@babel/plugin-proposal-optional-catch-binding" "^7.12.1" + "@babel/plugin-proposal-optional-chaining" "^7.12.1" + "@babel/plugin-proposal-private-methods" "^7.12.1" + "@babel/plugin-proposal-unicode-property-regex" "^7.12.1" + "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-class-properties" "^7.12.1" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-syntax-top-level-await" "^7.12.1" + "@babel/plugin-transform-arrow-functions" "^7.12.1" + "@babel/plugin-transform-async-to-generator" "^7.12.1" + "@babel/plugin-transform-block-scoped-functions" "^7.12.1" + "@babel/plugin-transform-block-scoping" "^7.12.1" + "@babel/plugin-transform-classes" "^7.12.1" + "@babel/plugin-transform-computed-properties" "^7.12.1" + "@babel/plugin-transform-destructuring" "^7.12.1" + "@babel/plugin-transform-dotall-regex" "^7.12.1" + "@babel/plugin-transform-duplicate-keys" "^7.12.1" + "@babel/plugin-transform-exponentiation-operator" "^7.12.1" + "@babel/plugin-transform-for-of" "^7.12.1" + "@babel/plugin-transform-function-name" "^7.12.1" + "@babel/plugin-transform-literals" "^7.12.1" + "@babel/plugin-transform-member-expression-literals" "^7.12.1" + "@babel/plugin-transform-modules-amd" "^7.12.1" + "@babel/plugin-transform-modules-commonjs" "^7.12.1" + "@babel/plugin-transform-modules-systemjs" "^7.12.1" + "@babel/plugin-transform-modules-umd" "^7.12.1" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.1" + "@babel/plugin-transform-new-target" "^7.12.1" + "@babel/plugin-transform-object-super" "^7.12.1" + "@babel/plugin-transform-parameters" "^7.12.1" + "@babel/plugin-transform-property-literals" "^7.12.1" + "@babel/plugin-transform-regenerator" "^7.12.1" + "@babel/plugin-transform-reserved-words" "^7.12.1" + "@babel/plugin-transform-shorthand-properties" "^7.12.1" + "@babel/plugin-transform-spread" "^7.12.1" + "@babel/plugin-transform-sticky-regex" "^7.12.1" + "@babel/plugin-transform-template-literals" "^7.12.1" + "@babel/plugin-transform-typeof-symbol" "^7.12.1" + "@babel/plugin-transform-unicode-escapes" "^7.12.1" + "@babel/plugin-transform-unicode-regex" "^7.12.1" + "@babel/preset-modules" "^0.1.3" + "@babel/types" "^7.12.1" + core-js-compat "^3.6.2" + semver "^5.5.0" + +"@babel/preset-env@^7.12.1", "@babel/preset-env@^7.8.4": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.17.tgz#94a3793ff089c32ee74d76a3c03a7597693ebaaa" + integrity sha512-9PMijx8zFbCwTHrd2P4PJR5nWGH3zWebx2OcpTjqQrHhCiL2ssSR2Sc9ko2BsI2VmVBfoaQmPrlMTCui4LmXQg== + dependencies: + "@babel/compat-data" "^7.12.13" + "@babel/helper-compilation-targets" "^7.12.17" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-validator-option" "^7.12.17" + "@babel/plugin-proposal-async-generator-functions" "^7.12.13" + "@babel/plugin-proposal-class-properties" "^7.12.13" + "@babel/plugin-proposal-dynamic-import" "^7.12.17" + "@babel/plugin-proposal-export-namespace-from" "^7.12.13" + "@babel/plugin-proposal-json-strings" "^7.12.13" + "@babel/plugin-proposal-logical-assignment-operators" "^7.12.13" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.13" + "@babel/plugin-proposal-numeric-separator" "^7.12.13" + "@babel/plugin-proposal-object-rest-spread" "^7.12.13" + "@babel/plugin-proposal-optional-catch-binding" "^7.12.13" + "@babel/plugin-proposal-optional-chaining" "^7.12.17" + "@babel/plugin-proposal-private-methods" "^7.12.13" + "@babel/plugin-proposal-unicode-property-regex" "^7.12.13" + "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-syntax-top-level-await" "^7.12.13" + "@babel/plugin-transform-arrow-functions" "^7.12.13" + "@babel/plugin-transform-async-to-generator" "^7.12.13" + "@babel/plugin-transform-block-scoped-functions" "^7.12.13" + "@babel/plugin-transform-block-scoping" "^7.12.13" + "@babel/plugin-transform-classes" "^7.12.13" + "@babel/plugin-transform-computed-properties" "^7.12.13" + "@babel/plugin-transform-destructuring" "^7.12.13" + "@babel/plugin-transform-dotall-regex" "^7.12.13" + "@babel/plugin-transform-duplicate-keys" "^7.12.13" + "@babel/plugin-transform-exponentiation-operator" "^7.12.13" + "@babel/plugin-transform-for-of" "^7.12.13" + "@babel/plugin-transform-function-name" "^7.12.13" + "@babel/plugin-transform-literals" "^7.12.13" + "@babel/plugin-transform-member-expression-literals" "^7.12.13" + "@babel/plugin-transform-modules-amd" "^7.12.13" + "@babel/plugin-transform-modules-commonjs" "^7.12.13" + "@babel/plugin-transform-modules-systemjs" "^7.12.13" + "@babel/plugin-transform-modules-umd" "^7.12.13" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.13" + "@babel/plugin-transform-new-target" "^7.12.13" + "@babel/plugin-transform-object-super" "^7.12.13" + "@babel/plugin-transform-parameters" "^7.12.13" + "@babel/plugin-transform-property-literals" "^7.12.13" + "@babel/plugin-transform-regenerator" "^7.12.13" + "@babel/plugin-transform-reserved-words" "^7.12.13" + "@babel/plugin-transform-shorthand-properties" "^7.12.13" + "@babel/plugin-transform-spread" "^7.12.13" + "@babel/plugin-transform-sticky-regex" "^7.12.13" + "@babel/plugin-transform-template-literals" "^7.12.13" + "@babel/plugin-transform-typeof-symbol" "^7.12.13" + "@babel/plugin-transform-unicode-escapes" "^7.12.13" + "@babel/plugin-transform-unicode-regex" "^7.12.13" + "@babel/preset-modules" "^0.1.3" + "@babel/types" "^7.12.17" + core-js-compat "^3.8.0" + semver "^5.5.0" + +"@babel/preset-modules@^0.1.3": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" + integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.12.1.tgz#7f022b13f55b6dd82f00f16d1c599ae62985358c" + integrity sha512-euCExymHCi0qB9u5fKw7rvlw7AZSjw/NaB9h7EkdTt5+yHRrXdiRTh7fkG3uBPpJg82CqLfp1LHLqWGSCrab+g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-transform-react-display-name" "^7.12.1" + "@babel/plugin-transform-react-jsx" "^7.12.1" + "@babel/plugin-transform-react-jsx-development" "^7.12.1" + "@babel/plugin-transform-react-jsx-self" "^7.12.1" + "@babel/plugin-transform-react-jsx-source" "^7.12.1" + "@babel/plugin-transform-react-pure-annotations" "^7.12.1" + +"@babel/preset-react@^7.12.5": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.12.13.tgz#5f911b2eb24277fa686820d5bd81cad9a0602a0a" + integrity sha512-TYM0V9z6Abb6dj1K7i5NrEhA13oS5ujUYQYDfqIBXYHOc2c2VkFgc+q9kyssIyUfy4/hEwqrgSlJ/Qgv8zJLsA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-react-display-name" "^7.12.13" + "@babel/plugin-transform-react-jsx" "^7.12.13" + "@babel/plugin-transform-react-jsx-development" "^7.12.12" + "@babel/plugin-transform-react-pure-annotations" "^7.12.1" + +"@babel/preset-typescript@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.12.1.tgz#86480b483bb97f75036e8864fe404cc782cc311b" + integrity sha512-hNK/DhmoJPsksdHuI/RVrcEws7GN5eamhi28JkO52MqIxU8Z0QpmiSOQxZHWOHV7I3P4UjHV97ay4TcamMA6Kw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-transform-typescript" "^7.12.1" + +"@babel/runtime-corejs2@^7.8.7": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs2/-/runtime-corejs2-7.14.0.tgz#5519b92ccc819bd3d0a1ecb25ab3cb5a775485f8" + integrity sha512-btR4E8JiGlmmDI5YgirlG9z3T91rBdxnVh2YuEStrHDcekffaaIeK+CE0S4IaYUyYhMa7rFDfF2GEO79XNbLEA== + dependencies: + core-js "^2.6.5" + regenerator-runtime "^0.13.4" + +"@babel/runtime-corejs3@^7.10.2": + version "7.12.18" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.12.18.tgz#e5663237e5658e4c09586995d2dd6d2c8cfd6fc0" + integrity sha512-ngR7yhNTjDxxe1VYmhqQqqXZWujGb6g0IoA4qeG6MxNGRnIw2Zo8ImY8HfaQ7l3T6GklWhdNfyhWk0C0iocdVA== + dependencies: + core-js-pure "^3.0.0" + regenerator-runtime "^0.13.4" + +"@babel/runtime@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.1.tgz#b4116a6b6711d010b2dad3b7b6e43bf1b9954740" + integrity sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/runtime@^7.1.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.9.2": + version "7.13.17" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.17.tgz#8966d1fc9593bf848602f0662d6b4d0069e3a7ec" + integrity sha512-NCdgJEelPTSh+FEFylhnP1ylq848l1z9t9N0j1Lfbcw0+KXGjsTvUmkxy+voLLXB5SOKMbLLx4jxYliGrYQseA== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4": + version "7.12.18" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.18.tgz#af137bd7e7d9705a412b3caaf991fe6aaa97831b" + integrity sha512-BogPQ7ciE6SYAUPtlm9tWbgI9+2AgqSam6QivMgXgAT+fKbgppaj4ZX15MHeLC1PVF5sNk70huBu20XxWOs8Cg== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/runtime@^7.13.8", "@babel/runtime@^7.3.4", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.7": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.0.tgz#46794bc20b612c5f75e62dd071e24dfd95f1cbe6" + integrity sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.10.4", "@babel/template@^7.12.13", "@babel/template@^7.3.3": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327" + integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/parser" "^7.12.13" + "@babel/types" "^7.12.13" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.13", "@babel/traverse@^7.12.17", "@babel/traverse@^7.7.0": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.17.tgz#40ec8c7ffb502c4e54c7f95492dc11b88d718619" + integrity sha512-LGkTqDqdiwC6Q7fWSwQoas/oyiEYw6Hqjve5KOSykXkmFJFqzvGMb9niaUEag3Rlve492Mkye3gLw9FTv94fdQ== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.12.17" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/parser" "^7.12.17" + "@babel/types" "^7.12.17" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.19" + +"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.12.17", "@babel/types@^7.12.6", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.17.tgz#9d711eb807e0934c90b8b1ca0eb1f7230d150963" + integrity sha512-tNMDjcv/4DIcHxErTgwB9q2ZcYyN0sUfgGKUK/mm1FJK7Wz+KstoEekxrl/tBiNDgLK1HGi+sppj1An/1DR4fQ== + dependencies: + "@babel/helper-validator-identifier" "^7.12.11" + lodash "^4.17.19" + to-fast-properties "^2.0.0" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@cnakazawa/watch@^1.0.3": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" + integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== + dependencies: + exec-sh "^0.3.2" + minimist "^1.2.0" + +"@csstools/convert-colors@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" + integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== + +"@csstools/normalize.css@^10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-10.1.0.tgz#f0950bba18819512d42f7197e56c518aa491cf18" + integrity sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg== + +"@eslint/eslintrc@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.3.0.tgz#d736d6963d7003b6514e6324bec9c602ac340318" + integrity sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + lodash "^4.17.20" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + +"@fortawesome/fontawesome-common-types@^0.2.35": + version "0.2.35" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.35.tgz#01dd3d054da07a00b764d78748df20daf2b317e9" + integrity sha512-IHUfxSEDS9dDGqYwIW7wTN6tn/O8E0n5PcAHz9cAaBoZw6UpG20IG/YM3NNLaGPwPqgjBAFjIURzqoQs3rrtuw== + +"@fortawesome/fontawesome-free@^5.15.3": + version "5.15.3" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.3.tgz#c36ffa64a2a239bf948541a97b6ae8d729e09a9a" + integrity sha512-rFnSUN/QOtnOAgqFRooTA3H57JLDm0QEG/jPdk+tLQNL/eWd+Aok8g3qCI+Q1xuDPWpGW/i9JySpJVsq8Q0s9w== + +"@fortawesome/fontawesome-svg-core@^1.2.35": + version "1.2.35" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.35.tgz#85aea8c25645fcec88d35f2eb1045c38d3e65cff" + integrity sha512-uLEXifXIL7hnh2sNZQrIJWNol7cTVIzwI+4qcBIq9QWaZqUblm0IDrtSqbNg+3SQf8SMGHkiSigD++rHmCHjBg== + dependencies: + "@fortawesome/fontawesome-common-types" "^0.2.35" + +"@fortawesome/free-regular-svg-icons@^5.15.3": + version "5.15.3" + resolved "https://registry.yarnpkg.com/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-5.15.3.tgz#1ec4f2410ff638db549c5c5484fc60b66407dbe6" + integrity sha512-q4/p8Xehy9qiVTdDWHL4Z+o5PCLRChePGZRTXkl+/Z7erDVL8VcZUuqzJjs6gUz6czss4VIPBRdCz6wP37/zMQ== + dependencies: + "@fortawesome/fontawesome-common-types" "^0.2.35" + +"@fortawesome/free-solid-svg-icons@^5.15.3": + version "5.15.3" + resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.3.tgz#52eebe354f60dc77e0bde934ffc5c75ffd04f9d8" + integrity sha512-XPeeu1IlGYqz4VWGRAT5ukNMd4VHUEEJ7ysZ7pSSgaEtNvSo+FLurybGJVmiqkQdK50OkSja2bfZXOeyMGRD8Q== + dependencies: + "@fortawesome/fontawesome-common-types" "^0.2.35" + +"@fortawesome/react-fontawesome@^0.1.14": + version "0.1.14" + resolved "https://registry.yarnpkg.com/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.14.tgz#bf28875c3935b69ce2dc620e1060b217a47f64ca" + integrity sha512-4wqNb0gRLVaBm/h+lGe8UfPPivcbuJ6ecI4hIgW0LjI7kzpYB9FkN0L9apbVzg+lsBdcTf0AlBtODjcSX5mmKA== + dependencies: + prop-types "^15.7.2" + +"@hapi/address@2.x.x": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" + integrity sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ== + +"@hapi/bourne@1.x.x": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-1.3.2.tgz#0a7095adea067243ce3283e1b56b8a8f453b242a" + integrity sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA== + +"@hapi/hoek@8.x.x", "@hapi/hoek@^8.3.0": + version "8.5.1" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.5.1.tgz#fde96064ca446dec8c55a8c2f130957b070c6e06" + integrity sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow== + +"@hapi/joi@^15.1.0": + version "15.1.1" + resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-15.1.1.tgz#c675b8a71296f02833f8d6d243b34c57b8ce19d7" + integrity sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ== + dependencies: + "@hapi/address" "2.x.x" + "@hapi/bourne" "1.x.x" + "@hapi/hoek" "8.x.x" + "@hapi/topo" "3.x.x" + +"@hapi/topo@3.x.x": + version "3.1.6" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29" + integrity sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ== + dependencies: + "@hapi/hoek" "^8.3.0" + +"@hypnosphi/create-react-context@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@hypnosphi/create-react-context/-/create-react-context-0.3.1.tgz#f8bfebdc7665f5d426cba3753e0e9c7d3154d7c6" + integrity sha512-V1klUed202XahrWJLLOT3EXNeCpFHCcJntdFGI15ntCwau+jfT386w7OFTMaCqOgXUH1fa0w/I1oZs+i/Rfr0A== + dependencies: + gud "^1.0.0" + warning "^4.0.3" + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-26.6.2.tgz#4e04bc464014358b03ab4937805ee36a0aeb98f2" + integrity sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g== + dependencies: + "@jest/types" "^26.6.2" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^26.6.2" + jest-util "^26.6.2" + slash "^3.0.0" + +"@jest/core@^26.6.0", "@jest/core@^26.6.3": + version "26.6.3" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-26.6.3.tgz#7639fcb3833d748a4656ada54bde193051e45fad" + integrity sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw== + dependencies: + "@jest/console" "^26.6.2" + "@jest/reporters" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/transform" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.4" + jest-changed-files "^26.6.2" + jest-config "^26.6.3" + jest-haste-map "^26.6.2" + jest-message-util "^26.6.2" + jest-regex-util "^26.0.0" + jest-resolve "^26.6.2" + jest-resolve-dependencies "^26.6.3" + jest-runner "^26.6.3" + jest-runtime "^26.6.3" + jest-snapshot "^26.6.2" + jest-util "^26.6.2" + jest-validate "^26.6.2" + jest-watcher "^26.6.2" + micromatch "^4.0.2" + p-each-series "^2.1.0" + rimraf "^3.0.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^26.6.0", "@jest/environment@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-26.6.2.tgz#ba364cc72e221e79cc8f0a99555bf5d7577cf92c" + integrity sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA== + dependencies: + "@jest/fake-timers" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + jest-mock "^26.6.2" + +"@jest/fake-timers@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-26.6.2.tgz#459c329bcf70cee4af4d7e3f3e67848123535aad" + integrity sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA== + dependencies: + "@jest/types" "^26.6.2" + "@sinonjs/fake-timers" "^6.0.1" + "@types/node" "*" + jest-message-util "^26.6.2" + jest-mock "^26.6.2" + jest-util "^26.6.2" + +"@jest/globals@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-26.6.2.tgz#5b613b78a1aa2655ae908eba638cc96a20df720a" + integrity sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA== + dependencies: + "@jest/environment" "^26.6.2" + "@jest/types" "^26.6.2" + expect "^26.6.2" + +"@jest/reporters@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-26.6.2.tgz#1f518b99637a5f18307bd3ecf9275f6882a667f6" + integrity sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/transform" "^26.6.2" + "@jest/types" "^26.6.2" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.2" + graceful-fs "^4.2.4" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^4.0.3" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.0.2" + jest-haste-map "^26.6.2" + jest-resolve "^26.6.2" + jest-util "^26.6.2" + jest-worker "^26.6.2" + slash "^3.0.0" + source-map "^0.6.0" + string-length "^4.0.1" + terminal-link "^2.0.0" + v8-to-istanbul "^7.0.0" + optionalDependencies: + node-notifier "^8.0.0" + +"@jest/source-map@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-26.6.2.tgz#29af5e1e2e324cafccc936f218309f54ab69d535" + integrity sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.2.4" + source-map "^0.6.0" + +"@jest/test-result@^26.6.0", "@jest/test-result@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-26.6.2.tgz#55da58b62df134576cc95476efa5f7949e3f5f18" + integrity sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ== + dependencies: + "@jest/console" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^26.6.3": + version "26.6.3" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz#98e8a45100863886d074205e8ffdc5a7eb582b17" + integrity sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw== + dependencies: + "@jest/test-result" "^26.6.2" + graceful-fs "^4.2.4" + jest-haste-map "^26.6.2" + jest-runner "^26.6.3" + jest-runtime "^26.6.3" + +"@jest/transform@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.6.2.tgz#5ac57c5fa1ad17b2aae83e73e45813894dcf2e4b" + integrity sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^26.6.2" + babel-plugin-istanbul "^6.0.0" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.4" + jest-haste-map "^26.6.2" + jest-regex-util "^26.0.0" + jest-util "^26.6.2" + micromatch "^4.0.2" + pirates "^4.0.1" + slash "^3.0.0" + source-map "^0.6.1" + write-file-atomic "^3.0.0" + +"@jest/types@^26.6.0", "@jest/types@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" + integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + +"@nodelib/fs.scandir@2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69" + integrity sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA== + dependencies: + "@nodelib/fs.stat" "2.0.4" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.4", "@nodelib/fs.stat@^2.0.2": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz#a3f2dd61bab43b8db8fa108a121cfffe4c676655" + integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz#cce9396b30aa5afe9e3756608f5831adcb53d063" + integrity sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow== + dependencies: + "@nodelib/fs.scandir" "2.1.4" + fastq "^1.6.0" + +"@npmcli/move-file@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" + integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== + dependencies: + mkdirp "^1.0.4" + rimraf "^3.0.2" + +"@pmmmwh/react-refresh-webpack-plugin@0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.4.3.tgz#1eec460596d200c0236bf195b078a5d1df89b766" + integrity sha512-br5Qwvh8D2OQqSXpd1g/xqXKnK0r+Jz6qVKBbWmpUcrbGOxUrf39V5oZ1876084CGn18uMdR5uvPqBv9UqtBjQ== + dependencies: + ansi-html "^0.0.7" + error-stack-parser "^2.0.6" + html-entities "^1.2.1" + native-url "^0.2.6" + schema-utils "^2.6.5" + source-map "^0.7.3" + +"@popperjs/core@^2.5.3", "@popperjs/core@^2.8.6": + version "2.9.2" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.9.2.tgz#adea7b6953cbb34651766b0548468e743c6a2353" + integrity sha512-VZMYa7+fXHdwIq1TDhSXoVmSPEGM/aa+6Aiq3nVVJ9bXr24zScr+NlKFKC3iPljA7ho/GAZr+d2jOf5GIRC30Q== + +"@restart/context@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@restart/context/-/context-2.1.4.tgz#a99d87c299a34c28bd85bb489cb07bfd23149c02" + integrity sha512-INJYZQJP7g+IoDUh/475NlGiTeMfwTXUEr3tmRneckHIxNolGOW9CTq83S8cxq0CgJwwcMzMJFchxvlwe7Rk8Q== + +"@restart/hooks@^0.3.22", "@restart/hooks@^0.3.25", "@restart/hooks@^0.3.26": + version "0.3.26" + resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.3.26.tgz#ade155a7b0b014ef1073391dda46972c3a14a129" + integrity sha512-7Hwk2ZMYm+JLWcb7R9qIXk1OoUg1Z+saKWqZXlrvFwT3w6UArVNWgxYOzf+PJoK9zZejp8okPAKTctthhXLt5g== + dependencies: + lodash "^4.17.20" + lodash-es "^4.17.20" + +"@rjsf/bootstrap-4@^2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@rjsf/bootstrap-4/-/bootstrap-4-2.5.1.tgz#adb164f22d450e275a07d0b18e39aa1de83ff136" + integrity sha512-USijizR4MkYtMOdbZWt3HDDc9vWmMvmiskqXwV2jEUBMPSu1UG0bZS2HKzqfnMJcJRT1P7Tj4O3sGwgE+7FCpw== + dependencies: + react-icons "^3.10.0" + +"@rjsf/core@^2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@rjsf/core/-/core-2.5.1.tgz#95a842d22bab5f83929662fcd73739108e9f5cbb" + integrity sha512-km8NYScXNONaL5BiSLS6wyDj49pOLZtn0iXg7Zxlm921uuf3o2AAX5SuZS5kB4Zj2zlrVMrXESexfX6bxdDYHw== + dependencies: + "@babel/runtime-corejs2" "^7.8.7" + "@types/json-schema" "^7.0.4" + ajv "^6.7.0" + core-js "^2.5.7" + json-schema-merge-allof "^0.6.0" + jsonpointer "^4.0.1" + lodash "^4.17.15" + prop-types "^15.7.2" + react-app-polyfill "^1.0.4" + react-is "^16.9.0" + shortid "^2.2.14" + +"@rollup/plugin-node-resolve@^7.1.1": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz#80de384edfbd7bfc9101164910f86078151a3eca" + integrity sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q== + dependencies: + "@rollup/pluginutils" "^3.0.8" + "@types/resolve" "0.0.8" + builtin-modules "^3.1.0" + is-module "^1.0.0" + resolve "^1.14.2" + +"@rollup/plugin-replace@^2.3.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-2.4.1.tgz#c411b5ab72809fb1bfc8b487d8d02eef661460d3" + integrity sha512-XwC1oK5rrtRJ0tn1ioLHS6OV5JTluJF7QE1J/q1hN3bquwjnVxjtMyY9iCnoyH9DQbf92CxajB3o98wZbP3oAQ== + dependencies: + "@rollup/pluginutils" "^3.1.0" + magic-string "^0.25.7" + +"@rollup/pluginutils@^3.0.8", "@rollup/pluginutils@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" + integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== + dependencies: + "@types/estree" "0.0.39" + estree-walker "^1.0.1" + picomatch "^2.2.2" + +"@sinonjs/commons@^1.7.0": + version "1.8.2" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.2.tgz#858f5c4b48d80778fde4b9d541f27edc0d56488b" + integrity sha512-sruwd86RJHdsVf/AtBoijDmUqJp3B6hF/DGC23C+JaegnDHaZyewCjoVGTdg3J0uz3Zs7NnIT05OBOmML72lQw== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" + integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@surma/rollup-plugin-off-main-thread@^1.1.1": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-1.4.2.tgz#e6786b6af5799f82f7ab3a82e53f6182d2b91a58" + integrity sha512-yBMPqmd1yEJo/280PAMkychuaALyQ9Lkb5q1ck3mjJrFuEobIfhnQ4J3mbvBoISmR3SWMWV+cGB/I0lCQee79A== + dependencies: + ejs "^2.6.1" + magic-string "^0.25.0" + +"@svgr/babel-plugin-add-jsx-attribute@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz#81ef61947bb268eb9d50523446f9c638fb355906" + integrity sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg== + +"@svgr/babel-plugin-remove-jsx-attribute@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz#6b2c770c95c874654fd5e1d5ef475b78a0a962ef" + integrity sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg== + +"@svgr/babel-plugin-remove-jsx-empty-expression@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz#25621a8915ed7ad70da6cea3d0a6dbc2ea933efd" + integrity sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA== + +"@svgr/babel-plugin-replace-jsx-attribute-value@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz#0b221fc57f9fcd10e91fe219e2cd0dd03145a897" + integrity sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ== + +"@svgr/babel-plugin-svg-dynamic-title@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz#139b546dd0c3186b6e5db4fefc26cb0baea729d7" + integrity sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg== + +"@svgr/babel-plugin-svg-em-dimensions@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz#6543f69526632a133ce5cabab965deeaea2234a0" + integrity sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw== + +"@svgr/babel-plugin-transform-react-native-svg@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz#00bf9a7a73f1cad3948cdab1f8dfb774750f8c80" + integrity sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q== + +"@svgr/babel-plugin-transform-svg-component@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz#583a5e2a193e214da2f3afeb0b9e8d3250126b4a" + integrity sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ== + +"@svgr/babel-preset@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-5.5.0.tgz#8af54f3e0a8add7b1e2b0fcd5a882c55393df327" + integrity sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "^5.4.0" + "@svgr/babel-plugin-remove-jsx-attribute" "^5.4.0" + "@svgr/babel-plugin-remove-jsx-empty-expression" "^5.0.1" + "@svgr/babel-plugin-replace-jsx-attribute-value" "^5.0.1" + "@svgr/babel-plugin-svg-dynamic-title" "^5.4.0" + "@svgr/babel-plugin-svg-em-dimensions" "^5.4.0" + "@svgr/babel-plugin-transform-react-native-svg" "^5.4.0" + "@svgr/babel-plugin-transform-svg-component" "^5.5.0" + +"@svgr/core@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/core/-/core-5.5.0.tgz#82e826b8715d71083120fe8f2492ec7d7874a579" + integrity sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ== + dependencies: + "@svgr/plugin-jsx" "^5.5.0" + camelcase "^6.2.0" + cosmiconfig "^7.0.0" + +"@svgr/hast-util-to-babel-ast@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz#5ee52a9c2533f73e63f8f22b779f93cd432a5461" + integrity sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ== + dependencies: + "@babel/types" "^7.12.6" + +"@svgr/plugin-jsx@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz#1aa8cd798a1db7173ac043466d7b52236b369000" + integrity sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA== + dependencies: + "@babel/core" "^7.12.3" + "@svgr/babel-preset" "^5.5.0" + "@svgr/hast-util-to-babel-ast" "^5.5.0" + svg-parser "^2.0.2" + +"@svgr/plugin-svgo@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz#02da55d85320549324e201c7b2e53bf431fcc246" + integrity sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ== + dependencies: + cosmiconfig "^7.0.0" + deepmerge "^4.2.2" + svgo "^1.2.2" + +"@svgr/webpack@5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-5.5.0.tgz#aae858ee579f5fa8ce6c3166ef56c6a1b381b640" + integrity sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g== + dependencies: + "@babel/core" "^7.12.3" + "@babel/plugin-transform-react-constant-elements" "^7.12.1" + "@babel/preset-env" "^7.12.1" + "@babel/preset-react" "^7.12.5" + "@svgr/core" "^5.5.0" + "@svgr/plugin-jsx" "^5.5.0" + "@svgr/plugin-svgo" "^5.5.0" + loader-utils "^2.0.0" + +"@testing-library/dom@^7.28.1": + version "7.30.4" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-7.30.4.tgz#c6a4a91557e92035fd565246bbbfb8107aa4634d" + integrity sha512-GObDVMaI4ARrZEXaRy4moolNAxWPKvEYNV/fa6Uc2eAzR/t4otS6A7EhrntPBIQLeehL9DbVhscvvv7gd6hWqA== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/runtime" "^7.12.5" + "@types/aria-query" "^4.2.0" + aria-query "^4.2.2" + chalk "^4.1.0" + dom-accessibility-api "^0.5.4" + lz-string "^1.4.4" + pretty-format "^26.6.2" + +"@testing-library/jest-dom@^5.13.0": + version "5.13.0" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.13.0.tgz#0a365684e2c1159f857f5915be50089fc5657df0" + integrity sha512-+jXXTn8GjRnZkJfzG/tqK/2Q7dGlBInR412WE7Aml7CT3wdSpx5dMQC0HOwVQoZ3cNTmQUy8fCVGUV/Zhoyvcw== + dependencies: + "@babel/runtime" "^7.9.2" + "@types/testing-library__jest-dom" "^5.9.1" + aria-query "^4.2.2" + chalk "^3.0.0" + css "^3.0.0" + css.escape "^1.5.1" + lodash "^4.17.15" + redent "^3.0.0" + +"@testing-library/react@^11.2.7": + version "11.2.7" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-11.2.7.tgz#b29e2e95c6765c815786c0bc1d5aed9cb2bf7818" + integrity sha512-tzRNp7pzd5QmbtXNG/mhdcl7Awfu/Iz1RaVHY75zTdOkmHCuzMhRL83gWHSgOAcjS3CCbyfwUHMZgRJb4kAfpA== + dependencies: + "@babel/runtime" "^7.12.5" + "@testing-library/dom" "^7.28.1" + +"@testing-library/user-event@^12.1.10": + version "12.8.3" + resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-12.8.3.tgz#1aa3ed4b9f79340a1e1836bc7f57c501e838704a" + integrity sha512-IR0iWbFkgd56Bu5ZI/ej8yQwrkCv8Qydx6RzwbKz9faXazR/+5tvYKsZQgyXJiwgpcva127YO6JcWy7YlCfofQ== + dependencies: + "@babel/runtime" "^7.12.5" + +"@types/anymatch@*": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-1.3.1.tgz#336badc1beecb9dacc38bea2cf32adf627a8421a" + integrity sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA== + +"@types/aria-query@^4.2.0": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.1.tgz#78b5433344e2f92e8b306c06a5622c50c245bf6b" + integrity sha512-S6oPal772qJZHoRZLFc/XoZW2gFvwXusYUmXPXkgxJLuEk2vOt7jc4Yo6z/vtI0EBkbPBVrJJ0B+prLIKiWqHg== + +"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7": + version "7.1.12" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.12.tgz#4d8e9e51eb265552a7e4f1ff2219ab6133bdfb2d" + integrity sha512-wMTHiiTiBAAPebqaPiPDLFA4LYPKr6Ph0Xq/6rq1Ur3v66HXyG+clfR9CNETkD7MQS8ZHvpQOtA53DLws5WAEQ== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.2.tgz#f3d71178e187858f7c45e30380f8f1b7415a12d8" + integrity sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.0.tgz#0c888dd70b3ee9eebb6e4f200e809da0076262be" + integrity sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.11.0.tgz#b9a1efa635201ba9bc850323a8793ee2d36c04a0" + integrity sha512-kSjgDMZONiIfSH1Nxcr5JIRMwUetDki63FSQfpTCz8ogF3Ulqm8+mr5f78dUYs6vMiB6gBusQqfQmBvHZj/lwg== + dependencies: + "@babel/types" "^7.3.0" + +"@types/classnames@^2.2.10": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@types/classnames/-/classnames-2.3.1.tgz#3c2467aa0f1a93f1f021e3b9bcf938bd5dfdc0dd" + integrity sha512-zeOWb0JGBoVmlQoznvqXbE0tEC/HONsnoUNH19Hc96NFsTAwTXbTqb8FMYkru1F/iqp7a18Ws3nWJvtA1sHD1A== + dependencies: + classnames "*" + +"@types/eslint@^7.2.6": + version "7.2.6" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.2.6.tgz#5e9aff555a975596c03a98b59ecd103decc70c3c" + integrity sha512-I+1sYH+NPQ3/tVqCeUSBwTE/0heyvtXqpIopUUArlBm0Kpocb8FbMa3AZ/ASKIFpN3rnEx932TTXDbt9OXsNDw== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*": + version "0.0.46" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.46.tgz#0fb6bfbbeabd7a30880504993369c4bf1deab1fe" + integrity sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg== + +"@types/estree@0.0.39": + version "0.0.39" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" + integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== + +"@types/glob@^7.1.1": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" + integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/graceful-fs@^4.1.2": + version "4.1.5" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" + integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== + dependencies: + "@types/node" "*" + +"@types/html-minifier-terser@^5.0.0": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#3c9ee980f1a10d6021ae6632ca3e79ca2ec4fb50" + integrity sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA== + +"@types/http-proxy@^1.17.5": + version "1.17.5" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.5.tgz#c203c5e6e9dc6820d27a40eb1e511c70a220423d" + integrity sha512-GNkDE7bTv6Sf8JbV2GksknKOsk7OznNYHSdrtvPJXO0qJ9odZig6IZKUi5RFGi6d1bf6dgIAe4uXi3DBc7069Q== + dependencies: + "@types/node" "*" + +"@types/invariant@^2.2.33": + version "2.2.34" + resolved "https://registry.yarnpkg.com/@types/invariant/-/invariant-2.2.34.tgz#05e4f79f465c2007884374d4795452f995720bbe" + integrity sha512-lYUtmJ9BqUN688fGY1U1HZoWT1/Jrmgigx2loq4ZcJpICECm/Om3V314BxdzypO0u5PORKGMM6x0OXaljV1YFg== + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" + integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz#508b13aa344fa4976234e75dddcc34925737d821" + integrity sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jest@*": + version "26.0.22" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.22.tgz#8308a1debdf1b807aa47be2838acdcd91e88fbe6" + integrity sha512-eeWwWjlqxvBxc4oQdkueW5OF/gtfSceKk4OnOAGlUSwS/liBRtZppbJuz1YkgbrbfGOoeBHun9fOvXnjNwrSOw== + dependencies: + jest-diff "^26.0.0" + pretty-format "^26.0.0" + +"@types/json-schema@*", "@types/json-schema@^7.0.3", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.6": + version "7.0.7" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" + integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= + +"@types/minimatch@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + +"@types/node@*": + version "14.14.31" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.31.tgz#72286bd33d137aa0d152d47ec7c1762563d34055" + integrity sha512-vFHy/ezP5qI0rFgJ7aQnjDXwAMrG0KqqIH7tQG5PPv3BWBayOPIQNBjVc/P6hhdZfMx51REc6tfDNXHUio893g== + +"@types/normalize-package-data@^2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" + integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/prettier@^2.0.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.2.1.tgz#374e31645d58cb18a07b3ecd8e9dede4deb2cccd" + integrity sha512-DxZZbyMAM9GWEzXL+BMZROWz9oo6A9EilwwOMET2UVu2uZTqMWS5S69KVtuVKaRjCUpcrOXRalet86/OpG4kqw== + +"@types/prop-types@*", "@types/prop-types@^15.7.3": + version "15.7.3" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" + integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== + +"@types/q@^1.5.1": + version "1.5.4" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24" + integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug== + +"@types/react-transition-group@^4.4.1": + version "4.4.1" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.1.tgz#e1a3cb278df7f47f17b5082b1b3da17170bd44b1" + integrity sha512-vIo69qKKcYoJ8wKCJjwSgCTM+z3chw3g18dkrDfVX665tMH7tmbDxEAnPdey4gTlwZz5QuHGzd+hul0OVZDqqQ== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@>=16.9.11", "@types/react@>=16.9.35": + version "17.0.4" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.4.tgz#a67c6f7a460d2660e950d9ccc1c2f18525c28220" + integrity sha512-onz2BqScSFMoTRdJUZUDD/7xrusM8hBA2Fktk2qgaTYPCgPvWnDEgkrOs8hhPUf2jfcIXkJ5yK6VfYormJS3Jw== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/resolve@0.0.8": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194" + integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ== + dependencies: + "@types/node" "*" + +"@types/scheduler@*": + version "0.16.1" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.1.tgz#18845205e86ff0038517aab7a18a62a6b9f71275" + integrity sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA== + +"@types/source-list-map@*": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" + integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== + +"@types/stack-utils@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.0.tgz#7036640b4e21cc2f259ae826ce843d277dad8cff" + integrity sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw== + +"@types/tapable@*", "@types/tapable@^1.0.5": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.6.tgz#a9ca4b70a18b270ccb2bc0aaafefd1d486b7ea74" + integrity sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA== + +"@types/testing-library__jest-dom@^5.9.1": + version "5.9.5" + resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.9.5.tgz#5bf25c91ad2d7b38f264b12275e5c92a66d849b0" + integrity sha512-ggn3ws+yRbOHog9GxnXiEZ/35Mow6YtPZpd7Z5mKDeZS/o7zx3yAle0ov/wjhVB5QT4N2Dt+GNoGCdqkBGCajQ== + dependencies: + "@types/jest" "*" + +"@types/uglify-js@*": + version "3.12.0" + resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.12.0.tgz#2bb061c269441620d46b946350c8f16d52ef37c5" + integrity sha512-sYAF+CF9XZ5cvEBkI7RtrG9g2GtMBkviTnBxYYyq+8BWvO4QtXfwwR6a2LFwCi4evMKZfpv6U43ViYvv17Wz3Q== + dependencies: + source-map "^0.6.1" + +"@types/warning@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/warning/-/warning-3.0.0.tgz#0d2501268ad8f9962b740d387c4654f5f8e23e52" + integrity sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI= + +"@types/webpack-sources@*": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-2.1.0.tgz#8882b0bd62d1e0ce62f183d0d01b72e6e82e8c10" + integrity sha512-LXn/oYIpBeucgP1EIJbKQ2/4ZmpvRl+dlrFdX7+94SKRUV3Evy3FsfMZY318vGhkWUS5MPhtOM3w1/hCOAOXcg== + dependencies: + "@types/node" "*" + "@types/source-list-map" "*" + source-map "^0.7.3" + +"@types/webpack@^4.41.8": + version "4.41.26" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.26.tgz#27a30d7d531e16489f9c7607c747be6bc1a459ef" + integrity sha512-7ZyTfxjCRwexh+EJFwRUM+CDB2XvgHl4vfuqf1ZKrgGvcS5BrNvPQqJh3tsZ0P6h6Aa1qClVHaJZszLPzpqHeA== + dependencies: + "@types/anymatch" "*" + "@types/node" "*" + "@types/tapable" "*" + "@types/uglify-js" "*" + "@types/webpack-sources" "*" + source-map "^0.6.0" + +"@types/yargs-parser@*": + version "20.2.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.0.tgz#dd3e6699ba3237f0348cd085e4698780204842f9" + integrity sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA== + +"@types/yargs@^15.0.0": + version "15.0.13" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.13.tgz#34f7fec8b389d7f3c1fd08026a5763e072d3c6dc" + integrity sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^4.5.0": + version "4.15.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.15.2.tgz#981b26b4076c62a5a55873fbef3fe98f83360c61" + integrity sha512-uiQQeu9tWl3f1+oK0yoAv9lt/KXO24iafxgQTkIYO/kitruILGx3uH+QtIAHqxFV+yIsdnJH+alel9KuE3J15Q== + dependencies: + "@typescript-eslint/experimental-utils" "4.15.2" + "@typescript-eslint/scope-manager" "4.15.2" + debug "^4.1.1" + functional-red-black-tree "^1.0.1" + lodash "^4.17.15" + regexpp "^3.0.0" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/experimental-utils@4.15.2", "@typescript-eslint/experimental-utils@^4.0.1": + version "4.15.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.15.2.tgz#5efd12355bd5b535e1831282e6cf465b9a71cf36" + integrity sha512-Fxoshw8+R5X3/Vmqwsjc8nRO/7iTysRtDqx6rlfLZ7HbT8TZhPeQqbPjTyk2RheH3L8afumecTQnUc9EeXxohQ== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/scope-manager" "4.15.2" + "@typescript-eslint/types" "4.15.2" + "@typescript-eslint/typescript-estree" "4.15.2" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" + +"@typescript-eslint/experimental-utils@^3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz#e179ffc81a80ebcae2ea04e0332f8b251345a686" + integrity sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/types" "3.10.1" + "@typescript-eslint/typescript-estree" "3.10.1" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" + +"@typescript-eslint/parser@^4.5.0": + version "4.15.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.15.2.tgz#c804474321ef76a3955aec03664808f0d6e7872e" + integrity sha512-SHeF8xbsC6z2FKXsaTb1tBCf0QZsjJ94H6Bo51Y1aVEZ4XAefaw5ZAilMoDPlGghe+qtq7XdTiDlGfVTOmvA+Q== + dependencies: + "@typescript-eslint/scope-manager" "4.15.2" + "@typescript-eslint/types" "4.15.2" + "@typescript-eslint/typescript-estree" "4.15.2" + debug "^4.1.1" + +"@typescript-eslint/scope-manager@4.15.2": + version "4.15.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.15.2.tgz#5725bda656995960ae1d004bfd1cd70320f37f4f" + integrity sha512-Zm0tf/MSKuX6aeJmuXexgdVyxT9/oJJhaCkijv0DvJVT3ui4zY6XYd6iwIo/8GEZGy43cd7w1rFMiCLHbRzAPQ== + dependencies: + "@typescript-eslint/types" "4.15.2" + "@typescript-eslint/visitor-keys" "4.15.2" + +"@typescript-eslint/types@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.10.1.tgz#1d7463fa7c32d8a23ab508a803ca2fe26e758727" + integrity sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ== + +"@typescript-eslint/types@4.15.2": + version "4.15.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.15.2.tgz#04acf3a2dc8001a88985291744241e732ef22c60" + integrity sha512-r7lW7HFkAarfUylJ2tKndyO9njwSyoy6cpfDKWPX6/ctZA+QyaYscAHXVAfJqtnY6aaTwDYrOhp+ginlbc7HfQ== + +"@typescript-eslint/typescript-estree@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz#fd0061cc38add4fad45136d654408569f365b853" + integrity sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w== + dependencies: + "@typescript-eslint/types" "3.10.1" + "@typescript-eslint/visitor-keys" "3.10.1" + debug "^4.1.1" + glob "^7.1.6" + is-glob "^4.0.1" + lodash "^4.17.15" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/typescript-estree@4.15.2": + version "4.15.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.15.2.tgz#c2f7a1e94f3428d229d5ecff3ead6581ee9b62fa" + integrity sha512-cGR8C2g5SPtHTQvAymEODeqx90pJHadWsgTtx6GbnTWKqsg7yp6Eaya9nFzUd4KrKhxdYTTFBiYeTPQaz/l8bw== + dependencies: + "@typescript-eslint/types" "4.15.2" + "@typescript-eslint/visitor-keys" "4.15.2" + debug "^4.1.1" + globby "^11.0.1" + is-glob "^4.0.1" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/visitor-keys@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz#cd4274773e3eb63b2e870ac602274487ecd1e931" + integrity sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ== + dependencies: + eslint-visitor-keys "^1.1.0" + +"@typescript-eslint/visitor-keys@4.15.2": + version "4.15.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.15.2.tgz#3d1c7979ce75bf6acf9691109bd0d6b5706192b9" + integrity sha512-TME1VgSb7wTwgENN5KVj4Nqg25hP8DisXxNBojM4Nn31rYaNDIocNm5cmjOFfh42n7NVERxWrDFoETO/76ePyg== + dependencies: + "@typescript-eslint/types" "4.15.2" + eslint-visitor-keys "^2.0.0" + +"@webassemblyjs/ast@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" + integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== + dependencies: + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + +"@webassemblyjs/floating-point-hex-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" + integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== + +"@webassemblyjs/helper-api-error@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" + integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== + +"@webassemblyjs/helper-buffer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" + integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== + +"@webassemblyjs/helper-code-frame@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" + integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== + dependencies: + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/helper-fsm@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" + integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== + +"@webassemblyjs/helper-module-context@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" + integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== + dependencies: + "@webassemblyjs/ast" "1.9.0" + +"@webassemblyjs/helper-wasm-bytecode@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" + integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== + +"@webassemblyjs/helper-wasm-section@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" + integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + +"@webassemblyjs/ieee754@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" + integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" + integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" + integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== + +"@webassemblyjs/wasm-edit@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" + integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/helper-wasm-section" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-opt" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/wasm-gen@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" + integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wasm-opt@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" + integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + +"@webassemblyjs/wasm-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" + integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wast-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" + integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/floating-point-hex-parser" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-code-frame" "1.9.0" + "@webassemblyjs/helper-fsm" "1.9.0" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/wast-printer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" + integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +abab@^2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" + integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +acorn-globals@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" + integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== + dependencies: + acorn "^7.1.1" + acorn-walk "^7.1.1" + +acorn-jsx@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" + integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== + +acorn-walk@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn@^6.4.1: + version "6.4.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== + +acorn@^7.1.0, acorn@^7.1.1, acorn@^7.4.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +address@1.1.2, address@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" + integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== + +adjust-sourcemap-loader@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz#5ae12fb5b7b1c585e80bbb5a63ec163a1a45e61e" + integrity sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw== + dependencies: + loader-utils "^2.0.0" + regex-parser "^2.2.11" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.7.0: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^7.0.2: + version "7.1.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-7.1.1.tgz#1e6b37a454021fa9941713f38b952fc1c8d32a84" + integrity sha512-ga/aqDYnUy/o7vbsRTFhhTsNeXiYb5JWDIcRIeZfwRNCefwjNTVYCGdGSUrEmiu3yDK3vFvNbgJxvrQW4JXrYQ== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +alphanum-sort@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= + +ansi-colors@^3.0.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" + integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== + +ansi-colors@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-escapes@^4.2.1, ansi-escapes@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" + integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== + dependencies: + type-fest "^0.11.0" + +ansi-html@0.0.7, ansi-html@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +anymatch@^3.0.3, anymatch@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +aria-query@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" + integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA== + dependencies: + "@babel/runtime" "^7.10.2" + "@babel/runtime-corejs3" "^7.10.2" + +arity-n@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/arity-n/-/arity-n-1.0.4.tgz#d9e76b11733e08569c0847ae7b39b2860b30b745" + integrity sha1-2edrEXM+CFacCEeuezmyhgswt0U= + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-flatten@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +array-includes@^3.1.1, array-includes@^3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.3.tgz#c7f619b382ad2afaf5326cddfdc0afc61af7690a" + integrity sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.2" + get-intrinsic "^1.1.1" + is-string "^1.0.5" + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + dependencies: + array-uniq "^1.0.1" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +array.prototype.flat@^1.2.3: + version "1.2.4" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz#6ef638b43312bd401b4c6199fdec7e2dc9e9a123" + integrity sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + +array.prototype.flatmap@^1.2.3: + version "1.2.4" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz#94cfd47cc1556ec0747d97f7c7738c58122004c9" + integrity sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + function-bind "^1.1.1" + +arrify@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" + integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== + +asap@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= + +asn1.js@^5.2.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +ast-types-flow@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +async@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + dependencies: + lodash "^4.17.14" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +autoprefixer@^9.6.1: + version "9.8.6" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f" + integrity sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg== + dependencies: + browserslist "^4.12.0" + caniuse-lite "^1.0.30001109" + colorette "^1.2.1" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^7.0.32" + postcss-value-parser "^4.1.0" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + +axe-core@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.1.2.tgz#7cf783331320098bfbef620df3b3c770147bc224" + integrity sha512-V+Nq70NxKhYt89ArVcaNL9FDryB3vQOd+BFXZIfO3RP6rwtj+2yqqqdHEkacutglPaZLkJeuXKCjCJDMGPtPqg== + +axobject-query@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" + integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== + +babel-eslint@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" + integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.7.0" + "@babel/traverse" "^7.7.0" + "@babel/types" "^7.7.0" + eslint-visitor-keys "^1.0.0" + resolve "^1.12.0" + +babel-extract-comments@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz#0a2aedf81417ed391b85e18b4614e693a0351a21" + integrity sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ== + dependencies: + babylon "^6.18.0" + +babel-jest@^26.6.0, babel-jest@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.6.3.tgz#d87d25cb0037577a0c89f82e5755c5d293c01056" + integrity sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA== + dependencies: + "@jest/transform" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/babel__core" "^7.1.7" + babel-plugin-istanbul "^6.0.0" + babel-preset-jest "^26.6.2" + chalk "^4.0.0" + graceful-fs "^4.2.4" + slash "^3.0.0" + +babel-loader@8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3" + integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw== + dependencies: + find-cache-dir "^2.1.0" + loader-utils "^1.4.0" + mkdirp "^0.5.3" + pify "^4.0.1" + schema-utils "^2.6.5" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-istanbul@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz#e159ccdc9af95e0b570c75b4573b7c34d671d765" + integrity sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^4.0.0" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz#8185bd030348d254c6d7dd974355e6a28b21e62d" + integrity sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.0.0" + "@types/babel__traverse" "^7.0.6" + +babel-plugin-macros@2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138" + integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg== + dependencies: + "@babel/runtime" "^7.7.2" + cosmiconfig "^6.0.0" + resolve "^1.12.0" + +babel-plugin-named-asset-import@^0.3.7: + version "0.3.7" + resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.7.tgz#156cd55d3f1228a5765774340937afc8398067dd" + integrity sha512-squySRkf+6JGnvjoUtDEjSREJEBirnXi9NqP6rjSYsylxQxqBTz+pkmf395i9E2zsvmYUaI40BHo6SqZUdydlw== + +babel-plugin-syntax-object-rest-spread@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= + +babel-plugin-transform-object-rest-spread@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" + integrity sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY= + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.26.0" + +babel-plugin-transform-react-remove-prop-types@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a" + integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + +babel-preset-jest@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz#747872b1171df032252426586881d62d31798fee" + integrity sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ== + dependencies: + babel-plugin-jest-hoist "^26.6.2" + babel-preset-current-node-syntax "^1.0.0" + +babel-preset-react-app@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-10.0.0.tgz#689b60edc705f8a70ce87f47ab0e560a317d7045" + integrity sha512-itL2z8v16khpuKutx5IH8UdCdSTuzrOhRFTEdIhveZ2i1iBKDrVE0ATa4sFVy+02GLucZNVBWtoarXBy0Msdpg== + dependencies: + "@babel/core" "7.12.3" + "@babel/plugin-proposal-class-properties" "7.12.1" + "@babel/plugin-proposal-decorators" "7.12.1" + "@babel/plugin-proposal-nullish-coalescing-operator" "7.12.1" + "@babel/plugin-proposal-numeric-separator" "7.12.1" + "@babel/plugin-proposal-optional-chaining" "7.12.1" + "@babel/plugin-transform-flow-strip-types" "7.12.1" + "@babel/plugin-transform-react-display-name" "7.12.1" + "@babel/plugin-transform-runtime" "7.12.1" + "@babel/preset-env" "7.12.1" + "@babel/preset-react" "7.12.1" + "@babel/preset-typescript" "7.12.1" + "@babel/runtime" "7.12.1" + babel-plugin-macros "2.8.0" + babel-plugin-transform-react-remove-prop-types "0.4.24" + +babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base64-js@^1.0.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +bfj@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/bfj/-/bfj-7.0.2.tgz#1988ce76f3add9ac2913fd8ba47aad9e651bfbb2" + integrity sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw== + dependencies: + bluebird "^3.5.5" + check-types "^11.1.1" + hoopy "^0.1.4" + tryer "^1.0.1" + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: + version "4.11.9" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" + integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== + +bn.js@^5.0.0, bn.js@^5.1.1: + version "5.1.3" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b" + integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ== + +body-parser@1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + dependencies: + bytes "3.1.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.7.2" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" + +bonjour@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= + dependencies: + array-flatten "^2.1.0" + deep-equal "^1.0.1" + dns-equal "^1.0.0" + dns-txt "^2.0.2" + multicast-dns "^6.0.1" + multicast-dns-service-types "^1.1.0" + +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +bootstrap@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.6.0.tgz#97b9f29ac98f98dfa43bf7468262d84392552fd7" + integrity sha512-Io55IuQY3kydzHtbGvQya3H+KorS/M9rSNyfCGCg9WZ4pyT/lCxIlpJgG1GXW/PswzC84Tr2fBYi+7+jFVQQBw== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^3.0.1, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.0.1, brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== + dependencies: + bn.js "^5.0.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" + integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== + dependencies: + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.3" + inherits "^2.0.4" + parse-asn1 "^5.1.5" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserslist@4.14.2: + version "4.14.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.2.tgz#1b3cec458a1ba87588cc5e9be62f19b6d48813ce" + integrity sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw== + dependencies: + caniuse-lite "^1.0.30001125" + electron-to-chromium "^1.3.564" + escalade "^3.0.2" + node-releases "^1.1.61" + +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.3, browserslist@^4.6.2, browserslist@^4.6.4: + version "4.16.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.3.tgz#340aa46940d7db878748567c5dea24a48ddf3717" + integrity sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw== + dependencies: + caniuse-lite "^1.0.30001181" + colorette "^1.2.1" + electron-to-chromium "^1.3.649" + escalade "^3.1.1" + node-releases "^1.1.70" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-modules@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.2.0.tgz#45d5db99e7ee5e6bc4f362e008bf917ab5049887" + integrity sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA== + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +cacache@^12.0.2: + version "12.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" + integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== + dependencies: + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" + graceful-fs "^4.1.15" + infer-owner "^1.0.3" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + +cacache@^15.0.5: + version "15.0.5" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.0.5.tgz#69162833da29170d6732334643c60e005f5f17d0" + integrity sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A== + dependencies: + "@npmcli/move-file" "^1.0.1" + chownr "^2.0.0" + fs-minipass "^2.0.0" + glob "^7.1.4" + infer-owner "^1.0.4" + lru-cache "^6.0.0" + minipass "^3.1.1" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^1.0.3" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^8.0.0" + tar "^6.0.2" + unique-filename "^1.1.1" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + +camelcase@5.3.1, camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.0.0, camelcase@^6.1.0, camelcase@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" + integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001125, caniuse-lite@^1.0.30001181: + version "1.0.30001191" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001191.tgz#bacb432b6701f690c8c5f7c680166b9a9f0843d9" + integrity sha512-xJJqzyd+7GCJXkcoBiQ1GuxEiOBCLQ0aVW9HMekifZsAVGdj5eJ4mFB9fEhSHipq9IOk/QXFJUiIr9lZT+EsGw== + +capture-exit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" + integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== + dependencies: + rsvp "^4.8.4" + +case-sensitive-paths-webpack-plugin@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz#23ac613cc9a856e4f88ff8bb73bbb5e989825cf7" + integrity sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +chalk@2.4.2, chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" + integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +check-types@^11.1.1: + version "11.1.2" + resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.1.2.tgz#86a7c12bf5539f6324eb0e70ca8896c0e38f3e2f" + integrity sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ== + +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" + integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.5.0" + optionalDependencies: + fsevents "~2.3.1" + +chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + 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" + optionalDependencies: + fsevents "^1.2.7" + +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +chrome-trace-event@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" + integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== + dependencies: + tslib "^1.9.0" + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +cjs-module-lexer@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz#4186fcca0eae175970aee870b9fe2d6cf8d5655f" + integrity sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +classnames@*, classnames@^2.2.0, classnames@^2.2.6: + version "2.3.1" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" + integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== + +clean-css@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78" + integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA== + dependencies: + source-map "~0.6.0" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + +coa@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + +collect-v8-coverage@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" + integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0, color-convert@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.5.4: + version "1.5.4" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.4.tgz#dd51cd25cfee953d138fe4002372cc3d0e504cb6" + integrity sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.0.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/color/-/color-3.1.3.tgz#ca67fb4e7b97d611dcde39eceed422067d91596e" + integrity sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ== + dependencies: + color-convert "^1.9.1" + color-string "^1.5.4" + +colorette@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" + integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +common-tags@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" + integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +compose-function@3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/compose-function/-/compose-function-3.0.3.tgz#9ed675f13cc54501d30950a486ff6a7ba3ab185f" + integrity sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8= + dependencies: + arity-n "^1.0.4" + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +compute-gcd@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/compute-gcd/-/compute-gcd-1.2.1.tgz#34d639f3825625e1357ce81f0e456a6249d8c77f" + integrity sha512-TwMbxBNz0l71+8Sc4czv13h4kEqnchV9igQZBi6QUaz09dnz13juGnnaWWJTRsP3brxOoxeB4SA2WELLw1hCtg== + dependencies: + validate.io-array "^1.0.3" + validate.io-function "^1.0.2" + validate.io-integer-array "^1.0.0" + +compute-lcm@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/compute-lcm/-/compute-lcm-1.1.2.tgz#9107c66b9dca28cefb22b4ab4545caac4034af23" + integrity sha512-OFNPdQAXnQhDSKioX8/XYT6sdUlXwpeMjfd6ApxMJfyZ4GxmLR1xvMERctlYhlHwIiz6CSpBc2+qYKjHGZw4TQ== + dependencies: + compute-gcd "^1.2.1" + validate.io-array "^1.0.3" + validate.io-function "^1.0.2" + validate.io-integer-array "^1.0.0" + +compute-scroll-into-view@^1.0.17: + version "1.0.17" + resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz#6a88f18acd9d42e9cf4baa6bec7e0522607ab7ab" + integrity sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +confusing-browser-globals@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz#30d1e7f3d1b882b25ec4933d1d1adac353d20a59" + integrity sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA== + +connect-history-api-fallback@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= + +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@1.7.0, convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +convert-source-map@^0.3.3: + version "0.3.5" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190" + integrity sha1-8dgClQr33SYxof6+BZZVDIarMZA= + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-js-compat@^3.6.2, core-js-compat@^3.8.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.9.0.tgz#29da39385f16b71e1915565aa0385c4e0963ad56" + integrity sha512-YK6fwFjCOKWwGnjFUR3c544YsnA/7DoLL0ysncuOJ4pwbriAtOpvM2bygdlcXbvQCQZ7bBU9CL4t7tGl7ETRpQ== + dependencies: + browserslist "^4.16.3" + semver "7.0.0" + +core-js-pure@^3.0.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.9.0.tgz#326cc74e1fef8b7443a6a793ddb0adfcd81f9efb" + integrity sha512-3pEcmMZC9Cq0D4ZBh3pe2HLtqxpGNJBLXF/kZ2YzK17RbKp94w0HFbdbSx8H8kAlZG5k76hvLrkPm57Uyef+kg== + +core-js@^2.4.0, core-js@^2.5.7, core-js@^2.6.5: + version "2.6.12" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== + +core-js@^3.5.0: + version "3.11.2" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.11.2.tgz#af087a43373fc6e72942917c4a4c3de43ed574d6" + integrity sha512-3tfrrO1JpJSYGKnd9LKTBPqgUES/UYiCzMKeqwR1+jF16q4kD1BY2NvqkfuzXwQ6+CIWm55V9cjD7PQd+hijdw== + +core-js@^3.6.5: + version "3.9.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.9.0.tgz#790b1bb11553a2272b36e2625c7179db345492f8" + integrity sha512-PyFBJaLq93FlyYdsndE5VaueA9K5cNB7CGzeCj191YYLhkQM0gdZR2SKihM70oF0wdqKSKClv/tEBOpoRmdOVQ== + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cosmiconfig@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + +cosmiconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" + integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.7.2" + +cosmiconfig@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3" + integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +create-ecdh@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-spawn@7.0.3, cross-spawn@^7.0.0, cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cross-spawn@^6.0.0: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +crypto-random-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= + +css-blank-pseudo@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5" + integrity sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w== + dependencies: + postcss "^7.0.5" + +css-color-names@0.0.4, css-color-names@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= + +css-declaration-sorter@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" + integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== + dependencies: + postcss "^7.0.1" + timsort "^0.3.0" + +css-has-pseudo@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz#3c642ab34ca242c59c41a125df9105841f6966ee" + integrity sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^5.0.0-rc.4" + +css-loader@4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-4.3.0.tgz#c888af64b2a5b2e85462c72c0f4a85c7e2e0821e" + integrity sha512-rdezjCjScIrsL8BSYszgT4s476IcNKt6yX69t0pHjJVnPUTDpn4WfIpDQTN3wCJvUvfsz/mFjuGOekf3PY3NUg== + dependencies: + camelcase "^6.0.0" + cssesc "^3.0.0" + icss-utils "^4.1.1" + loader-utils "^2.0.0" + postcss "^7.0.32" + postcss-modules-extract-imports "^2.0.0" + postcss-modules-local-by-default "^3.0.3" + postcss-modules-scope "^2.2.0" + postcss-modules-values "^3.0.0" + postcss-value-parser "^4.1.0" + schema-utils "^2.7.1" + semver "^7.3.2" + +css-prefers-color-scheme@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz#6f830a2714199d4f0d0d0bb8a27916ed65cff1f4" + integrity sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg== + dependencies: + postcss "^7.0.5" + +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + +css-select@^2.0.0, css-select@^2.0.2: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" + integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== + dependencies: + boolbase "^1.0.0" + css-what "^3.2.1" + domutils "^1.7.0" + nth-check "^1.0.2" + +css-tree@1.0.0-alpha.37: + version "1.0.0-alpha.37" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" + integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== + dependencies: + mdn-data "2.0.4" + source-map "^0.6.1" + +css-tree@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.2.tgz#9ae393b5dafd7dae8a622475caec78d3d8fbd7b5" + integrity sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-what@^3.2.1: + version "3.4.2" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" + integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== + +css.escape@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" + integrity sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s= + +css@^2.0.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" + integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== + dependencies: + inherits "^2.0.3" + source-map "^0.6.1" + source-map-resolve "^0.5.2" + urix "^0.1.0" + +css@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/css/-/css-3.0.0.tgz#4447a4d58fdd03367c516ca9f64ae365cee4aa5d" + integrity sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ== + dependencies: + inherits "^2.0.4" + source-map "^0.6.1" + source-map-resolve "^0.6.0" + +cssdb@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" + integrity sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ== + +cssesc@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" + integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-default@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" + integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA== + dependencies: + css-declaration-sorter "^4.0.1" + cssnano-util-raw-cache "^4.0.1" + postcss "^7.0.0" + postcss-calc "^7.0.1" + postcss-colormin "^4.0.3" + postcss-convert-values "^4.0.1" + postcss-discard-comments "^4.0.2" + postcss-discard-duplicates "^4.0.2" + postcss-discard-empty "^4.0.1" + postcss-discard-overridden "^4.0.1" + postcss-merge-longhand "^4.0.11" + postcss-merge-rules "^4.0.3" + postcss-minify-font-values "^4.0.2" + postcss-minify-gradients "^4.0.2" + postcss-minify-params "^4.0.2" + postcss-minify-selectors "^4.0.2" + postcss-normalize-charset "^4.0.1" + postcss-normalize-display-values "^4.0.2" + postcss-normalize-positions "^4.0.2" + postcss-normalize-repeat-style "^4.0.2" + postcss-normalize-string "^4.0.2" + postcss-normalize-timing-functions "^4.0.2" + postcss-normalize-unicode "^4.0.1" + postcss-normalize-url "^4.0.1" + postcss-normalize-whitespace "^4.0.2" + postcss-ordered-values "^4.1.2" + postcss-reduce-initial "^4.0.3" + postcss-reduce-transforms "^4.0.2" + postcss-svgo "^4.0.2" + postcss-unique-selectors "^4.0.1" + +cssnano-util-get-arguments@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" + integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= + +cssnano-util-get-match@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" + integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= + +cssnano-util-raw-cache@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" + integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== + dependencies: + postcss "^7.0.0" + +cssnano-util-same-parent@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" + integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== + +cssnano@^4.1.10: + version "4.1.10" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" + integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== + dependencies: + cosmiconfig "^5.0.0" + cssnano-preset-default "^4.0.7" + is-resolvable "^1.0.0" + postcss "^7.0.0" + +csso@^4.0.2: + version "4.2.0" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== + dependencies: + css-tree "^1.1.2" + +cssom@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" + integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + +csstype@^3.0.2: + version "3.0.8" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.8.tgz#d2266a792729fb227cd216fb572f43728e1ad340" + integrity sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw== + +cyclist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" + integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= + +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + +damerau-levenshtein@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz#143c1641cb3d85c60c32329e26899adea8701791" + integrity sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug== + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +data-urls@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" + integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== + dependencies: + abab "^2.0.3" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + +date-fns@^2.21.1: + version "2.21.1" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.21.1.tgz#679a4ccaa584c0706ea70b3fa92262ac3009d2b0" + integrity sha512-m1WR0xGiC6j6jNFAyW4Nvh4WxAi4JF4w9jRJwSI8nBmNcyZXPcP9VUQG+6gHQXAmqaGEKDKhOqAtENDC941UkA== + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.1.1, debug@^3.2.6: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + dependencies: + ms "2.1.2" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decimal.js@^10.2.0: + version "10.2.1" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.1.tgz#238ae7b0f0c793d3e3cea410108b35a2c01426a3" + integrity sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw== + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= + +deep-equal@^1.0.1, deep-equal@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== + dependencies: + 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" + +deep-is@^0.1.3, deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +deep-object-diff@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/deep-object-diff/-/deep-object-diff-1.1.0.tgz#d6fabf476c2ed1751fc94d5ca693d2ed8c18bc5a" + integrity sha512-b+QLs5vHgS+IoSNcUE4n9HP2NwcHj7aqnJWsjPtuG75Rh5TOaGt0OjAYInh77d5T16V5cRDC+Pw/6ZZZiETBGw== + +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + +default-gateway@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" + integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== + dependencies: + execa "^1.0.0" + ip-regex "^2.1.0" + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +del@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" + integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== + dependencies: + "@types/glob" "^7.1.1" + globby "^6.1.0" + is-path-cwd "^2.0.0" + is-path-in-cwd "^2.0.0" + p-map "^2.0.0" + pify "^4.0.1" + rimraf "^2.6.3" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +des.js@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +detect-node@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" + integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== + +detect-port-alt@1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" + integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== + dependencies: + address "^1.0.1" + debug "^2.6.0" + +diff-sequences@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" + integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= + +dns-packet@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a" + integrity sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg== + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= + dependencies: + buffer-indexof "^1.0.0" + +doctrine@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-accessibility-api@^0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.4.tgz#b06d059cdd4a4ad9a79275f9d414a5c126241166" + integrity sha512-TvrjBckDy2c6v6RLxPv5QXOnU+SmF9nBII5621Ve5fu6Z/BDrENurBEvlC1f44lKEUVqOpK4w9E5Idc5/EgkLQ== + +dom-converter@^0.2: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + +dom-helpers@^5.0.1, dom-helpers@^5.1.2, dom-helpers@^5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" + integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^3.0.2" + +dom-serializer@0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +domelementtype@1, domelementtype@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domelementtype@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.1.0.tgz#a851c080a6d1c3d94344aed151d99f669edf585e" + integrity sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w== + +domexception@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" + integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== + dependencies: + webidl-conversions "^5.0.0" + +domhandler@^2.3.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" + integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== + dependencies: + domelementtype "1" + +domutils@^1.5.1, domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +dot-prop@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + +dotenv-expand@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" + integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== + +dotenv@8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" + integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== + +duplexer@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +ejs@^2.6.1: + version "2.7.4" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" + integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== + +electron-to-chromium@^1.3.564, electron-to-chromium@^1.3.649: + version "1.3.671" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.671.tgz#8feaed6eae42d279fa4611f58c42a5a1eb81b2a0" + integrity sha512-RTD97QkdrJKaKwRv9h/wGAaoR2lGxNXEcBXS31vjitgTPwTWAbLdS7cEsBK68eEQy7p6YyT8D5BxBEYHu2SuwQ== + +elliptic@^6.5.3: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emittery@^0.7.1: + version "0.7.2" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.2.tgz#25595908e13af0f5674ab419396e2fb394cdfa82" + integrity sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ== + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.0.0: + version "9.2.1" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.1.tgz#c9b25604256bb3428964bead3ab63069d736f7ee" + integrity sha512-117l1H6U4X3Krn+MrzYrL57d5H7siRHWraBs7s+LjRuFK7Fe7hJqnJ0skWlinqsycVLU5YAo6L8CsEYQ0V5prg== + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@^4.3.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" + integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + +enquirer@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + +entities@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +errno@^0.1.3, errno@~0.1.7: + version "0.1.8" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== + dependencies: + prr "~1.0.1" + +error-ex@^1.2.0, error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +error-stack-parser@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.6.tgz#5a99a707bd7a4c58a797902d48d82803ede6aad8" + integrity sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ== + dependencies: + stackframe "^1.1.1" + +es-abstract@^1.17.2: + version "1.17.7" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.7.tgz#a4de61b2f66989fc7421676c1cb9787573ace54c" + integrity sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.2.2" + is-regex "^1.1.1" + object-inspect "^1.8.0" + object-keys "^1.1.1" + object.assign "^4.1.1" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" + +es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2: + version "1.18.0-next.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.2.tgz#088101a55f0541f595e7e057199e27ddc8f3a5c2" + integrity sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.2.2" + is-negative-zero "^2.0.1" + is-regex "^1.1.1" + object-inspect "^1.9.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.3" + string.prototype.trimstart "^1.0.3" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es5-ext@^0.10.35, es5-ext@^0.10.50: + version "0.10.53" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" + integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.3" + next-tick "~1.0.0" + +es6-iterator@2.0.3, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-symbol@^3.1.1, es6-symbol@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + dependencies: + d "^1.0.1" + ext "^1.1.2" + +escalade@^3.0.2, escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@2.0.0, escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escodegen@^1.14.1: + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +eslint-config-react-app@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-6.0.0.tgz#ccff9fc8e36b322902844cbd79197982be355a0e" + integrity sha512-bpoAAC+YRfzq0dsTk+6v9aHm/uqnDwayNAXleMypGl6CpxI9oXXscVHo4fk3eJPIn+rsbtNetB4r/ZIidFIE8A== + dependencies: + confusing-browser-globals "^1.0.10" + +eslint-import-resolver-node@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" + integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== + dependencies: + debug "^2.6.9" + resolve "^1.13.1" + +eslint-module-utils@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" + integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== + dependencies: + debug "^2.6.9" + pkg-dir "^2.0.0" + +eslint-plugin-flowtype@^5.2.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.2.2.tgz#c6e5dd2fad4e757a1c63e652da6cff597659554f" + integrity sha512-C4PlPYpszr9h1cBfUbTNRI1IdxUCF0qrXAHkXS2+bESp7WUUCnvb3UBBnYlaQLvJYJ2lRz+2SPQQ/WyV7p/Tow== + dependencies: + lodash "^4.17.15" + string-natural-compare "^3.0.1" + +eslint-plugin-import@^2.22.1: + version "2.22.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz#0896c7e6a0cf44109a2d97b95903c2bb689d7702" + integrity sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw== + dependencies: + array-includes "^3.1.1" + array.prototype.flat "^1.2.3" + contains-path "^0.1.0" + debug "^2.6.9" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.4" + eslint-module-utils "^2.6.0" + has "^1.0.3" + minimatch "^3.0.4" + object.values "^1.1.1" + read-pkg-up "^2.0.0" + resolve "^1.17.0" + tsconfig-paths "^3.9.0" + +eslint-plugin-jest@^24.1.0: + version "24.1.5" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-24.1.5.tgz#1e866a9f0deac587d0a3d5d7cefe99815a580de2" + integrity sha512-FIP3lwC8EzEG+rOs1y96cOJmMVpdFNreoDJv29B5vIupVssRi8zrSY3QadogT0K3h1Y8TMxJ6ZSAzYUmFCp2hg== + dependencies: + "@typescript-eslint/experimental-utils" "^4.0.1" + +eslint-plugin-jsx-a11y@^6.3.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz#a2d84caa49756942f42f1ffab9002436391718fd" + integrity sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg== + dependencies: + "@babel/runtime" "^7.11.2" + aria-query "^4.2.2" + array-includes "^3.1.1" + ast-types-flow "^0.0.7" + axe-core "^4.0.2" + axobject-query "^2.2.0" + damerau-levenshtein "^1.0.6" + emoji-regex "^9.0.0" + has "^1.0.3" + jsx-ast-utils "^3.1.0" + language-tags "^1.0.5" + +eslint-plugin-react-hooks@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz#8c229c268d468956334c943bb45fc860280f5556" + integrity sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ== + +eslint-plugin-react@^7.21.5: + version "7.22.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.22.0.tgz#3d1c542d1d3169c45421c1215d9470e341707269" + integrity sha512-p30tuX3VS+NWv9nQot9xIGAHBXR0+xJVaZriEsHoJrASGCJZDJ8JLNM0YqKqI0AKm6Uxaa1VUHoNEibxRCMQHA== + dependencies: + array-includes "^3.1.1" + array.prototype.flatmap "^1.2.3" + doctrine "^2.1.0" + has "^1.0.3" + jsx-ast-utils "^2.4.1 || ^3.0.0" + object.entries "^1.1.2" + object.fromentries "^2.0.2" + object.values "^1.1.1" + prop-types "^15.7.2" + resolve "^1.18.1" + string.prototype.matchall "^4.0.2" + +eslint-plugin-testing-library@^3.9.2: + version "3.10.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-3.10.1.tgz#4dd02306d601c3238fdabf1d1dbc5f2a8e85d531" + integrity sha512-nQIFe2muIFv2oR2zIuXE4vTbcFNx8hZKRzgHZqJg8rfopIWwoTwtlbCCNELT/jXzVe1uZF68ALGYoDXjLczKiQ== + dependencies: + "@typescript-eslint/experimental-utils" "^3.10.1" + +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-scope@^5.0.0, eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-utils@^2.0.0, eslint-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" + integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== + +eslint-webpack-plugin@^2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/eslint-webpack-plugin/-/eslint-webpack-plugin-2.5.2.tgz#4ee17577d6392bf72048080a1678d6237183db81" + integrity sha512-ndD9chZ/kaGnjjx7taRg7c6FK/YKb29SSYzaLtPBIYLYJQmZtuKqtQbAvTS2ymiMQT6X0VW9vZIHK0KLstv93Q== + dependencies: + "@types/eslint" "^7.2.6" + arrify "^2.0.1" + jest-worker "^26.6.2" + micromatch "^4.0.2" + schema-utils "^3.0.0" + +eslint@^7.11.0: + version "7.20.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.20.0.tgz#db07c4ca4eda2e2316e7aa57ac7fc91ec550bdc7" + integrity sha512-qGi0CTcOGP2OtCQBgWZlQjcTuP0XkIpYFj25XtRTQSHC+umNnp7UMshr2G8SLsRFYDdAPFeHOsiteadmMH02Yw== + dependencies: + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.3.0" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + doctrine "^3.0.0" + enquirer "^2.3.5" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.4.0" + esutils "^2.0.2" + file-entry-cache "^6.0.0" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash "^4.17.20" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + progress "^2.0.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^6.0.4" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^7.3.0, espree@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== + dependencies: + acorn "^7.4.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^1.3.0" + +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.1.0, esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1, estraverse@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + +estree-walker@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" + integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== + +estree-walker@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" + integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379" + integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg== + +eventsource@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0" + integrity sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ== + dependencies: + original "^1.0.0" + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +exec-sh@^0.3.2: + version "0.3.4" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5" + integrity sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A== + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.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" + +execa@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expect@^26.6.0, expect@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/expect/-/expect-26.6.2.tgz#c6b996bf26bf3fe18b67b2d0f51fc981ba934417" + integrity sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA== + dependencies: + "@jest/types" "^26.6.2" + ansi-styles "^4.0.0" + jest-get-type "^26.3.0" + jest-matcher-utils "^26.6.2" + jest-message-util "^26.6.2" + jest-regex-util "^26.0.0" + +express@^4.17.1: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.0" + content-disposition "0.5.3" + content-type "~1.0.4" + cookie "0.4.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +ext@^1.1.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244" + integrity sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A== + dependencies: + type "^2.0.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.1.1: + version "3.2.5" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661" + integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + picomatch "^2.2.1" + +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fastq@^1.6.0: + version "1.10.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.10.1.tgz#8b8f2ac8bf3632d67afcd65dac248d5fdc45385e" + integrity sha512-AWuv6Ery3pM+dY7LYS8YIaCiQvUaos9OB1RyNgaOWnaX+Tik7Onvcsf8x8c+YtDeT0maYLniBip2hox5KtEXXA== + dependencies: + reusify "^1.0.4" + +faye-websocket@^0.11.3: + version "0.11.3" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e" + integrity sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA== + dependencies: + websocket-driver ">=0.5.1" + +fb-watchman@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" + integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== + dependencies: + bser "2.1.1" + +figgy-pudding@^3.5.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" + integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== + +file-entry-cache@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +file-loader@6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.1.1.tgz#a6f29dfb3f5933a1c350b2dbaa20ac5be0539baa" + integrity sha512-Klt8C4BjWSXYQAfhpYYkG4qHNTna4toMHEbWrI5IuVoxbU6uiDKeKAP99R8mmbJi3lvewn/jQBOgU4+NS3tDQw== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +file-saver@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/file-saver/-/file-saver-2.0.5.tgz#d61cfe2ce059f414d899e9dd6d4107ee25670c38" + integrity sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA== + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +filesize@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.1.0.tgz#e81bdaa780e2451d714d71c0d7a4f3238d37ad00" + integrity sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +filter-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" + integrity sha1-mzERErxsYSehbgFsbF1/GeCAXFs= + +finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-cache-dir@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" + integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-up@4.1.0, find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.1.tgz#c4b489e80096d9df1dfc97c79871aea7c617c469" + integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== + +flatten@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" + integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== + +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + +follow-redirects@^1.0.0: + version "1.13.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.2.tgz#dd73c8effc12728ba5cf4259d760ea5fb83e3147" + integrity sha512-6mPTgLxYm3r6Bkkg0vNM0HTjfGrOEtsfbhagQvbxDEsEkpNhw582upBaoRZylzen6krEmxXJgt9Ju6HiI4O7BA== + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +fork-ts-checker-webpack-plugin@4.1.6: + version "4.1.6" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz#5055c703febcf37fa06405d400c122b905167fc5" + integrity sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw== + dependencies: + "@babel/code-frame" "^7.5.5" + chalk "^2.4.1" + micromatch "^3.1.10" + minimatch "^3.0.4" + semver "^5.6.0" + tapable "^1.0.0" + worker-rpc "^0.1.0" + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-extra@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.2.7: + version "1.2.13" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +fsevents@^2.1.2, fsevents@^2.1.3, fsevents@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +gensync@^1.0.0-beta.1: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== + dependencies: + is-glob "^4.0.1" + +glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-modules@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^12.1.0: + version "12.4.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" + integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== + dependencies: + type-fest "^0.8.1" + +globby@11.0.1: + version "11.0.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" + integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + +globby@^11.0.1: + version "11.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.2.tgz#1af538b766a3b540ebfb58a32b2e2d5897321d83" + integrity sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: + version "4.2.6" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" + integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== + +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= + +gud@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0" + integrity sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw== + +gzip-size@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" + integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA== + dependencies: + duplexer "^0.1.1" + pify "^4.0.1" + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + +harmony-reflect@^1.4.6: + version "1.6.1" + resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.1.tgz#c108d4f2bb451efef7a37861fdbdae72c9bdefa9" + integrity sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.0, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hex-color-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== + +history@^4.9.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" + integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== + dependencies: + "@babel/runtime" "^7.1.2" + loose-envify "^1.2.0" + resolve-pathname "^3.0.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + value-equal "^1.0.1" + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hoist-non-react-statics@^3.1.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +hoopy@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" + integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== + +hosted-git-info@^2.1.4: + version "2.8.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" + integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +hsl-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= + +hsla-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= + +html-comment-regex@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" + integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== + +html-encoding-sniffer@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" + integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== + dependencies: + whatwg-encoding "^1.0.5" + +html-entities@^1.2.1, html-entities@^1.3.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" + integrity sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA== + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +html-minifier-terser@^5.0.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#922e96f1f3bb60832c2634b79884096389b1f054" + integrity sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg== + dependencies: + camel-case "^4.1.1" + clean-css "^4.2.3" + commander "^4.1.1" + he "^1.2.0" + param-case "^3.0.3" + relateurl "^0.2.7" + terser "^4.6.3" + +html-webpack-plugin@4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz#625097650886b97ea5dae331c320e3238f6c121c" + integrity sha512-MouoXEYSjTzCrjIxWwg8gxL5fE2X2WZJLmBYXlaJhQUH5K/b5OrqmV7T4dB7iu0xkmJ6JlUuV6fFVtnqbPopZw== + dependencies: + "@types/html-minifier-terser" "^5.0.0" + "@types/tapable" "^1.0.5" + "@types/webpack" "^4.41.8" + html-minifier-terser "^5.0.1" + loader-utils "^1.2.3" + lodash "^4.17.15" + pretty-error "^2.1.1" + tapable "^1.1.3" + util.promisify "1.0.0" + +htmlparser2@^3.10.1: + version "3.10.1" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" + integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== + dependencies: + domelementtype "^1.3.1" + domhandler "^2.3.0" + domutils "^1.5.1" + entities "^1.1.1" + inherits "^2.0.1" + readable-stream "^3.1.1" + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= + +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-parser-js@>=0.5.1: + version "0.5.3" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.3.tgz#01d2709c79d41698bb01d4decc5e9da4e4a033d9" + integrity sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg== + +http-proxy-middleware@0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" + integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== + dependencies: + http-proxy "^1.17.0" + is-glob "^4.0.0" + lodash "^4.17.11" + micromatch "^3.1.10" + +http-proxy-middleware@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-1.2.0.tgz#87776ea3d4d8dda3dc2594a076787bbc6fe4d995" + integrity sha512-vNw+AxT0+6VTM1rCJw1bpiIaUQ1Ww/vTyIEOUzdW9kNX4yuhhqV3jLSKDJo/Y/lqEIshaKCDujtvEqWiD9Dn6Q== + dependencies: + "@types/http-proxy" "^1.17.5" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy@^1.17.0, http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-utils@^4.0.0, icss-utils@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" + integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== + dependencies: + postcss "^7.0.14" + +identity-obj-proxy@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14" + integrity sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ= + dependencies: + harmony-reflect "^1.4.6" + +ieee754@^1.1.4: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.1.4: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== + +immer@8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/immer/-/immer-8.0.1.tgz#9c73db683e2b3975c424fb0572af5889877ae656" + integrity sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA== + +import-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" + integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk= + dependencies: + import-from "^2.1.0" + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-from@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" + integrity sha1-M1238qev/VOqpHHUuAId7ja387E= + dependencies: + resolve-from "^3.0.0" + +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + +import-local@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" + integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + +infer-owner@^1.0.3, infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@^1.3.5: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +internal-ip@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" + integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== + dependencies: + default-gateway "^4.2.0" + ipaddr.js "^1.9.0" + +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + +invariant@^2.2.1, invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= + +ip@^1.1.0, ip@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + +ipaddr.js@1.9.1, ipaddr.js@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= + +is-absolute-url@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" + integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arguments@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.0.tgz#62353031dfbee07ceb34656a6bde59efecae8dd9" + integrity sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg== + dependencies: + call-bind "^1.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-callable@^1.1.4, is-callable@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" + integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-color-stop@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= + dependencies: + css-color-names "^0.0.4" + hex-color-regex "^1.1.0" + hsl-regex "^1.0.0" + hsla-regex "^1.0.0" + rgb-regex "^1.0.1" + rgba-regex "^1.0.0" + +is-core-module@^2.0.0, is-core-module@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" + integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== + dependencies: + has "^1.0.3" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= + +is-docker@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156" + integrity sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw== + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= + +is-negative-zero@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-path-cwd@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-in-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" + integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== + dependencies: + is-path-inside "^2.1.0" + +is-path-inside@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" + integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== + dependencies: + path-is-inside "^1.0.2" + +is-plain-obj@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-potential-custom-element-name@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz#0c52e54bcca391bb2c494b21e8626d7336c6e397" + integrity sha1-DFLlS8yjkbssSUsh6GJtczbG45c= + +is-regex@^1.0.4, is-regex@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.2.tgz#81c8ebde4db142f2cf1c53fc86d6a45788266251" + integrity sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg== + dependencies: + call-bind "^1.0.2" + has-symbols "^1.0.1" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= + +is-resolvable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== + +is-root@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" + integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + +is-string@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" + integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== + +is-svg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" + integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ== + dependencies: + html-comment-regex "^1.1.0" + +is-symbol@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + dependencies: + has-symbols "^1.0.1" + +is-typedarray@^1.0.0, is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +is-wsl@^2.1.1, is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +istanbul-lib-coverage@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" + integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== + +istanbul-lib-instrument@^4.0.0, istanbul-lib-instrument@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" + integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== + dependencies: + "@babel/core" "^7.7.5" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.0.0" + semver "^6.3.0" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" + integrity sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" + integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jest-changed-files@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.6.2.tgz#f6198479e1cc66f22f9ae1e22acaa0b429c042d0" + integrity sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ== + dependencies: + "@jest/types" "^26.6.2" + execa "^4.0.0" + throat "^5.0.0" + +jest-circus@26.6.0: + version "26.6.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-26.6.0.tgz#7d9647b2e7f921181869faae1f90a2629fd70705" + integrity sha512-L2/Y9szN6FJPWFK8kzWXwfp+FOR7xq0cUL4lIsdbIdwz3Vh6P1nrpcqOleSzr28zOtSHQNV9Z7Tl+KkuK7t5Ng== + dependencies: + "@babel/traverse" "^7.1.0" + "@jest/environment" "^26.6.0" + "@jest/test-result" "^26.6.0" + "@jest/types" "^26.6.0" + "@types/babel__traverse" "^7.0.4" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + expect "^26.6.0" + is-generator-fn "^2.0.0" + jest-each "^26.6.0" + jest-matcher-utils "^26.6.0" + jest-message-util "^26.6.0" + jest-runner "^26.6.0" + jest-runtime "^26.6.0" + jest-snapshot "^26.6.0" + jest-util "^26.6.0" + pretty-format "^26.6.0" + stack-utils "^2.0.2" + throat "^5.0.0" + +jest-cli@^26.6.0: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-26.6.3.tgz#43117cfef24bc4cd691a174a8796a532e135e92a" + integrity sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg== + dependencies: + "@jest/core" "^26.6.3" + "@jest/test-result" "^26.6.2" + "@jest/types" "^26.6.2" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.4" + import-local "^3.0.2" + is-ci "^2.0.0" + jest-config "^26.6.3" + jest-util "^26.6.2" + jest-validate "^26.6.2" + prompts "^2.0.1" + yargs "^15.4.1" + +jest-config@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-26.6.3.tgz#64f41444eef9eb03dc51d5c53b75c8c71f645349" + integrity sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg== + dependencies: + "@babel/core" "^7.1.0" + "@jest/test-sequencer" "^26.6.3" + "@jest/types" "^26.6.2" + babel-jest "^26.6.3" + chalk "^4.0.0" + deepmerge "^4.2.2" + glob "^7.1.1" + graceful-fs "^4.2.4" + jest-environment-jsdom "^26.6.2" + jest-environment-node "^26.6.2" + jest-get-type "^26.3.0" + jest-jasmine2 "^26.6.3" + jest-regex-util "^26.0.0" + jest-resolve "^26.6.2" + jest-util "^26.6.2" + jest-validate "^26.6.2" + micromatch "^4.0.2" + pretty-format "^26.6.2" + +jest-diff@^26.0.0, jest-diff@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394" + integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA== + dependencies: + chalk "^4.0.0" + diff-sequences "^26.6.2" + jest-get-type "^26.3.0" + pretty-format "^26.6.2" + +jest-docblock@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-26.0.0.tgz#3e2fa20899fc928cb13bd0ff68bd3711a36889b5" + integrity sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w== + dependencies: + detect-newline "^3.0.0" + +jest-each@^26.6.0, jest-each@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-26.6.2.tgz#02526438a77a67401c8a6382dfe5999952c167cb" + integrity sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A== + dependencies: + "@jest/types" "^26.6.2" + chalk "^4.0.0" + jest-get-type "^26.3.0" + jest-util "^26.6.2" + pretty-format "^26.6.2" + +jest-environment-jsdom@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz#78d09fe9cf019a357009b9b7e1f101d23bd1da3e" + integrity sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q== + dependencies: + "@jest/environment" "^26.6.2" + "@jest/fake-timers" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + jest-mock "^26.6.2" + jest-util "^26.6.2" + jsdom "^16.4.0" + +jest-environment-node@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-26.6.2.tgz#824e4c7fb4944646356f11ac75b229b0035f2b0c" + integrity sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag== + dependencies: + "@jest/environment" "^26.6.2" + "@jest/fake-timers" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + jest-mock "^26.6.2" + jest-util "^26.6.2" + +jest-get-type@^26.3.0: + version "26.3.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" + integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== + +jest-haste-map@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.6.2.tgz#dd7e60fe7dc0e9f911a23d79c5ff7fb5c2cafeaa" + integrity sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w== + dependencies: + "@jest/types" "^26.6.2" + "@types/graceful-fs" "^4.1.2" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.4" + jest-regex-util "^26.0.0" + jest-serializer "^26.6.2" + jest-util "^26.6.2" + jest-worker "^26.6.2" + micromatch "^4.0.2" + sane "^4.0.3" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.1.2" + +jest-jasmine2@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz#adc3cf915deacb5212c93b9f3547cd12958f2edd" + integrity sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg== + dependencies: + "@babel/traverse" "^7.1.0" + "@jest/environment" "^26.6.2" + "@jest/source-map" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + expect "^26.6.2" + is-generator-fn "^2.0.0" + jest-each "^26.6.2" + jest-matcher-utils "^26.6.2" + jest-message-util "^26.6.2" + jest-runtime "^26.6.3" + jest-snapshot "^26.6.2" + jest-util "^26.6.2" + pretty-format "^26.6.2" + throat "^5.0.0" + +jest-leak-detector@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz#7717cf118b92238f2eba65054c8a0c9c653a91af" + integrity sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg== + dependencies: + jest-get-type "^26.3.0" + pretty-format "^26.6.2" + +jest-matcher-utils@^26.6.0, jest-matcher-utils@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz#8e6fd6e863c8b2d31ac6472eeb237bc595e53e7a" + integrity sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw== + dependencies: + chalk "^4.0.0" + jest-diff "^26.6.2" + jest-get-type "^26.3.0" + pretty-format "^26.6.2" + +jest-message-util@^26.6.0, jest-message-util@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.6.2.tgz#58173744ad6fc0506b5d21150b9be56ef001ca07" + integrity sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA== + dependencies: + "@babel/code-frame" "^7.0.0" + "@jest/types" "^26.6.2" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.4" + micromatch "^4.0.2" + pretty-format "^26.6.2" + slash "^3.0.0" + stack-utils "^2.0.2" + +jest-mock@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-26.6.2.tgz#d6cb712b041ed47fe0d9b6fc3474bc6543feb302" + integrity sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew== + dependencies: + "@jest/types" "^26.6.2" + "@types/node" "*" + +jest-pnp-resolver@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" + integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== + +jest-regex-util@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" + integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== + +jest-resolve-dependencies@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz#6680859ee5d22ee5dcd961fe4871f59f4c784fb6" + integrity sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg== + dependencies: + "@jest/types" "^26.6.2" + jest-regex-util "^26.0.0" + jest-snapshot "^26.6.2" + +jest-resolve@26.6.0: + version "26.6.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.6.0.tgz#070fe7159af87b03e50f52ea5e17ee95bbee40e1" + integrity sha512-tRAz2bwraHufNp+CCmAD8ciyCpXCs1NQxB5EJAmtCFy6BN81loFEGWKzYu26Y62lAJJe4X4jg36Kf+NsQyiStQ== + dependencies: + "@jest/types" "^26.6.0" + chalk "^4.0.0" + graceful-fs "^4.2.4" + jest-pnp-resolver "^1.2.2" + jest-util "^26.6.0" + read-pkg-up "^7.0.1" + resolve "^1.17.0" + slash "^3.0.0" + +jest-resolve@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.6.2.tgz#a3ab1517217f469b504f1b56603c5bb541fbb507" + integrity sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ== + dependencies: + "@jest/types" "^26.6.2" + chalk "^4.0.0" + graceful-fs "^4.2.4" + jest-pnp-resolver "^1.2.2" + jest-util "^26.6.2" + read-pkg-up "^7.0.1" + resolve "^1.18.1" + slash "^3.0.0" + +jest-runner@^26.6.0, jest-runner@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-26.6.3.tgz#2d1fed3d46e10f233fd1dbd3bfaa3fe8924be159" + integrity sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ== + dependencies: + "@jest/console" "^26.6.2" + "@jest/environment" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.7.1" + exit "^0.1.2" + graceful-fs "^4.2.4" + jest-config "^26.6.3" + jest-docblock "^26.0.0" + jest-haste-map "^26.6.2" + jest-leak-detector "^26.6.2" + jest-message-util "^26.6.2" + jest-resolve "^26.6.2" + jest-runtime "^26.6.3" + jest-util "^26.6.2" + jest-worker "^26.6.2" + source-map-support "^0.5.6" + throat "^5.0.0" + +jest-runtime@^26.6.0, jest-runtime@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-26.6.3.tgz#4f64efbcfac398331b74b4b3c82d27d401b8fa2b" + integrity sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw== + dependencies: + "@jest/console" "^26.6.2" + "@jest/environment" "^26.6.2" + "@jest/fake-timers" "^26.6.2" + "@jest/globals" "^26.6.2" + "@jest/source-map" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/transform" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + cjs-module-lexer "^0.6.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.4" + jest-config "^26.6.3" + jest-haste-map "^26.6.2" + jest-message-util "^26.6.2" + jest-mock "^26.6.2" + jest-regex-util "^26.0.0" + jest-resolve "^26.6.2" + jest-snapshot "^26.6.2" + jest-util "^26.6.2" + jest-validate "^26.6.2" + slash "^3.0.0" + strip-bom "^4.0.0" + yargs "^15.4.1" + +jest-serializer@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.6.2.tgz#d139aafd46957d3a448f3a6cdabe2919ba0742d1" + integrity sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g== + dependencies: + "@types/node" "*" + graceful-fs "^4.2.4" + +jest-snapshot@^26.6.0, jest-snapshot@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-26.6.2.tgz#f3b0af1acb223316850bd14e1beea9837fb39c84" + integrity sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og== + dependencies: + "@babel/types" "^7.0.0" + "@jest/types" "^26.6.2" + "@types/babel__traverse" "^7.0.4" + "@types/prettier" "^2.0.0" + chalk "^4.0.0" + expect "^26.6.2" + graceful-fs "^4.2.4" + jest-diff "^26.6.2" + jest-get-type "^26.3.0" + jest-haste-map "^26.6.2" + jest-matcher-utils "^26.6.2" + jest-message-util "^26.6.2" + jest-resolve "^26.6.2" + natural-compare "^1.4.0" + pretty-format "^26.6.2" + semver "^7.3.2" + +jest-util@^26.6.0, jest-util@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.6.2.tgz#907535dbe4d5a6cb4c47ac9b926f6af29576cbc1" + integrity sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q== + dependencies: + "@jest/types" "^26.6.2" + "@types/node" "*" + chalk "^4.0.0" + graceful-fs "^4.2.4" + is-ci "^2.0.0" + micromatch "^4.0.2" + +jest-validate@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.6.2.tgz#23d380971587150467342911c3d7b4ac57ab20ec" + integrity sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ== + dependencies: + "@jest/types" "^26.6.2" + camelcase "^6.0.0" + chalk "^4.0.0" + jest-get-type "^26.3.0" + leven "^3.1.0" + pretty-format "^26.6.2" + +jest-watch-typeahead@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/jest-watch-typeahead/-/jest-watch-typeahead-0.6.1.tgz#45221b86bb6710b7e97baaa1640ae24a07785e63" + integrity sha512-ITVnHhj3Jd/QkqQcTqZfRgjfyRhDFM/auzgVo2RKvSwi18YMvh0WvXDJFoFED6c7jd/5jxtu4kSOb9PTu2cPVg== + dependencies: + ansi-escapes "^4.3.1" + chalk "^4.0.0" + jest-regex-util "^26.0.0" + jest-watcher "^26.3.0" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + +jest-watcher@^26.3.0, jest-watcher@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-26.6.2.tgz#a5b683b8f9d68dbcb1d7dae32172d2cca0592975" + integrity sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ== + dependencies: + "@jest/test-result" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + jest-util "^26.6.2" + string-length "^4.0.1" + +jest-worker@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" + integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== + dependencies: + merge-stream "^2.0.0" + supports-color "^6.1.0" + +jest-worker@^26.5.0, jest-worker@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" + integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^7.0.0" + +jest@26.6.0: + version "26.6.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-26.6.0.tgz#546b25a1d8c888569dbbe93cae131748086a4a25" + integrity sha512-jxTmrvuecVISvKFFhOkjsWRZV7sFqdSUAd1ajOKY+/QE/aLBVstsJ/dX8GczLzwiT6ZEwwmZqtCUHLHHQVzcfA== + dependencies: + "@jest/core" "^26.6.0" + import-local "^3.0.2" + jest-cli "^26.6.0" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsdom@^16.4.0: + version "16.4.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.4.0.tgz#36005bde2d136f73eee1a830c6d45e55408edddb" + integrity sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w== + dependencies: + abab "^2.0.3" + acorn "^7.1.1" + acorn-globals "^6.0.0" + cssom "^0.4.4" + cssstyle "^2.2.0" + data-urls "^2.0.0" + decimal.js "^10.2.0" + domexception "^2.0.1" + escodegen "^1.14.1" + html-encoding-sniffer "^2.0.1" + is-potential-custom-element-name "^1.0.0" + nwsapi "^2.2.0" + parse5 "5.1.1" + request "^2.88.2" + request-promise-native "^1.0.8" + saxes "^5.0.0" + symbol-tree "^3.2.4" + tough-cookie "^3.0.1" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^2.0.0" + webidl-conversions "^6.1.0" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + ws "^7.2.3" + xml-name-validator "^3.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-compare@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/json-schema-compare/-/json-schema-compare-0.2.2.tgz#dd601508335a90c7f4cfadb6b2e397225c908e56" + integrity sha512-c4WYmDKyJXhs7WWvAWm3uIYnfyWFoIp+JEoX34rctVvEkMYCPGhXtvmFFXiffBbxfZsvQ0RNnV5H7GvDF5HCqQ== + dependencies: + lodash "^4.17.4" + +json-schema-merge-allof@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/json-schema-merge-allof/-/json-schema-merge-allof-0.6.0.tgz#64d48820fec26b228db837475ce3338936bf59a5" + integrity sha512-LEw4VMQVRceOPLuGRWcxW5orTTiR9ZAtqTAe4rQUjNADTeR81bezBVFa0MqIwp0YmHIM1KkhSjZM7o+IQhaPbQ== + dependencies: + compute-lcm "^1.1.0" + json-schema-compare "^0.2.2" + lodash "^4.17.4" + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json3@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" + integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== + dependencies: + minimist "^1.2.5" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonpointer@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.1.0.tgz#501fb89986a2389765ba09e6053299ceb4f2c2cc" + integrity sha512-CXcRvMyTlnR53xMcKnuMzfCA5i/nfblTnnr74CZb6C4vG39eu6w51t7nKmU5MfLfbTgGItliNyjO/ciNPDqClg== + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz#41108d2cec408c3453c1bbe8a4aae9e1e2bd8f82" + integrity sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q== + dependencies: + array-includes "^3.1.2" + object.assign "^4.1.2" + +killable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" + integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +klona@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.4.tgz#7bb1e3affb0cb8624547ef7e8f6708ea2e39dfc0" + integrity sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA== + +language-subtag-registry@~0.3.2: + version "0.3.21" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz#04ac218bea46f04cb039084602c6da9e788dd45a" + integrity sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg== + +language-tags@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" + integrity sha1-0yHbxNowuovzAk4ED6XBRmH5GTo= + dependencies: + language-subtag-registry "~0.3.2" + +last-call-webpack-plugin@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" + integrity sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w== + dependencies: + lodash "^4.17.5" + webpack-sources "^1.1.0" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +loader-runner@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== + +loader-utils@1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + +loader-utils@2.0.0, loader-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" + integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash-es@^4.17.20: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== + +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + +lodash.template@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" + integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.templatesettings "^4.0.0" + +lodash.templatesettings@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" + integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== + dependencies: + lodash._reinterpolate "^3.0.0" + +lodash.throttle@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" + integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ= + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + +"lodash@>=3.5 <5", lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.17.5: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +loglevel@^1.6.8: + version "1.7.1" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" + integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lz-string@^1.4.4: + version "1.4.4" + resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" + integrity sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY= + +magic-string@^0.25.0, magic-string@^0.25.7: + version "0.25.7" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" + integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== + dependencies: + sourcemap-codec "^1.4.4" + +make-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-dir@^3.0.0, make-dir@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= + dependencies: + tmpl "1.0.x" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + +mdn-data@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +memory-fs@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +microevent.ts@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/microevent.ts/-/microevent.ts-0.1.1.tgz#70b09b83f43df5172d0205a63025bce0f7357fa0" + integrity sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g== + +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +micromatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.46.0, "mime-db@>= 1.43.0 < 2": + version "1.46.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.46.0.tgz#6267748a7f799594de3cbc8cde91def349661cee" + integrity sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ== + +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: + version "2.1.29" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.29.tgz#1d4ab77da64b91f5f72489df29236563754bb1b2" + integrity sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ== + dependencies: + mime-db "1.46.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.4.4: + version "2.5.2" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe" + integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +mini-create-react-context@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz#072171561bfdc922da08a60c2197a497cc2d1d5e" + integrity sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ== + dependencies: + "@babel/runtime" "^7.12.1" + tiny-warning "^1.0.3" + +mini-css-extract-plugin@0.11.3: + version "0.11.3" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.11.3.tgz#15b0910a7f32e62ffde4a7430cfefbd700724ea6" + integrity sha512-n9BA8LonkOkW1/zn+IbLPQmovsL0wMb9yx75fMJQZf2X1Zoec9yTZtyMePcyu19wPkmFbzZZA6fLTotpFhQsOA== + dependencies: + loader-utils "^1.1.0" + normalize-url "1.9.1" + schema-utils "^1.0.0" + webpack-sources "^1.1.0" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +minimatch@3.0.4, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.2: + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass@^3.0.0, minipass@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" + integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== + dependencies: + yallist "^4.0.0" + +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +mkdirp@^1.0.3, mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= + +multicast-dns@^6.0.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== + dependencies: + dns-packet "^1.3.1" + thunky "^1.0.2" + +nan@^2.12.1: + version "2.14.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" + integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== + +nanoid@^2.1.0: + version "2.1.11" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-2.1.11.tgz#ec24b8a758d591561531b4176a01e3ab4f0f0280" + integrity sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA== + +nanoid@^3.1.20: + version "3.1.20" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788" + integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +native-url@^0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/native-url/-/native-url-0.2.6.tgz#ca1258f5ace169c716ff44eccbddb674e10399ae" + integrity sha512-k4bDC87WtgrdD362gZz6zoiXQrl40kYlBmpfmSjwRO1VU0V5ccwJTlxuE72F6m3V0vc1xOf6n3UCP9QyerRqmA== + dependencies: + querystring "^0.2.0" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +neo-async@^2.5.0, neo-async@^2.6.1, neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +next-tick@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-forge@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" + integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "^1.0.1" + +node-modules-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= + +node-notifier@^8.0.0: + version "8.0.1" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-8.0.1.tgz#f86e89bbc925f2b068784b31f382afdc6ca56be1" + integrity sha512-BvEXF+UmsnAfYfoapKM9nGxnP+Wn7P91YfXmrKnfcYCx6VBeoN5Ez5Ogck6I8Bi5k4RlpqRYaw75pAwzX9OphA== + dependencies: + growly "^1.3.0" + is-wsl "^2.2.0" + semver "^7.3.2" + shellwords "^0.1.1" + uuid "^8.3.0" + which "^2.0.2" + +node-releases@^1.1.61, node-releases@^1.1.70: + version "1.1.70" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.70.tgz#66e0ed0273aa65666d7fe78febe7634875426a08" + integrity sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw== + +normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + +normalize-url@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" + integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= + dependencies: + object-assign "^4.0.1" + prepend-http "^1.0.0" + query-string "^4.1.0" + sort-keys "^1.0.0" + +normalize-url@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +npm-run-path@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +nth-check@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= + +nwsapi@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-inspect@^1.8.0, object-inspect@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" + integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== + +object-is@^1.0.1: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.0, object.assign@^4.1.1, object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +object.entries@^1.1.0, object.entries@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.3.tgz#c601c7f168b62374541a07ddbd3e2d5e4f7711a6" + integrity sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + has "^1.0.3" + +object.fromentries@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.4.tgz#26e1ba5c4571c5c6f0890cef4473066456a120b8" + integrity sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.2" + has "^1.0.3" + +object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz#1bd63aeacf0d5d2d2f31b5e393b03a7c601a23f7" + integrity sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.2" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +object.values@^1.1.0, object.values@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.2.tgz#7a2015e06fcb0f546bd652486ce8583a4731c731" + integrity sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + has "^1.0.3" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^7.0.2: + version "7.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" + integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + +opn@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" + integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== + dependencies: + is-wsl "^1.1.0" + +optimize-css-assets-webpack-plugin@5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz#85883c6528aaa02e30bbad9908c92926bb52dc90" + integrity sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A== + dependencies: + cssnano "^4.1.10" + last-call-webpack-plugin "^3.0.0" + +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +original@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" + integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg== + dependencies: + url-parse "^1.4.3" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +p-each-series@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.2.0.tgz#105ab0357ce72b202a8a8b94933672657b5e2a9a" + integrity sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA== + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-retry@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" + integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w== + dependencies: + retry "^0.12.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parallel-transform@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== + dependencies: + cyclist "^1.0.1" + inherits "^2.0.3" + readable-stream "^2.1.5" + +param-case@^3.0.3: + version "3.0.4" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-asn1@^5.0.0, parse-asn1@^5.1.5: + version "5.1.6" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== + dependencies: + asn1.js "^5.2.0" + browserify-aes "^1.0.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse5@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" + integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= + dependencies: + pify "^2.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pbkdf2@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" + integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1, picomatch@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pirates@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" + integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== + dependencies: + node-modules-regexp "^1.0.0" + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= + dependencies: + find-up "^2.1.0" + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pkg-dir@^4.1.0, pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pkg-up@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" + integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== + dependencies: + find-up "^3.0.0" + +pnp-webpack-plugin@1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" + integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg== + dependencies: + ts-pnp "^1.1.6" + +popper.js@^1.14.4: + version "1.16.1" + resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b" + integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== + +portfinder@^1.0.26: + version "1.0.28" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" + integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== + dependencies: + async "^2.6.2" + debug "^3.1.1" + mkdirp "^0.5.5" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +postcss-attribute-case-insensitive@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz#d93e46b504589e94ac7277b0463226c68041a880" + integrity sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^6.0.2" + +postcss-browser-comments@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz#1248d2d935fb72053c8e1f61a84a57292d9f65e9" + integrity sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig== + dependencies: + postcss "^7" + +postcss-calc@^7.0.1: + version "7.0.5" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.5.tgz#f8a6e99f12e619c2ebc23cf6c486fdc15860933e" + integrity sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg== + dependencies: + postcss "^7.0.27" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.2" + +postcss-color-functional-notation@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz#5efd37a88fbabeb00a2966d1e53d98ced93f74e0" + integrity sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-color-gray@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz#532a31eb909f8da898ceffe296fdc1f864be8547" + integrity sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.5" + postcss-values-parser "^2.0.0" + +postcss-color-hex-alpha@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz#a8d9ca4c39d497c9661e374b9c51899ef0f87388" + integrity sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw== + dependencies: + postcss "^7.0.14" + postcss-values-parser "^2.0.1" + +postcss-color-mod-function@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz#816ba145ac11cc3cb6baa905a75a49f903e4d31d" + integrity sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-color-rebeccapurple@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz#c7a89be872bb74e45b1e3022bfe5748823e6de77" + integrity sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-colormin@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" + integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== + dependencies: + browserslist "^4.0.0" + color "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-convert-values@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" + integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-custom-media@^7.0.8: + version "7.0.8" + resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz#fffd13ffeffad73621be5f387076a28b00294e0c" + integrity sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg== + dependencies: + postcss "^7.0.14" + +postcss-custom-properties@^8.0.11: + version "8.0.11" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz#2d61772d6e92f22f5e0d52602df8fae46fa30d97" + integrity sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA== + dependencies: + postcss "^7.0.17" + postcss-values-parser "^2.0.1" + +postcss-custom-selectors@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz#64858c6eb2ecff2fb41d0b28c9dd7b3db4de7fba" + integrity sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-dir-pseudo-class@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz#6e3a4177d0edb3abcc85fdb6fbb1c26dabaeaba2" + integrity sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-discard-comments@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" + integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== + dependencies: + postcss "^7.0.0" + +postcss-discard-duplicates@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" + integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== + dependencies: + postcss "^7.0.0" + +postcss-discard-empty@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" + integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== + dependencies: + postcss "^7.0.0" + +postcss-discard-overridden@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" + integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== + dependencies: + postcss "^7.0.0" + +postcss-double-position-gradients@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz#fc927d52fddc896cb3a2812ebc5df147e110522e" + integrity sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA== + dependencies: + postcss "^7.0.5" + postcss-values-parser "^2.0.0" + +postcss-env-function@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-2.0.2.tgz#0f3e3d3c57f094a92c2baf4b6241f0b0da5365d7" + integrity sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-flexbugs-fixes@4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz#9218a65249f30897deab1033aced8578562a6690" + integrity sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ== + dependencies: + postcss "^7.0.26" + +postcss-focus-visible@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz#477d107113ade6024b14128317ade2bd1e17046e" + integrity sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g== + dependencies: + postcss "^7.0.2" + +postcss-focus-within@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz#763b8788596cee9b874c999201cdde80659ef680" + integrity sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w== + dependencies: + postcss "^7.0.2" + +postcss-font-variant@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz#42d4c0ab30894f60f98b17561eb5c0321f502641" + integrity sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA== + dependencies: + postcss "^7.0.2" + +postcss-gap-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz#431c192ab3ed96a3c3d09f2ff615960f902c1715" + integrity sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg== + dependencies: + postcss "^7.0.2" + +postcss-image-set-function@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz#28920a2f29945bed4c3198d7df6496d410d3f288" + integrity sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-initial@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.2.tgz#f018563694b3c16ae8eaabe3c585ac6319637b2d" + integrity sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA== + dependencies: + lodash.template "^4.5.0" + postcss "^7.0.2" + +postcss-lab-function@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e" + integrity sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-load-config@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.2.tgz#c5ea504f2c4aef33c7359a34de3573772ad7502a" + integrity sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw== + dependencies: + cosmiconfig "^5.0.0" + import-cwd "^2.0.0" + +postcss-loader@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d" + integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA== + dependencies: + loader-utils "^1.1.0" + postcss "^7.0.0" + postcss-load-config "^2.0.0" + schema-utils "^1.0.0" + +postcss-logical@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5" + integrity sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA== + dependencies: + postcss "^7.0.2" + +postcss-media-minmax@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5" + integrity sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw== + dependencies: + postcss "^7.0.2" + +postcss-merge-longhand@^4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" + integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== + dependencies: + css-color-names "0.0.4" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + stylehacks "^4.0.0" + +postcss-merge-rules@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" + integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + cssnano-util-same-parent "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + vendors "^1.0.0" + +postcss-minify-font-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" + integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-gradients@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" + integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + is-color-stop "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-params@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" + integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== + dependencies: + alphanum-sort "^1.0.0" + browserslist "^4.0.0" + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + uniqs "^2.0.0" + +postcss-minify-selectors@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" + integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== + dependencies: + alphanum-sort "^1.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +postcss-modules-extract-imports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" + integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== + dependencies: + postcss "^7.0.5" + +postcss-modules-local-by-default@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0" + integrity sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw== + dependencies: + icss-utils "^4.1.1" + postcss "^7.0.32" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" + integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^6.0.0" + +postcss-modules-values@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" + integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== + dependencies: + icss-utils "^4.0.0" + postcss "^7.0.6" + +postcss-nesting@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.1.tgz#b50ad7b7f0173e5b5e3880c3501344703e04c052" + integrity sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg== + dependencies: + postcss "^7.0.2" + +postcss-normalize-charset@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" + integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== + dependencies: + postcss "^7.0.0" + +postcss-normalize-display-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" + integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-positions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" + integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== + dependencies: + cssnano-util-get-arguments "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-repeat-style@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" + integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-string@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" + integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== + dependencies: + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-timing-functions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" + integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-unicode@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" + integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-url@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" + integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-whitespace@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" + integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize@8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize/-/postcss-normalize-8.0.1.tgz#90e80a7763d7fdf2da6f2f0f82be832ce4f66776" + integrity sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ== + dependencies: + "@csstools/normalize.css" "^10.1.0" + browserslist "^4.6.2" + postcss "^7.0.17" + postcss-browser-comments "^3.0.0" + sanitize.css "^10.0.0" + +postcss-ordered-values@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" + integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== + dependencies: + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-overflow-shorthand@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz#31ecf350e9c6f6ddc250a78f0c3e111f32dd4c30" + integrity sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g== + dependencies: + postcss "^7.0.2" + +postcss-page-break@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-2.0.0.tgz#add52d0e0a528cabe6afee8b46e2abb277df46bf" + integrity sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ== + dependencies: + postcss "^7.0.2" + +postcss-place@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-4.0.1.tgz#e9f39d33d2dc584e46ee1db45adb77ca9d1dcc62" + integrity sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-preset-env@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz#c34ddacf8f902383b35ad1e030f178f4cdf118a5" + integrity sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg== + dependencies: + autoprefixer "^9.6.1" + browserslist "^4.6.4" + caniuse-lite "^1.0.30000981" + css-blank-pseudo "^0.1.4" + css-has-pseudo "^0.10.0" + css-prefers-color-scheme "^3.1.1" + cssdb "^4.4.0" + postcss "^7.0.17" + postcss-attribute-case-insensitive "^4.0.1" + postcss-color-functional-notation "^2.0.1" + postcss-color-gray "^5.0.0" + postcss-color-hex-alpha "^5.0.3" + postcss-color-mod-function "^3.0.3" + postcss-color-rebeccapurple "^4.0.1" + postcss-custom-media "^7.0.8" + postcss-custom-properties "^8.0.11" + postcss-custom-selectors "^5.1.2" + postcss-dir-pseudo-class "^5.0.0" + postcss-double-position-gradients "^1.0.0" + postcss-env-function "^2.0.2" + postcss-focus-visible "^4.0.0" + postcss-focus-within "^3.0.0" + postcss-font-variant "^4.0.0" + postcss-gap-properties "^2.0.0" + postcss-image-set-function "^3.0.1" + postcss-initial "^3.0.0" + postcss-lab-function "^2.0.1" + postcss-logical "^3.0.0" + postcss-media-minmax "^4.0.0" + postcss-nesting "^7.0.0" + postcss-overflow-shorthand "^2.0.0" + postcss-page-break "^2.0.0" + postcss-place "^4.0.1" + postcss-pseudo-class-any-link "^6.0.0" + postcss-replace-overflow-wrap "^3.0.0" + postcss-selector-matches "^4.0.0" + postcss-selector-not "^4.0.0" + +postcss-pseudo-class-any-link@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz#2ed3eed393b3702879dec4a87032b210daeb04d1" + integrity sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-reduce-initial@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" + integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + +postcss-reduce-transforms@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" + integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== + dependencies: + cssnano-util-get-match "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-replace-overflow-wrap@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz#61b360ffdaedca84c7c918d2b0f0d0ea559ab01c" + integrity sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw== + dependencies: + postcss "^7.0.2" + +postcss-safe-parser@5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-5.0.2.tgz#459dd27df6bc2ba64608824ba39e45dacf5e852d" + integrity sha512-jDUfCPJbKOABhwpUKcqCVbbXiloe/QXMcbJ6Iipf3sDIihEzTqRCeMBfRaOHxhBuTYqtASrI1KJWxzztZU4qUQ== + dependencies: + postcss "^8.1.0" + +postcss-selector-matches@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz#71c8248f917ba2cc93037c9637ee09c64436fcff" + integrity sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww== + dependencies: + balanced-match "^1.0.0" + postcss "^7.0.2" + +postcss-selector-not@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz#263016eef1cf219e0ade9a913780fc1f48204cbf" + integrity sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ== + dependencies: + balanced-match "^1.0.0" + postcss "^7.0.2" + +postcss-selector-parser@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" + integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA== + dependencies: + dot-prop "^5.2.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" + integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== + dependencies: + cssesc "^2.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: + version "6.0.4" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz#56075a1380a04604c38b063ea7767a129af5c2b3" + integrity sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw== + dependencies: + cssesc "^3.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + util-deprecate "^1.0.2" + +postcss-svgo@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" + integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw== + dependencies: + is-svg "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + svgo "^1.0.0" + +postcss-unique-selectors@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" + integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== + dependencies: + alphanum-sort "^1.0.0" + postcss "^7.0.0" + uniqs "^2.0.0" + +postcss-value-parser@^3.0.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + +postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" + integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== + +postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f" + integrity sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg== + dependencies: + flatten "^1.0.2" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss@7.0.21: + version "7.0.21" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.21.tgz#06bb07824c19c2021c5d056d5b10c35b989f7e17" + integrity sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.35" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24" + integrity sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +postcss@^8.1.0: + version "8.2.6" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.2.6.tgz#5d69a974543b45f87e464bc4c3e392a97d6be9fe" + integrity sha512-xpB8qYxgPuly166AGlpRjUdEYtmOWx2iCwGmrv4vqZL9YPVviDVPZPRXxnXr6xPZOdxQ9lp3ZBFCRgWJ7LE3Sg== + dependencies: + colorette "^1.2.1" + nanoid "^3.1.20" + source-map "^0.6.1" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +prepend-http@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + +pretty-bytes@^5.3.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" + integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== + +pretty-error@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.2.tgz#be89f82d81b1c86ec8fdfbc385045882727f93b6" + integrity sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw== + dependencies: + lodash "^4.17.20" + renderkid "^2.0.4" + +pretty-format@^26.0.0, pretty-format@^26.6.0, pretty-format@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" + integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== + dependencies: + "@jest/types" "^26.6.2" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^17.0.1" + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + +promise@^8.0.3, promise@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/promise/-/promise-8.1.0.tgz#697c25c3dfe7435dd79fcd58c38a135888eaf05e" + integrity sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q== + dependencies: + asap "~2.0.6" + +prompts@2.4.0, prompts@^2.0.1: + version "2.4.0" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.0.tgz#4aa5de0723a231d1ee9121c40fdf663df73f61d7" + integrity sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types-extra@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/prop-types-extra/-/prop-types-extra-1.1.1.tgz#58c3b74cbfbb95d304625975aa2f0848329a010b" + integrity sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew== + dependencies: + react-is "^16.3.2" + warning "^4.0.0" + +prop-types@^15.5.8, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.1, prop-types@^15.7.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + +proxy-addr@~2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" + integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.9.1" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +psl@^1.1.28: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.2.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +q@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +query-string@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" + integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s= + dependencies: + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + +query-string@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-7.0.0.tgz#aaad2c8d5c6a6d0c6afada877fecbd56af79e609" + integrity sha512-Iy7moLybliR5ZgrK/1R3vjrXq03S13Vz4Rbm5Jg3EFq1LUmQppto0qtXz4vqZ386MSRjZgnTSZ9QC+NZOSd/XA== + dependencies: + decode-uri-component "^0.2.0" + filter-obj "^1.1.0" + split-on-first "^1.0.0" + strict-uri-encode "^2.0.0" + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +querystring@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd" + integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg== + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +queue-microtask@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.2.tgz#abf64491e6ecf0f38a6502403d4cda04f372dfd3" + integrity sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg== + +raf@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" + integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== + dependencies: + performance-now "^2.1.0" + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + +react-app-polyfill@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/react-app-polyfill/-/react-app-polyfill-1.0.6.tgz#890f8d7f2842ce6073f030b117de9130a5f385f0" + integrity sha512-OfBnObtnGgLGfweORmdZbyEz+3dgVePQBb3zipiaDsMHV1NpWm0rDFYIVXFV/AK+x4VIIfWHhrdMIeoTLyRr2g== + dependencies: + core-js "^3.5.0" + object-assign "^4.1.1" + promise "^8.0.3" + raf "^3.4.1" + regenerator-runtime "^0.13.3" + whatwg-fetch "^3.0.0" + +react-app-polyfill@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/react-app-polyfill/-/react-app-polyfill-2.0.0.tgz#a0bea50f078b8a082970a9d853dc34b6dcc6a3cf" + integrity sha512-0sF4ny9v/B7s6aoehwze9vJNWcmCemAUYBVasscVr92+UYiEqDXOxfKjXN685mDaMRNF3WdhHQs76oTODMocFA== + dependencies: + core-js "^3.6.5" + object-assign "^4.1.1" + promise "^8.1.0" + raf "^3.4.1" + regenerator-runtime "^0.13.7" + whatwg-fetch "^3.4.1" + +react-bootstrap-typeahead@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/react-bootstrap-typeahead/-/react-bootstrap-typeahead-5.1.4.tgz#856d30438bb7a254cfeafa3ec03ddf90285f7a4d" + integrity sha512-CfoaSjGV3MZS9yrkLfYkvimzRYru1Ko7qKKzacbsBeZ/sHCxFvUhxnCXmTy/K2vZCkOmAQpU/sbgQVOkMRNlSQ== + dependencies: + "@babel/runtime" "^7.3.4" + "@restart/hooks" "^0.3.22" + classnames "^2.2.0" + fast-deep-equal "^3.1.1" + invariant "^2.2.1" + lodash.debounce "^4.0.8" + prop-types "^15.5.8" + react-overlays "^4.1.1" + react-popper "^1.0.0" + scroll-into-view-if-needed "^2.2.20" + warning "^4.0.1" + +react-bootstrap@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-1.5.2.tgz#07dabec53d10491a520c49f102170b440fa89008" + integrity sha512-mGKPY5+lLd7Vtkx2VFivoRkPT4xAHazuFfIhJLTEgHlDfIUSePn7qrmpZe5gXH9zvHV0RsBaQ9cLfXjxnZrOpA== + dependencies: + "@babel/runtime" "^7.13.8" + "@restart/context" "^2.1.4" + "@restart/hooks" "^0.3.26" + "@types/classnames" "^2.2.10" + "@types/invariant" "^2.2.33" + "@types/prop-types" "^15.7.3" + "@types/react" ">=16.9.35" + "@types/react-transition-group" "^4.4.1" + "@types/warning" "^3.0.0" + classnames "^2.2.6" + dom-helpers "^5.1.2" + invariant "^2.2.4" + prop-types "^15.7.2" + prop-types-extra "^1.1.0" + react-overlays "^5.0.0" + react-transition-group "^4.4.1" + uncontrollable "^7.2.1" + warning "^4.0.3" + +react-contenteditable@^3.3.5: + version "3.3.5" + resolved "https://registry.yarnpkg.com/react-contenteditable/-/react-contenteditable-3.3.5.tgz#febff7a46570fdb2f5ff199e506c512e5924e22e" + integrity sha512-38A7hlRQfb2KQAQT0kIJC2YlQUU7jcyYM4eh1fj6kAYb3Hmk6hHlr0snelyxVSpPXjPdFllrnSsPkzUS5AtrEA== + dependencies: + fast-deep-equal "^2.0.1" + prop-types "^15.7.1" + +react-dev-utils@^11.0.3: + version "11.0.4" + resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-11.0.4.tgz#a7ccb60257a1ca2e0efe7a83e38e6700d17aa37a" + integrity sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A== + dependencies: + "@babel/code-frame" "7.10.4" + address "1.1.2" + browserslist "4.14.2" + chalk "2.4.2" + cross-spawn "7.0.3" + detect-port-alt "1.1.6" + escape-string-regexp "2.0.0" + filesize "6.1.0" + find-up "4.1.0" + fork-ts-checker-webpack-plugin "4.1.6" + global-modules "2.0.0" + globby "11.0.1" + gzip-size "5.1.1" + immer "8.0.1" + is-root "2.1.0" + loader-utils "2.0.0" + open "^7.0.2" + pkg-up "3.1.0" + prompts "2.4.0" + react-error-overlay "^6.0.9" + recursive-readdir "2.2.2" + shell-quote "1.7.2" + strip-ansi "6.0.0" + text-table "0.2.0" + +react-dom@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" + integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + scheduler "^0.20.2" + +react-error-overlay@^6.0.9: + version "6.0.9" + resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.9.tgz#3c743010c9359608c375ecd6bc76f35d93995b0a" + integrity sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew== + +react-hook-form@^7.5.2: + version "7.5.2" + resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.5.2.tgz#4f8da6d22ae67aa18ce170a0980bd7e1e7bd6917" + integrity sha512-fRA6TieC+wsumcdAM7OTeWSa+s+qG2ZlWfTXB2gpOwVeWpJxDwUpZZRfZdU9Bj6TEn1v/ZPJg/1xbmUGVI+MWA== + +react-icons@^3.10.0: + version "3.11.0" + resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-3.11.0.tgz#2ca2903dfab8268ca18ebd8cc2e879921ec3b254" + integrity sha512-JRgiI/vdF6uyBgyZhVyYJUZAop95Sy4XDe/jmT3R/bKliFWpO/uZBwvSjWEdxwzec7SYbEPNPck0Kff2tUGM2Q== + dependencies: + camelcase "^5.0.0" + +react-infinite-scroll-component@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/react-infinite-scroll-component/-/react-infinite-scroll-component-6.1.0.tgz#7e511e7aa0f728ac3e51f64a38a6079ac522407f" + integrity sha512-SQu5nCqy8DxQWpnUVLx7V7b7LcA37aM7tvoWjTLZp1dk6EJibM5/4EJKzOnl07/BsM1Y40sKLuqjCwwH/xV0TQ== + dependencies: + throttle-debounce "^2.1.0" + +"react-is@^16.12.0 || ^17.0.0", react-is@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + +react-is@^16.3.2, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.9.0: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^17.0.1: + version "17.0.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz#5b3531bd76a645a4c9fb6e693ed36419e3301339" + integrity sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA== + +react-lifecycles-compat@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" + integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== + +react-overlays@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/react-overlays/-/react-overlays-4.1.1.tgz#0060107cbe1c5171a744ccda3fbf0556d064bc5f" + integrity sha512-WtJifh081e6M24KnvTQoNjQEpz7HoLxqt8TwZM7LOYIkYJ8i/Ly1Xi7RVte87ZVnmqQ4PFaFiNHZhSINPSpdBQ== + dependencies: + "@babel/runtime" "^7.12.1" + "@popperjs/core" "^2.5.3" + "@restart/hooks" "^0.3.25" + "@types/warning" "^3.0.0" + dom-helpers "^5.2.0" + prop-types "^15.7.2" + uncontrollable "^7.0.0" + warning "^4.0.3" + +react-overlays@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/react-overlays/-/react-overlays-5.0.1.tgz#7e2c3cd3c0538048b0b7451d203b1289c561b7f2" + integrity sha512-plwUJieTBbLSrgvQ4OkkbTD/deXgxiJdNuKzo6n1RWE3OVnQIU5hffCGS/nvIuu6LpXFs2majbzaXY8rcUVdWA== + dependencies: + "@babel/runtime" "^7.13.8" + "@popperjs/core" "^2.8.6" + "@restart/hooks" "^0.3.26" + "@types/warning" "^3.0.0" + dom-helpers "^5.2.0" + prop-types "^15.7.2" + uncontrollable "^7.2.1" + warning "^4.0.3" + +react-popper@^1.0.0: + version "1.3.11" + resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-1.3.11.tgz#a2cc3f0a67b75b66cfa62d2c409f9dd1fcc71ffd" + integrity sha512-VSA/bS+pSndSF2fiasHK/PTEEAyOpX60+H5EPAjoArr8JGm+oihu4UbrqcEBpQibJxBVCpYyjAX7abJ+7DoYVg== + dependencies: + "@babel/runtime" "^7.1.2" + "@hypnosphi/create-react-context" "^0.3.1" + deep-equal "^1.1.1" + popper.js "^1.14.4" + prop-types "^15.6.1" + typed-styles "^0.0.7" + warning "^4.0.2" + +react-refresh@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.3.tgz#721d4657672d400c5e3c75d063c4a85fb2d5d68f" + integrity sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg== + +react-router-dom@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.2.0.tgz#9e65a4d0c45e13289e66c7b17c7e175d0ea15662" + integrity sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA== + dependencies: + "@babel/runtime" "^7.1.2" + history "^4.9.0" + loose-envify "^1.3.1" + prop-types "^15.6.2" + react-router "5.2.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-router@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.2.0.tgz#424e75641ca8747fbf76e5ecca69781aa37ea293" + integrity sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw== + dependencies: + "@babel/runtime" "^7.1.2" + history "^4.9.0" + hoist-non-react-statics "^3.1.0" + loose-envify "^1.3.1" + mini-create-react-context "^0.4.0" + path-to-regexp "^1.7.0" + prop-types "^15.6.2" + react-is "^16.6.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-scripts@4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-4.0.3.tgz#b1cafed7c3fa603e7628ba0f187787964cb5d345" + integrity sha512-S5eO4vjUzUisvkIPB7jVsKtuH2HhWcASREYWHAQ1FP5HyCv3xgn+wpILAEWkmy+A+tTNbSZClhxjT3qz6g4L1A== + dependencies: + "@babel/core" "7.12.3" + "@pmmmwh/react-refresh-webpack-plugin" "0.4.3" + "@svgr/webpack" "5.5.0" + "@typescript-eslint/eslint-plugin" "^4.5.0" + "@typescript-eslint/parser" "^4.5.0" + babel-eslint "^10.1.0" + babel-jest "^26.6.0" + babel-loader "8.1.0" + babel-plugin-named-asset-import "^0.3.7" + babel-preset-react-app "^10.0.0" + bfj "^7.0.2" + camelcase "^6.1.0" + case-sensitive-paths-webpack-plugin "2.3.0" + css-loader "4.3.0" + dotenv "8.2.0" + dotenv-expand "5.1.0" + eslint "^7.11.0" + eslint-config-react-app "^6.0.0" + eslint-plugin-flowtype "^5.2.0" + eslint-plugin-import "^2.22.1" + eslint-plugin-jest "^24.1.0" + eslint-plugin-jsx-a11y "^6.3.1" + eslint-plugin-react "^7.21.5" + eslint-plugin-react-hooks "^4.2.0" + eslint-plugin-testing-library "^3.9.2" + eslint-webpack-plugin "^2.5.2" + file-loader "6.1.1" + fs-extra "^9.0.1" + html-webpack-plugin "4.5.0" + identity-obj-proxy "3.0.0" + jest "26.6.0" + jest-circus "26.6.0" + jest-resolve "26.6.0" + jest-watch-typeahead "0.6.1" + mini-css-extract-plugin "0.11.3" + optimize-css-assets-webpack-plugin "5.0.4" + pnp-webpack-plugin "1.6.4" + postcss-flexbugs-fixes "4.2.1" + postcss-loader "3.0.0" + postcss-normalize "8.0.1" + postcss-preset-env "6.7.0" + postcss-safe-parser "5.0.2" + prompts "2.4.0" + react-app-polyfill "^2.0.0" + react-dev-utils "^11.0.3" + react-refresh "^0.8.3" + resolve "1.18.1" + resolve-url-loader "^3.1.2" + sass-loader "^10.0.5" + semver "7.3.2" + style-loader "1.3.0" + terser-webpack-plugin "4.2.3" + ts-pnp "1.2.0" + url-loader "4.1.1" + webpack "4.44.2" + webpack-dev-server "3.11.1" + webpack-manifest-plugin "2.2.0" + workbox-webpack-plugin "5.1.4" + optionalDependencies: + fsevents "^2.1.3" + +react-scroll@^1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/react-scroll/-/react-scroll-1.8.2.tgz#68e35b74ae296c88e7863393c9fd49f05afa29f5" + integrity sha512-f2ZEG5fsPbPTySI9ekcFpETCcNlqbmwbQj9hhzYK8tkgv+PA8APatSt66o/q0KSkDZxyT98ONTtXp9x0lyowEw== + dependencies: + lodash.throttle "^4.1.1" + prop-types "^15.7.2" + +react-shallow-renderer@^16.13.1: + version "16.14.1" + resolved "https://registry.yarnpkg.com/react-shallow-renderer/-/react-shallow-renderer-16.14.1.tgz#bf0d02df8a519a558fd9b8215442efa5c840e124" + integrity sha512-rkIMcQi01/+kxiTE9D3fdS959U1g7gs+/rborw++42m1O9FAQiNI/UNRZExVUoAOprn4umcXf+pFRou8i4zuBg== + dependencies: + object-assign "^4.1.1" + react-is "^16.12.0 || ^17.0.0" + +react-test-renderer@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-17.0.2.tgz#4cd4ae5ef1ad5670fc0ef776e8cc7e1231d9866c" + integrity sha512-yaQ9cB89c17PUb0x6UfWRs7kQCorVdHlutU1boVPEsB8IDZH6n9tHxMacc3y0JoXOJUsZb/t/Mb8FUWMKaM7iQ== + dependencies: + object-assign "^4.1.1" + react-is "^17.0.2" + react-shallow-renderer "^16.13.1" + scheduler "^0.20.2" + +react-transition-group@^4.4.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.1.tgz#63868f9325a38ea5ee9535d828327f85773345c9" + integrity sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw== + dependencies: + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" + +react@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" + integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +readdirp@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" + integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== + dependencies: + picomatch "^2.2.1" + +recursive-readdir@2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" + integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg== + dependencies: + minimatch "3.0.4" + +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + +regenerate-unicode-properties@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" + integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + +regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7: + version "0.13.7" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" + integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== + +regenerator-transform@^0.14.2: + version "0.14.5" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" + integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== + dependencies: + "@babel/runtime" "^7.8.4" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regex-parser@^2.2.11: + version "2.2.11" + resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" + integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== + +regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" + integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +regexpp@^3.0.0, regexpp@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" + integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== + +regexpu-core@^4.7.1: + version "4.7.1" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6" + integrity sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.2.0" + regjsgen "^0.5.1" + regjsparser "^0.6.4" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.2.0" + +regjsgen@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" + integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== + +regjsparser@^0.6.4: + version "0.6.7" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.7.tgz#c00164e1e6713c2e3ee641f1701c4b7aa0a7f86c" + integrity sha512-ib77G0uxsA2ovgiYbCVGx4Pv3PSttAx2vIwidqQzbL2U5S4Q+j00HdSAneSBuyVcMvEnTXMjiGgB+DlXozVhpQ== + dependencies: + jsesc "~0.5.0" + +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +renderkid@^2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.5.tgz#483b1ac59c6601ab30a7a596a5965cabccfdd0a5" + integrity sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ== + dependencies: + css-select "^2.0.2" + dom-converter "^0.2" + htmlparser2 "^3.10.1" + lodash "^4.17.20" + strip-ansi "^3.0.0" + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +request-promise-core@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" + integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== + dependencies: + lodash "^4.17.19" + +request-promise-native@^1.0.8: + version "1.0.9" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" + integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== + dependencies: + request-promise-core "1.1.4" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + +request@^2.88.2: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-pathname@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" + integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== + +resolve-url-loader@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-3.1.2.tgz#235e2c28e22e3e432ba7a5d4e305c59a58edfc08" + integrity sha512-QEb4A76c8Mi7I3xNKXlRKQSlLBwjUV/ULFMP+G7n3/7tJZ8MG5wsZ3ucxP1Jz8Vevn6fnJsxDx9cIls+utGzPQ== + dependencies: + adjust-sourcemap-loader "3.0.0" + camelcase "5.3.1" + compose-function "3.0.3" + convert-source-map "1.7.0" + es6-iterator "2.0.3" + loader-utils "1.2.3" + postcss "7.0.21" + rework "1.0.1" + rework-visit "1.0.0" + source-map "0.6.1" + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.18.1.tgz#018fcb2c5b207d2a6424aee361c5a266da8f4130" + integrity sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA== + dependencies: + is-core-module "^2.0.0" + path-parse "^1.0.6" + +resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.3.2, resolve@^1.8.1: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rework-visit@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rework-visit/-/rework-visit-1.0.0.tgz#9945b2803f219e2f7aca00adb8bc9f640f842c9a" + integrity sha1-mUWygD8hni96ygCtuLyfZA+ELJo= + +rework@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rework/-/rework-1.0.1.tgz#30806a841342b54510aa4110850cd48534144aa7" + integrity sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc= + dependencies: + convert-source-map "^0.3.3" + css "^2.0.0" + +rgb-regex@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= + +rgba-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= + +rimraf@^2.5.4, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rollup-plugin-babel@^4.3.3: + version "4.4.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz#d15bd259466a9d1accbdb2fe2fff17c52d030acb" + integrity sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + rollup-pluginutils "^2.8.1" + +rollup-plugin-terser@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-5.3.1.tgz#8c650062c22a8426c64268548957463bf981b413" + integrity sha512-1pkwkervMJQGFYvM9nscrUoncPwiKR/K+bHdjv6PFgRo3cgPHoRT83y2Aa3GvINj4539S15t/tpFPb775TDs6w== + dependencies: + "@babel/code-frame" "^7.5.5" + jest-worker "^24.9.0" + rollup-pluginutils "^2.8.2" + serialize-javascript "^4.0.0" + terser "^4.6.2" + +rollup-pluginutils@^2.8.1, rollup-pluginutils@^2.8.2: + version "2.8.2" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" + integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ== + dependencies: + estree-walker "^0.6.1" + +rollup@^1.31.1: + version "1.32.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.32.1.tgz#4480e52d9d9e2ae4b46ba0d9ddeaf3163940f9c4" + integrity sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A== + dependencies: + "@types/estree" "*" + "@types/node" "*" + acorn "^7.1.0" + +rsvp@^4.8.4: + version "4.8.5" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" + integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= + dependencies: + aproba "^1.1.1" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sane@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" + integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== + dependencies: + "@cnakazawa/watch" "^1.0.3" + anymatch "^2.0.0" + capture-exit "^2.0.0" + exec-sh "^0.3.2" + execa "^1.0.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + +sanitize.css@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/sanitize.css/-/sanitize.css-10.0.0.tgz#b5cb2547e96d8629a60947544665243b1dc3657a" + integrity sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg== + +sass-loader@^10.0.5: + version "10.1.1" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.1.1.tgz#4ddd5a3d7638e7949065dd6e9c7c04037f7e663d" + integrity sha512-W6gVDXAd5hR/WHsPicvZdjAWHBcEJ44UahgxcIE196fW2ong0ZHMPO1kZuI5q0VlvMQZh32gpv69PLWQm70qrw== + dependencies: + klona "^2.0.4" + loader-utils "^2.0.0" + neo-async "^2.6.2" + schema-utils "^3.0.0" + semver "^7.3.2" + +sass@1.32.11: + version "1.32.11" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.32.11.tgz#b236b3ea55c76602c2ef2bd0445f0db581baa218" + integrity sha512-O9tRcob/fegUVSIV1ihLLZcftIOh0AF1VpKgusUfLqnb2jQ0GLDwI5ivv1FYWivGv8eZ/AwntTyTzjcHu0c/qw== + dependencies: + chokidar ">=3.0.0 <4.0.0" + +sax@~1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +saxes@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" + integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== + dependencies: + xmlchars "^2.2.0" + +scheduler@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" + integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +schema-utils@^2.6.5, schema-utils@^2.7.0, schema-utils@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +schema-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.0.0.tgz#67502f6aa2b66a2d4032b4279a2944978a0913ef" + integrity sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA== + dependencies: + "@types/json-schema" "^7.0.6" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +scroll-into-view-if-needed@^2.2.20: + version "2.2.28" + resolved "https://registry.yarnpkg.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.28.tgz#5a15b2f58a52642c88c8eca584644e01703d645a" + integrity sha512-8LuxJSuFVc92+0AdNv4QOxRL4Abeo1DgLnGNkn1XlaujPH/3cCFz3QI60r2VNu4obJJROzgnIUw5TKQkZvZI1w== + dependencies: + compute-scroll-into-view "^1.0.17" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= + +selfsigned@^1.10.8: + version "1.10.8" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.8.tgz#0d17208b7d12c33f8eac85c41835f27fc3d81a30" + integrity sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w== + dependencies: + node-forge "^0.10.0" + +"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@7.3.2: + version "7.3.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" + integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== + +semver@^6.0.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.2.1, semver@^7.3.2: + version "7.3.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" + integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== + dependencies: + lru-cache "^6.0.0" + +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + dependencies: + randombytes "^2.1.0" + +serialize-javascript@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" + integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== + dependencies: + randombytes "^2.1.0" + +serialize-query-params@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/serialize-query-params/-/serialize-query-params-1.3.3.tgz#a4bf0fc0ab9e80c92b93cdf9d84ec521d769ecbe" + integrity sha512-rJIIETRuGUVbLekC73IiXV3738ylEHbHK1kxaXAbhxbxfio0yvVXaRMF+OyLZOBMwdgDHYLaj6EMBAEiSf8C/g== + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" + integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== + +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== + +shortid@^2.2.14: + version "2.2.16" + resolved "https://registry.yarnpkg.com/shortid/-/shortid-2.2.16.tgz#b742b8f0cb96406fd391c76bfc18a67a57fe5608" + integrity sha512-Ugt+GIZqvGXCIItnsL+lvFJOiN7RYqlGy7QE41O3YC1xbNSeDGIRO7xg2JJXIAj1cAGnOeC1r7/T9pgrtQbv4g== + dependencies: + nanoid "^2.1.0" + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + dependencies: + is-arrayish "^0.3.1" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +sockjs-client@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.5.0.tgz#2f8ff5d4b659e0d092f7aba0b7c386bd2aa20add" + integrity sha512-8Dt3BDi4FYNrCFGTL/HtwVzkARrENdwOUf1ZoW/9p3M8lZdFT35jVdrHza+qgxuG9H3/shR4cuX/X9umUrjP8Q== + dependencies: + debug "^3.2.6" + eventsource "^1.0.7" + faye-websocket "^0.11.3" + inherits "^2.0.4" + json3 "^3.3.3" + url-parse "^1.4.7" + +sockjs@^0.3.21: + version "0.3.21" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.21.tgz#b34ffb98e796930b60a0cfa11904d6a339a7d417" + integrity sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw== + dependencies: + faye-websocket "^0.11.3" + uuid "^3.4.0" + websocket-driver "^0.7.4" + +sort-keys@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= + dependencies: + is-plain-obj "^1.0.0" + +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-resolve@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.6.0.tgz#3d9df87e236b53f16d01e58150fc7711138e5ed2" + integrity sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + +source-map-support@^0.5.6, source-map-support@~0.5.12, source-map-support@~0.5.19: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== + +source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.5.0, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.7.3, source-map@~0.7.2: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +sourcemap-codec@^1.4.4: + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.7" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" + integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +split-on-first@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" + integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +ssri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + dependencies: + figgy-pudding "^3.5.1" + +ssri@^8.0.0: + version "8.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" + integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== + dependencies: + minipass "^3.1.1" + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +stack-utils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.3.tgz#cd5f030126ff116b78ccb3c027fe302713b61277" + integrity sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw== + dependencies: + escape-string-regexp "^2.0.0" + +stackframe@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.2.0.tgz#52429492d63c62eb989804c11552e3d22e779303" + integrity sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA== + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-shift@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= + +strict-uri-encode@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" + integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY= + +string-length@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.1.tgz#4a973bf31ef77c4edbceadd6af2611996985f8a1" + integrity sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +string-natural-compare@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" + integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string.prototype.matchall@^4.0.2: + version "4.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.4.tgz#608f255e93e072107f5de066f81a2dfb78cf6b29" + integrity sha512-pknFIWVachNcyqRfaQSeu/FUfpvJTe4uskUSZ9Wc1RijsPuzbZ8TyYT8WCNnntCjUEqQ3vUHMAfVj2+wLAisPQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.2" + has-symbols "^1.0.1" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.3.1" + side-channel "^1.0.4" + +string.prototype.trimend@^1.0.1, string.prototype.trimend@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz#a22bd53cca5c7cf44d7c9d5c732118873d6cd18b" + integrity sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + +string.prototype.trimstart@^1.0.1, string.prototype.trimstart@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz#9b4cb590e123bb36564401d59824298de50fd5aa" + integrity sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + +string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +strip-ansi@6.0.0, strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-comments@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/strip-comments/-/strip-comments-1.0.2.tgz#82b9c45e7f05873bee53f37168af930aa368679d" + integrity sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw== + dependencies: + babel-extract-comments "^1.0.0" + babel-plugin-transform-object-rest-spread "^6.26.0" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +style-loader@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.3.0.tgz#828b4a3b3b7e7aa5847ce7bae9e874512114249e" + integrity sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q== + dependencies: + loader-utils "^2.0.0" + schema-utils "^2.7.0" + +stylehacks@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" + integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-hyperlinks@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz#f663df252af5f37c5d49bbd7eeefa9e0b9e59e47" + integrity sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + +svg-parser@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" + integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== + +svgo@^1.0.0, svgo@^1.2.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" + integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== + dependencies: + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.37" + csso "^4.0.2" + js-yaml "^3.13.1" + mkdirp "~0.5.1" + object.values "^1.1.0" + sax "~1.2.4" + stable "^0.1.8" + unquote "~1.1.1" + util.promisify "~1.0.0" + +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +table@^6.0.4: + version "6.0.7" + resolved "https://registry.yarnpkg.com/table/-/table-6.0.7.tgz#e45897ffbcc1bcf9e8a87bf420f2c9e5a7a52a34" + integrity sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g== + dependencies: + ajv "^7.0.2" + lodash "^4.17.20" + slice-ansi "^4.0.0" + string-width "^4.2.0" + +tapable@^1.0.0, tapable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +tar@^6.0.2: + version "6.1.0" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.0.tgz#d1724e9bcc04b977b18d5c573b333a2207229a83" + integrity sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^3.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +temp-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" + integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= + +tempy@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/tempy/-/tempy-0.3.0.tgz#6f6c5b295695a16130996ad5ab01a8bd726e8bf8" + integrity sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ== + dependencies: + temp-dir "^1.0.0" + type-fest "^0.3.1" + unique-string "^1.0.0" + +terminal-link@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" + integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== + dependencies: + ansi-escapes "^4.2.1" + supports-hyperlinks "^2.0.0" + +terser-webpack-plugin@4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz#28daef4a83bd17c1db0297070adc07fc8cfc6a9a" + integrity sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ== + dependencies: + cacache "^15.0.5" + find-cache-dir "^3.3.1" + jest-worker "^26.5.0" + p-limit "^3.0.2" + schema-utils "^3.0.0" + serialize-javascript "^5.0.1" + source-map "^0.6.1" + terser "^5.3.4" + webpack-sources "^1.4.3" + +terser-webpack-plugin@^1.4.3: + version "1.4.5" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" + integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^4.0.0" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + +terser@^4.1.2, terser@^4.6.2, terser@^4.6.3: + version "4.8.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" + integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +terser@^5.3.4: + version "5.6.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.6.0.tgz#138cdf21c5e3100b1b3ddfddf720962f88badcd2" + integrity sha512-vyqLMoqadC1uR0vywqOZzriDYzgEkNJFK4q9GeyOBHIbiECHiWLKcWfbQWAUaPfxkjDhapSlZB9f7fkMrvkVjA== + dependencies: + commander "^2.20.0" + source-map "~0.7.2" + source-map-support "~0.5.19" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-table@0.2.0, text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +throat@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" + integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== + +throttle-debounce@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-2.3.0.tgz#fd31865e66502071e411817e241465b3e9c372e2" + integrity sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ== + +through2@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +timers-browserify@^2.0.4: + version "2.0.12" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" + integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== + dependencies: + setimmediate "^1.0.4" + +timsort@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= + +tiny-invariant@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875" + integrity sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw== + +tiny-warning@^1.0.0, tiny-warning@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +tough-cookie@^2.3.3, tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tough-cookie@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2" + integrity sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg== + dependencies: + ip-regex "^2.1.0" + psl "^1.1.28" + punycode "^2.1.1" + +tr46@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.0.2.tgz#03273586def1595ae08fedb38d7733cee91d2479" + integrity sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg== + dependencies: + punycode "^2.1.1" + +tryer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" + integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== + +ts-pnp@1.2.0, ts-pnp@^1.1.6: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" + integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== + +tsconfig-paths@^3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" + integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.0" + strip-bom "^3.0.0" + +tslib@^1.8.1, tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" + integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== + +tsutils@^3.17.1: + version "3.20.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.20.0.tgz#ea03ea45462e146b53d70ce0893de453ff24f698" + integrity sha512-RYbuQuvkhuqVeXweWT3tJLKOEJ/UUw9GjNEZGWdrLLlM+611o1gwLHBpxoFJKKl25fLprp2eVthtKs5JOrNeXg== + dependencies: + tslib "^1.8.1" + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" + integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== + +type-fest@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" + integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +type@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +type@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/type/-/type-2.3.0.tgz#ada7c045f07ead08abf9e2edd29be1a0c0661132" + integrity sha512-rgPIqOdfK/4J9FhiVrZ3cveAjRRo5rsQBAIhnylX874y1DX/kEKSVdLsnuHB6l1KTjHyU01VjiMBHgU2adejyg== + +typed-styles@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/typed-styles/-/typed-styles-0.0.7.tgz#93392a008794c4595119ff62dde6809dbc40a3d9" + integrity sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q== + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +uncontrollable@^7.0.0, uncontrollable@^7.2.1: + version "7.2.1" + resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-7.2.1.tgz#1fa70ba0c57a14d5f78905d533cf63916dc75738" + integrity sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ== + dependencies: + "@babel/runtime" "^7.6.3" + "@types/react" ">=16.9.11" + invariant "^2.2.4" + react-lifecycles-compat "^3.0.4" + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" + integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" + integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +unique-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= + dependencies: + crypto-random-string "^1.0.0" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.1, upath@^1.1.2, upath@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url-loader@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" + integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== + dependencies: + loader-utils "^2.0.0" + mime-types "^2.1.27" + schema-utils "^3.0.0" + +url-parse@^1.4.3, url-parse@^1.4.7: + version "1.5.1" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.1.tgz#d5fa9890af8a5e1f274a2c98376510f6425f6e3b" + integrity sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +urs@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/urs/-/urs-0.0.8.tgz#8a0e0b792073cdb7eec926d08ab1e017ffab3f66" + integrity sha512-LaSSPpr91XrVA3vW2zPupw4K6DSQEDKdL4yQZX1mO2fpljIMpB5zctrjRvxLurelWSgKsHsCmfHNCImscryirQ== + +use-http@^1.0.20: + version "1.0.20" + resolved "https://registry.yarnpkg.com/use-http/-/use-http-1.0.20.tgz#15d9d2a239f8621bc76fd191418fd601deafebae" + integrity sha512-3JOASSO828AsUwGjH3nhjUxHpR0lxIUSSNO/OM+0YydETX6FWJV5zWiGKTOV1Gsxu/3GLRFUbEJ1Cl3mUGkfnw== + dependencies: + urs "^0.0.8" + use-ssr "^1.0.24" + utility-types "^3.10.0" + +use-query-params@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/use-query-params/-/use-query-params-1.2.2.tgz#4c4b274133d699605301510b5aa01047f92b5ce0" + integrity sha512-Uyfe+/TECsNNzCSkgUM1MM24OEGxGE4aeWvZEf0a14iQFp/m43wiqI1HZ9oTlrRSZwD5yABeLc9rN+wtiB5B3Q== + dependencies: + serialize-query-params "^1.3.3" + +use-ssr@^1.0.24: + version "1.0.24" + resolved "https://registry.yarnpkg.com/use-ssr/-/use-ssr-1.0.24.tgz#213a3df58f5ab9268e6fe1a57ad0a9de91e514d1" + integrity sha512-0MFps7ezL57/3o0yl4CvrHLlp9z20n1rQZV/lSRz7if+TUoM6POU1XdOvEjIgjgKeIhTEye1U0khrIYWCTWw4g== + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util.promisify@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + +util.promisify@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" + integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.2" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.0" + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + +utila@~0.4: + version "0.4.0" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= + +utility-types@^3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-3.10.0.tgz#ea4148f9a741015f05ed74fd615e1d20e6bed82b" + integrity sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@^3.3.2, uuid@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +uuid@^8.3.0: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-compile-cache@^2.0.3: + version "2.2.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz#9471efa3ef9128d2f7c6a7ca39c4dd6b5055b132" + integrity sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q== + +v8-to-istanbul@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-7.1.0.tgz#5b95cef45c0f83217ec79f8fc7ee1c8b486aee07" + integrity sha512-uXUVqNUCLa0AH1vuVxzi+MI4RfxEOKt9pBgKwHbgH7st8Kv2P1m+jvWNnektzBh5QShF3ODgKmUFCf38LnVz1g== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + source-map "^0.7.3" + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +validate.io-array@^1.0.3: + version "1.0.6" + resolved "https://registry.yarnpkg.com/validate.io-array/-/validate.io-array-1.0.6.tgz#5b5a2cafd8f8b85abb2f886ba153f2d93a27774d" + integrity sha1-W1osr9j4uFq7L4hroVPy2Tond00= + +validate.io-function@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/validate.io-function/-/validate.io-function-1.0.2.tgz#343a19802ed3b1968269c780e558e93411c0bad7" + integrity sha1-NDoZgC7TsZaCaceA5VjpNBHAutc= + +validate.io-integer-array@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/validate.io-integer-array/-/validate.io-integer-array-1.0.0.tgz#2cabde033293a6bcbe063feafe91eaf46b13a089" + integrity sha1-LKveAzKTpry+Bj/q/pHq9GsToIk= + dependencies: + validate.io-array "^1.0.3" + validate.io-integer "^1.0.4" + +validate.io-integer@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/validate.io-integer/-/validate.io-integer-1.0.5.tgz#168496480b95be2247ec443f2233de4f89878068" + integrity sha1-FoSWSAuVviJH7EQ/IjPeT4mHgGg= + dependencies: + validate.io-number "^1.0.3" + +validate.io-number@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/validate.io-number/-/validate.io-number-1.0.3.tgz#f63ffeda248bf28a67a8d48e0e3b461a1665baf8" + integrity sha1-9j/+2iSL8opnqNSODjtGGhZluvg= + +value-equal@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" + integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +vendors@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" + integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +w3c-hr-time@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + dependencies: + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" + integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== + dependencies: + xml-name-validator "^3.0.0" + +walker@^1.0.7, walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= + dependencies: + makeerror "1.0.x" + +warning@^4.0.0, warning@^4.0.1, warning@^4.0.2, warning@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== + dependencies: + loose-envify "^1.0.0" + +watchpack-chokidar2@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" + integrity sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww== + dependencies: + chokidar "^2.1.8" + +watchpack@^1.7.4: + version "1.7.5" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453" + integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ== + dependencies: + graceful-fs "^4.1.2" + neo-async "^2.5.0" + optionalDependencies: + chokidar "^3.4.1" + watchpack-chokidar2 "^2.0.1" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +web-vitals@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-1.1.1.tgz#2df535e3355fb7fbe34787b44b736e270e539377" + integrity sha512-jYOaqu01Ny1NvMwJ3dBJDUOJ2PGWknZWH4AUnvFOscvbdHMERIKT2TlgiAey5rVyfOePG7so2JcXXZdSnBvioQ== + +webidl-conversions@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" + integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== + +webidl-conversions@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== + +webpack-dev-middleware@^3.7.2: + version "3.7.3" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz#0639372b143262e2b84ab95d3b91a7597061c2c5" + integrity sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ== + dependencies: + memory-fs "^0.4.1" + mime "^2.4.4" + mkdirp "^0.5.1" + range-parser "^1.2.1" + webpack-log "^2.0.0" + +webpack-dev-server@3.11.1: + version "3.11.1" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.1.tgz#c74028bf5ba8885aaf230e48a20e8936ab8511f0" + integrity sha512-u4R3mRzZkbxQVa+MBWi2uVpB5W59H3ekZAJsQlKUTdl7Elcah2EhygTPLmeFXybQkf9i2+L0kn7ik9SnXa6ihQ== + dependencies: + ansi-html "0.0.7" + bonjour "^3.5.0" + 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.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.8" + opn "^5.5.0" + p-retry "^3.0.1" + portfinder "^1.0.26" + schema-utils "^1.0.0" + selfsigned "^1.10.8" + semver "^6.3.0" + serve-index "^1.9.1" + sockjs "^0.3.21" + sockjs-client "^1.5.0" + spdy "^4.0.2" + strip-ansi "^3.0.1" + supports-color "^6.1.0" + url "^0.11.0" + webpack-dev-middleware "^3.7.2" + webpack-log "^2.0.0" + ws "^6.2.1" + yargs "^13.3.2" + +webpack-log@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" + integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== + dependencies: + ansi-colors "^3.0.0" + uuid "^3.3.2" + +webpack-manifest-plugin@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz#19ca69b435b0baec7e29fbe90fb4015de2de4f16" + integrity sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ== + dependencies: + fs-extra "^7.0.0" + lodash ">=3.5 <5" + object.entries "^1.1.0" + tapable "^1.0.0" + +webpack-sources@^1.1.0, webpack-sources@^1.3.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@4.44.2: + version "4.44.2" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.44.2.tgz#6bfe2b0af055c8b2d1e90ed2cd9363f841266b72" + integrity sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/wasm-edit" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + acorn "^6.4.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" + enhanced-resolve "^4.3.0" + eslint-scope "^4.0.3" + json-parse-better-errors "^1.0.2" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.3" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" + schema-utils "^1.0.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.3" + watchpack "^1.7.4" + webpack-sources "^1.4.1" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-fetch@^3.0.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" + integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== + +whatwg-fetch@^3.4.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.1.tgz#93bc4005af6c2cc30ba3e42ec3125947c8f54ed3" + integrity sha512-IEmN/ZfmMw6G1hgZpVd0LuZXOQDisrMOZrzYd5x3RAK4bMPlJohKUZWZ9t/QsTvH0dV9TbPDcc2OSuIDcihnHA== + +whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^8.0.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.4.0.tgz#50fb9615b05469591d2b2bd6dfaed2942ed72837" + integrity sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^2.0.2" + webidl-conversions "^6.1.0" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@^1.2.9, which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1, which@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@^1.2.3, word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +workbox-background-sync@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-5.1.4.tgz#5ae0bbd455f4e9c319e8d827c055bb86c894fd12" + integrity sha512-AH6x5pYq4vwQvfRDWH+vfOePfPIYQ00nCEB7dJRU1e0n9+9HMRyvI63FlDvtFT2AvXVRsXvUt7DNMEToyJLpSA== + dependencies: + workbox-core "^5.1.4" + +workbox-broadcast-update@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-5.1.4.tgz#0eeb89170ddca7f6914fa3523fb14462891f2cfc" + integrity sha512-HTyTWkqXvHRuqY73XrwvXPud/FN6x3ROzkfFPsRjtw/kGZuZkPzfeH531qdUGfhtwjmtO/ZzXcWErqVzJNdXaA== + dependencies: + workbox-core "^5.1.4" + +workbox-build@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-5.1.4.tgz#23d17ed5c32060c363030c8823b39d0eabf4c8c7" + integrity sha512-xUcZn6SYU8usjOlfLb9Y2/f86Gdo+fy1fXgH8tJHjxgpo53VVsqRX0lUDw8/JuyzNmXuo8vXX14pXX2oIm9Bow== + dependencies: + "@babel/core" "^7.8.4" + "@babel/preset-env" "^7.8.4" + "@babel/runtime" "^7.8.4" + "@hapi/joi" "^15.1.0" + "@rollup/plugin-node-resolve" "^7.1.1" + "@rollup/plugin-replace" "^2.3.1" + "@surma/rollup-plugin-off-main-thread" "^1.1.1" + common-tags "^1.8.0" + fast-json-stable-stringify "^2.1.0" + fs-extra "^8.1.0" + glob "^7.1.6" + lodash.template "^4.5.0" + pretty-bytes "^5.3.0" + rollup "^1.31.1" + rollup-plugin-babel "^4.3.3" + rollup-plugin-terser "^5.3.1" + source-map "^0.7.3" + source-map-url "^0.4.0" + stringify-object "^3.3.0" + strip-comments "^1.0.2" + tempy "^0.3.0" + upath "^1.2.0" + workbox-background-sync "^5.1.4" + workbox-broadcast-update "^5.1.4" + workbox-cacheable-response "^5.1.4" + workbox-core "^5.1.4" + workbox-expiration "^5.1.4" + workbox-google-analytics "^5.1.4" + workbox-navigation-preload "^5.1.4" + workbox-precaching "^5.1.4" + workbox-range-requests "^5.1.4" + workbox-routing "^5.1.4" + workbox-strategies "^5.1.4" + workbox-streams "^5.1.4" + workbox-sw "^5.1.4" + workbox-window "^5.1.4" + +workbox-cacheable-response@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-5.1.4.tgz#9ff26e1366214bdd05cf5a43da9305b274078a54" + integrity sha512-0bfvMZs0Of1S5cdswfQK0BXt6ulU5kVD4lwer2CeI+03czHprXR3V4Y8lPTooamn7eHP8Iywi5QjyAMjw0qauA== + dependencies: + workbox-core "^5.1.4" + +workbox-core@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-5.1.4.tgz#8bbfb2362ecdff30e25d123c82c79ac65d9264f4" + integrity sha512-+4iRQan/1D8I81nR2L5vcbaaFskZC2CL17TLbvWVzQ4qiF/ytOGF6XeV54pVxAvKUtkLANhk8TyIUMtiMw2oDg== + +workbox-expiration@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-5.1.4.tgz#92b5df461e8126114943a3b15c55e4ecb920b163" + integrity sha512-oDO/5iC65h2Eq7jctAv858W2+CeRW5e0jZBMNRXpzp0ZPvuT6GblUiHnAsC5W5lANs1QS9atVOm4ifrBiYY7AQ== + dependencies: + workbox-core "^5.1.4" + +workbox-google-analytics@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-5.1.4.tgz#b3376806b1ac7d7df8418304d379707195fa8517" + integrity sha512-0IFhKoEVrreHpKgcOoddV+oIaVXBFKXUzJVBI+nb0bxmcwYuZMdteBTp8AEDJacENtc9xbR0wa9RDCnYsCDLjA== + dependencies: + workbox-background-sync "^5.1.4" + workbox-core "^5.1.4" + workbox-routing "^5.1.4" + workbox-strategies "^5.1.4" + +workbox-navigation-preload@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-5.1.4.tgz#30d1b720d26a05efc5fa11503e5cc1ed5a78902a" + integrity sha512-Wf03osvK0wTflAfKXba//QmWC5BIaIZARU03JIhAEO2wSB2BDROWI8Q/zmianf54kdV7e1eLaIEZhth4K4MyfQ== + dependencies: + workbox-core "^5.1.4" + +workbox-precaching@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-5.1.4.tgz#874f7ebdd750dd3e04249efae9a1b3f48285fe6b" + integrity sha512-gCIFrBXmVQLFwvAzuGLCmkUYGVhBb7D1k/IL7pUJUO5xacjLcFUaLnnsoVepBGAiKw34HU1y/YuqvTKim9qAZA== + dependencies: + workbox-core "^5.1.4" + +workbox-range-requests@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-5.1.4.tgz#7066a12c121df65bf76fdf2b0868016aa2bab859" + integrity sha512-1HSujLjgTeoxHrMR2muDW2dKdxqCGMc1KbeyGcmjZZAizJTFwu7CWLDmLv6O1ceWYrhfuLFJO+umYMddk2XMhw== + dependencies: + workbox-core "^5.1.4" + +workbox-routing@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-5.1.4.tgz#3e8cd86bd3b6573488d1a2ce7385e547b547e970" + integrity sha512-8ljknRfqE1vEQtnMtzfksL+UXO822jJlHTIR7+BtJuxQ17+WPZfsHqvk1ynR/v0EHik4x2+826Hkwpgh4GKDCw== + dependencies: + workbox-core "^5.1.4" + +workbox-strategies@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-5.1.4.tgz#96b1418ccdfde5354612914964074d466c52d08c" + integrity sha512-VVS57LpaJTdjW3RgZvPwX0NlhNmscR7OQ9bP+N/34cYMDzXLyA6kqWffP6QKXSkca1OFo/v6v7hW7zrrguo6EA== + dependencies: + workbox-core "^5.1.4" + workbox-routing "^5.1.4" + +workbox-streams@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-5.1.4.tgz#05754e5e3667bdc078df2c9315b3f41210d8cac0" + integrity sha512-xU8yuF1hI/XcVhJUAfbQLa1guQUhdLMPQJkdT0kn6HP5CwiPOGiXnSFq80rAG4b1kJUChQQIGPrq439FQUNVrw== + dependencies: + workbox-core "^5.1.4" + workbox-routing "^5.1.4" + +workbox-sw@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-5.1.4.tgz#2bb34c9f7381f90d84cef644816d45150011d3db" + integrity sha512-9xKnKw95aXwSNc8kk8gki4HU0g0W6KXu+xks7wFuC7h0sembFnTrKtckqZxbSod41TDaGh+gWUA5IRXrL0ECRA== + +workbox-webpack-plugin@5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-5.1.4.tgz#7bfe8c16e40fe9ed8937080ac7ae9c8bde01e79c" + integrity sha512-PZafF4HpugZndqISi3rZ4ZK4A4DxO8rAqt2FwRptgsDx7NF8TVKP86/huHquUsRjMGQllsNdn4FNl8CD/UvKmQ== + dependencies: + "@babel/runtime" "^7.5.5" + fast-json-stable-stringify "^2.0.0" + source-map-url "^0.4.0" + upath "^1.1.2" + webpack-sources "^1.3.0" + workbox-build "^5.1.4" + +workbox-window@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-5.1.4.tgz#2740f7dea7f93b99326179a62f1cc0ca2c93c863" + integrity sha512-vXQtgTeMCUq/4pBWMfQX8Ee7N2wVC4Q7XYFqLnfbXJ2hqew/cU1uMTD2KqGEgEpE4/30luxIxgE+LkIa8glBYw== + dependencies: + workbox-core "^5.1.4" + +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" + +worker-rpc@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/worker-rpc/-/worker-rpc-0.1.1.tgz#cb565bd6d7071a8f16660686051e969ad32f54d5" + integrity sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg== + dependencies: + microevent.ts "~0.1.1" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +ws@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" + integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== + dependencies: + async-limiter "~1.0.0" + +ws@^7.2.3: + version "7.4.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.3.tgz#1f9643de34a543b8edb124bdcbc457ae55a6e5cd" + integrity sha512-hr6vCR76GsossIRsr8OLR9acVVm1jyfEWvhbNjtgPOrfvAlKzvyeg/P6r8RuDjRyrcQoPQT7K0DGEPc7Ae6jzA== + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +xtend@^4.0.0, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" + integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0, yaml@^1.7.2: + version "1.10.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" + integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== + +yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs@^13.3.2: + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + dependencies: + 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" + +yargs@^15.4.1: + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.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 "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==