From 95535bffa85aa02fbfc91819deb06bd50e385575 Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Thu, 11 Apr 2019 14:31:51 +0000 Subject: [PATCH 0001/1168] Auth: Add Keycloak config file and docker-compose file --- auth/README.md | 9 + auth/deploy/compose/docker-compose.yml | 36 + auth/ods-userservice-realm.json | 1719 ++++++++++++++++++++++++ 3 files changed, 1764 insertions(+) create mode 100644 auth/README.md create mode 100644 auth/deploy/compose/docker-compose.yml create mode 100644 auth/ods-userservice-realm.json diff --git a/auth/README.md b/auth/README.md new file mode 100644 index 000000000..af88498d8 --- /dev/null +++ b/auth/README.md @@ -0,0 +1,9 @@ +# Authentication + +## Introduction + +## Getting Started + +Run `docker-compose -f deploy/compose up` to start Keycloak service with the configuration from the `ods-userservice-realm.json` file. + +Keycload configuration UI is available on url `http://localhost:8080/auth/`. The default username is `admin` and default password is `Pa55w0rd`. diff --git a/auth/deploy/compose/docker-compose.yml b/auth/deploy/compose/docker-compose.yml new file mode 100644 index 000000000..a4d61323e --- /dev/null +++ b/auth/deploy/compose/docker-compose.yml @@ -0,0 +1,36 @@ +version: "3" + +volumes: + postgres_data: + driver: local + +services: + postgres: + image: postgres + volumes: + - postgres_data:/var/lib/postgresql/data + environment: + POSTGRES_DB: keycloak + POSTGRES_USER: keycloak + POSTGRES_PASSWORD: password + keycloak: + image: jboss/keycloak + environment: + DB_VENDOR: POSTGRES + DB_ADDR: postgres + DB_DATABASE: keycloak + DB_USER: keycloak + DB_PASSWORD: password + KEYCLOAK_USER: admin + KEYCLOAK_PASSWORD: Pa55w0rd + + #import realm + KEYCLOAK_IMPORT: /tmp/realm.json + + #realm volume + volumes: + - "./../../ods-userservice-realm.json:/tmp/realm.json" + ports: + - 8080:8080 + depends_on: + - postgres diff --git a/auth/ods-userservice-realm.json b/auth/ods-userservice-realm.json new file mode 100644 index 000000000..cfca73be5 --- /dev/null +++ b/auth/ods-userservice-realm.json @@ -0,0 +1,1719 @@ +{ + "id": "ods-userservice", + "realm": "ods-userservice", + "notBefore": 0, + "revokeRefreshToken": false, + "refreshTokenMaxReuse": 0, + "accessTokenLifespan": 300, + "accessTokenLifespanForImplicitFlow": 900, + "ssoSessionIdleTimeout": 1800, + "ssoSessionMaxLifespan": 36000, + "ssoSessionIdleTimeoutRememberMe": 0, + "ssoSessionMaxLifespanRememberMe": 0, + "offlineSessionIdleTimeout": 2592000, + "offlineSessionMaxLifespanEnabled": false, + "offlineSessionMaxLifespan": 5184000, + "accessCodeLifespan": 60, + "accessCodeLifespanUserAction": 300, + "accessCodeLifespanLogin": 1800, + "actionTokenGeneratedByAdminLifespan": 43200, + "actionTokenGeneratedByUserLifespan": 300, + "enabled": true, + "sslRequired": "external", + "registrationAllowed": true, + "registrationEmailAsUsername": false, + "rememberMe": false, + "verifyEmail": false, + "loginWithEmailAllowed": true, + "duplicateEmailsAllowed": false, + "resetPasswordAllowed": false, + "editUsernameAllowed": false, + "bruteForceProtected": false, + "permanentLockout": false, + "maxFailureWaitSeconds": 900, + "minimumQuickLoginWaitSeconds": 60, + "waitIncrementSeconds": 60, + "quickLoginCheckMilliSeconds": 1000, + "maxDeltaTimeSeconds": 43200, + "failureFactor": 30, + "users": [ + { + "username": "demo", + "firstName": "Jerome", + "lastName": "Ferrari", + "email": "email@internet.com", + "enabled": true, + "credentials": [{ "type": "password", "value": "demo" }], + "realmRoles": ["uma_authorization", "offline_access"], + "clientRoles": { "account": ["manage-account"] } + } + ], + "roles": { + "realm": [ + { + "id": "4609903c-98ea-4f6c-bc6d-8dbf08849f29", + "name": "offline_access", + "description": "${role_offline-access}", + "composite": false, + "clientRole": false, + "containerId": "ods-userservice", + "attributes": {} + }, + { + "id": "8a08c0c5-54a9-497c-b370-4567c3217791", + "name": "uma_authorization", + "description": "${role_uma_authorization}", + "composite": false, + "clientRole": false, + "containerId": "ods-userservice", + "attributes": {} + } + ], + "client": { + "realm-management": [ + { + "id": "cf6c29e8-2ccc-47d1-9868-d62c28cec2c0", + "name": "create-client", + "description": "${role_create-client}", + "composite": false, + "clientRole": true, + "containerId": "e56fcce7-c775-452f-bfc8-c7525e1cf461", + "attributes": {} + }, + { + "id": "73b61cc4-7eed-4b6b-b583-afc82eb67530", + "name": "query-groups", + "description": "${role_query-groups}", + "composite": false, + "clientRole": true, + "containerId": "e56fcce7-c775-452f-bfc8-c7525e1cf461", + "attributes": {} + }, + { + "id": "ba3d920e-1ff5-42be-807b-a27a96a20580", + "name": "view-identity-providers", + "description": "${role_view-identity-providers}", + "composite": false, + "clientRole": true, + "containerId": "e56fcce7-c775-452f-bfc8-c7525e1cf461", + "attributes": {} + }, + { + "id": "dfc26ccc-88cc-47dd-8014-2040b9f963c7", + "name": "view-authorization", + "description": "${role_view-authorization}", + "composite": false, + "clientRole": true, + "containerId": "e56fcce7-c775-452f-bfc8-c7525e1cf461", + "attributes": {} + }, + { + "id": "3c765702-bfd9-406e-9032-54ebf4bbd208", + "name": "impersonation", + "description": "${role_impersonation}", + "composite": false, + "clientRole": true, + "containerId": "e56fcce7-c775-452f-bfc8-c7525e1cf461", + "attributes": {} + }, + { + "id": "5a832db3-4fb2-4960-850e-f04348c5e09f", + "name": "view-realm", + "description": "${role_view-realm}", + "composite": false, + "clientRole": true, + "containerId": "e56fcce7-c775-452f-bfc8-c7525e1cf461", + "attributes": {} + }, + { + "id": "26d5ed25-0ef5-400c-a461-0ed0820e6b70", + "name": "query-realms", + "description": "${role_query-realms}", + "composite": false, + "clientRole": true, + "containerId": "e56fcce7-c775-452f-bfc8-c7525e1cf461", + "attributes": {} + }, + { + "id": "70a3157b-70cd-4dbd-b04a-7898086ed037", + "name": "manage-authorization", + "description": "${role_manage-authorization}", + "composite": false, + "clientRole": true, + "containerId": "e56fcce7-c775-452f-bfc8-c7525e1cf461", + "attributes": {} + }, + { + "id": "e1904b48-6335-48a6-85c0-035b35facb7b", + "name": "view-events", + "description": "${role_view-events}", + "composite": false, + "clientRole": true, + "containerId": "e56fcce7-c775-452f-bfc8-c7525e1cf461", + "attributes": {} + }, + { + "id": "0689c275-f37d-4f9b-9e08-2ee5e5d3fdc0", + "name": "manage-realm", + "description": "${role_manage-realm}", + "composite": false, + "clientRole": true, + "containerId": "e56fcce7-c775-452f-bfc8-c7525e1cf461", + "attributes": {} + }, + { + "id": "5defa5d3-5a61-4477-aaba-214080dee283", + "name": "query-clients", + "description": "${role_query-clients}", + "composite": false, + "clientRole": true, + "containerId": "e56fcce7-c775-452f-bfc8-c7525e1cf461", + "attributes": {} + }, + { + "id": "248a5956-2c6e-47ec-b0b2-85e84a1d187d", + "name": "query-users", + "description": "${role_query-users}", + "composite": false, + "clientRole": true, + "containerId": "e56fcce7-c775-452f-bfc8-c7525e1cf461", + "attributes": {} + }, + { + "id": "f08da647-1434-447b-b6f4-ab6bf2edca6b", + "name": "manage-clients", + "description": "${role_manage-clients}", + "composite": false, + "clientRole": true, + "containerId": "e56fcce7-c775-452f-bfc8-c7525e1cf461", + "attributes": {} + }, + { + "id": "ba4f7943-a3ad-41ce-b6b5-f14b0fe86a43", + "name": "realm-admin", + "description": "${role_realm-admin}", + "composite": true, + "composites": { + "client": { + "realm-management": [ + "create-client", + "query-groups", + "view-identity-providers", + "view-authorization", + "impersonation", + "view-realm", + "query-realms", + "manage-authorization", + "view-events", + "manage-realm", + "query-clients", + "query-users", + "manage-clients", + "view-clients", + "manage-users", + "manage-identity-providers", + "manage-events", + "view-users" + ] + } + }, + "clientRole": true, + "containerId": "e56fcce7-c775-452f-bfc8-c7525e1cf461", + "attributes": {} + }, + { + "id": "6b923811-6ebc-458e-83c2-4bf49c2819f1", + "name": "view-clients", + "description": "${role_view-clients}", + "composite": true, + "composites": { "client": { "realm-management": ["query-clients"] } }, + "clientRole": true, + "containerId": "e56fcce7-c775-452f-bfc8-c7525e1cf461", + "attributes": {} + }, + { + "id": "b1a3d0fb-705a-4e04-aef5-90008cae1066", + "name": "manage-users", + "description": "${role_manage-users}", + "composite": false, + "clientRole": true, + "containerId": "e56fcce7-c775-452f-bfc8-c7525e1cf461", + "attributes": {} + }, + { + "id": "437e53ac-c7c0-41e7-b726-b0e535dea6bf", + "name": "manage-identity-providers", + "description": "${role_manage-identity-providers}", + "composite": false, + "clientRole": true, + "containerId": "e56fcce7-c775-452f-bfc8-c7525e1cf461", + "attributes": {} + }, + { + "id": "6b30a558-44f3-42fd-a538-899f16db7cab", + "name": "manage-events", + "description": "${role_manage-events}", + "composite": false, + "clientRole": true, + "containerId": "e56fcce7-c775-452f-bfc8-c7525e1cf461", + "attributes": {} + }, + { + "id": "3b6a4bb5-6d95-4624-ad95-0d5a5902e25b", + "name": "view-users", + "description": "${role_view-users}", + "composite": true, + "composites": { + "client": { "realm-management": ["query-groups", "query-users"] } + }, + "clientRole": true, + "containerId": "e56fcce7-c775-452f-bfc8-c7525e1cf461", + "attributes": {} + } + ], + "transformation-service": [], + "ods-webclient": [], + "security-admin-console": [], + "admin-cli": [], + "broker": [ + { + "id": "d729eea1-e5ac-4386-b498-3104237bb324", + "name": "read-token", + "description": "${role_read-token}", + "composite": false, + "clientRole": true, + "containerId": "ad3f5995-8442-461d-9d0b-afce48ed99d7", + "attributes": {} + } + ], + "account": [ + { + "id": "fe00e3e2-b7f1-4c51-8b36-5ac245428468", + "name": "manage-account", + "description": "${role_manage-account}", + "composite": true, + "composites": { "client": { "account": ["manage-account-links"] } }, + "clientRole": true, + "containerId": "4c7adfd3-f9c1-4d33-9809-9be337309252", + "attributes": {} + }, + { + "id": "90a1a8e4-e259-4a52-b47f-8ab6fbcf43a1", + "name": "view-profile", + "description": "${role_view-profile}", + "composite": false, + "clientRole": true, + "containerId": "4c7adfd3-f9c1-4d33-9809-9be337309252", + "attributes": {} + }, + { + "id": "aa5a9eba-6c1e-450c-b017-99b1b5717425", + "name": "manage-account-links", + "description": "${role_manage-account-links}", + "composite": false, + "clientRole": true, + "containerId": "4c7adfd3-f9c1-4d33-9809-9be337309252", + "attributes": {} + } + ] + } + }, + "groups": [], + "defaultRoles": ["offline_access", "uma_authorization"], + "requiredCredentials": ["password"], + "otpPolicyType": "totp", + "otpPolicyAlgorithm": "HmacSHA1", + "otpPolicyInitialCounter": 0, + "otpPolicyDigits": 6, + "otpPolicyLookAheadWindow": 1, + "otpPolicyPeriod": 30, + "otpSupportedApplications": ["FreeOTP", "Google Authenticator"], + "scopeMappings": [ + { "clientScope": "offline_access", "roles": ["offline_access"] } + ], + "clients": [ + { + "id": "aa2b33fc-45be-4c8b-96e5-cdf60905e03c", + "clientId": "security-admin-console", + "name": "${client_security-admin-console}", + "baseUrl": "/auth/admin/ods-userservice/console/index.html", + "surrogateAuthRequired": false, + "enabled": true, + "clientAuthenticatorType": "client-secret", + "secret": "**********", + "redirectUris": ["/auth/admin/ods-userservice/console/*"], + "webOrigins": [], + "notBefore": 0, + "bearerOnly": false, + "consentRequired": false, + "standardFlowEnabled": true, + "implicitFlowEnabled": false, + "directAccessGrantsEnabled": false, + "serviceAccountsEnabled": false, + "publicClient": true, + "frontchannelLogout": false, + "protocol": "openid-connect", + "attributes": {}, + "authenticationFlowBindingOverrides": {}, + "fullScopeAllowed": false, + "nodeReRegistrationTimeout": 0, + "protocolMappers": [ + { + "id": "6294ee33-2dcc-4cf4-b206-3f90fe151a5a", + "name": "locale", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "locale", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "locale", + "jsonType.label": "String" + } + } + ], + "defaultClientScopes": [ + "web-origins", + "role_list", + "profile", + "roles", + "email" + ], + "optionalClientScopes": ["address", "phone", "offline_access"] + }, + { + "id": "4c7adfd3-f9c1-4d33-9809-9be337309252", + "clientId": "account", + "name": "${client_account}", + "baseUrl": "/auth/realms/ods-userservice/account", + "surrogateAuthRequired": false, + "enabled": true, + "clientAuthenticatorType": "client-secret", + "secret": "**********", + "defaultRoles": ["view-profile", "manage-account"], + "redirectUris": ["/auth/realms/ods-userservice/account/*"], + "webOrigins": [], + "notBefore": 0, + "bearerOnly": false, + "consentRequired": false, + "standardFlowEnabled": true, + "implicitFlowEnabled": false, + "directAccessGrantsEnabled": false, + "serviceAccountsEnabled": false, + "publicClient": false, + "frontchannelLogout": false, + "protocol": "openid-connect", + "attributes": {}, + "authenticationFlowBindingOverrides": {}, + "fullScopeAllowed": false, + "nodeReRegistrationTimeout": 0, + "defaultClientScopes": [ + "web-origins", + "role_list", + "profile", + "roles", + "email" + ], + "optionalClientScopes": ["address", "phone", "offline_access"] + }, + { + "id": "27a3d3c8-a10c-4965-96ee-0c3b31afa476", + "clientId": "admin-cli", + "name": "${client_admin-cli}", + "surrogateAuthRequired": false, + "enabled": true, + "clientAuthenticatorType": "client-secret", + "secret": "**********", + "redirectUris": [], + "webOrigins": [], + "notBefore": 0, + "bearerOnly": false, + "consentRequired": false, + "standardFlowEnabled": false, + "implicitFlowEnabled": false, + "directAccessGrantsEnabled": true, + "serviceAccountsEnabled": false, + "publicClient": true, + "frontchannelLogout": false, + "protocol": "openid-connect", + "attributes": {}, + "authenticationFlowBindingOverrides": {}, + "fullScopeAllowed": false, + "nodeReRegistrationTimeout": 0, + "defaultClientScopes": [ + "web-origins", + "role_list", + "profile", + "roles", + "email" + ], + "optionalClientScopes": ["address", "phone", "offline_access"] + }, + { + "id": "fe200edb-6338-46b7-9597-f372e63ef5b8", + "clientId": "transformation-service", + "rootUrl": "", + "adminUrl": "", + "surrogateAuthRequired": false, + "enabled": true, + "clientAuthenticatorType": "client-secret", + "secret": "**********", + "redirectUris": ["http://localhost:4000/*"], + "webOrigins": ["http://localhost:4000/*"], + "notBefore": 0, + "bearerOnly": true, + "consentRequired": false, + "standardFlowEnabled": true, + "implicitFlowEnabled": false, + "directAccessGrantsEnabled": true, + "serviceAccountsEnabled": false, + "publicClient": false, + "frontchannelLogout": false, + "protocol": "openid-connect", + "attributes": { + "saml.assertion.signature": "false", + "saml.multivalued.roles": "false", + "saml.force.post.binding": "false", + "saml.encrypt": "false", + "saml.server.signature": "false", + "saml.server.signature.keyinfo.ext": "false", + "exclude.session.state.from.auth.response": "false", + "saml_force_name_id_format": "false", + "saml.client.signature": "false", + "tls.client.certificate.bound.access.tokens": "false", + "saml.authnstatement": "false", + "display.on.consent.screen": "false", + "saml.onetimeuse.condition": "false" + }, + "authenticationFlowBindingOverrides": {}, + "fullScopeAllowed": true, + "nodeReRegistrationTimeout": -1, + "defaultClientScopes": [ + "web-origins", + "role_list", + "profile", + "roles", + "email" + ], + "optionalClientScopes": ["address", "phone", "offline_access"] + }, + { + "id": "e56fcce7-c775-452f-bfc8-c7525e1cf461", + "clientId": "realm-management", + "name": "${client_realm-management}", + "surrogateAuthRequired": false, + "enabled": true, + "clientAuthenticatorType": "client-secret", + "secret": "**********", + "redirectUris": [], + "webOrigins": [], + "notBefore": 0, + "bearerOnly": true, + "consentRequired": false, + "standardFlowEnabled": true, + "implicitFlowEnabled": false, + "directAccessGrantsEnabled": false, + "serviceAccountsEnabled": false, + "publicClient": false, + "frontchannelLogout": false, + "protocol": "openid-connect", + "attributes": {}, + "authenticationFlowBindingOverrides": {}, + "fullScopeAllowed": false, + "nodeReRegistrationTimeout": 0, + "defaultClientScopes": [ + "web-origins", + "role_list", + "profile", + "roles", + "email" + ], + "optionalClientScopes": ["address", "phone", "offline_access"] + }, + { + "id": "ad3f5995-8442-461d-9d0b-afce48ed99d7", + "clientId": "broker", + "name": "${client_broker}", + "surrogateAuthRequired": false, + "enabled": true, + "clientAuthenticatorType": "client-secret", + "secret": "**********", + "redirectUris": [], + "webOrigins": [], + "notBefore": 0, + "bearerOnly": false, + "consentRequired": false, + "standardFlowEnabled": true, + "implicitFlowEnabled": false, + "directAccessGrantsEnabled": false, + "serviceAccountsEnabled": false, + "publicClient": false, + "frontchannelLogout": false, + "protocol": "openid-connect", + "attributes": {}, + "authenticationFlowBindingOverrides": {}, + "fullScopeAllowed": false, + "nodeReRegistrationTimeout": 0, + "defaultClientScopes": [ + "web-origins", + "role_list", + "profile", + "roles", + "email" + ], + "optionalClientScopes": ["address", "phone", "offline_access"] + }, + { + "id": "c13eb0c7-c4bd-47aa-afcd-18d187f72806", + "clientId": "ods-webclient", + "surrogateAuthRequired": false, + "enabled": true, + "clientAuthenticatorType": "client-secret", + "secret": "**********", + "redirectUris": ["http://localhost:3000/*"], + "webOrigins": ["*"], + "notBefore": 0, + "bearerOnly": false, + "consentRequired": false, + "standardFlowEnabled": true, + "implicitFlowEnabled": false, + "directAccessGrantsEnabled": true, + "serviceAccountsEnabled": true, + "publicClient": true, + "frontchannelLogout": false, + "protocol": "openid-connect", + "attributes": { + "saml.assertion.signature": "false", + "saml.multivalued.roles": "false", + "saml.force.post.binding": "false", + "saml.encrypt": "false", + "login_theme": "keycloak", + "saml.server.signature": "false", + "saml.server.signature.keyinfo.ext": "false", + "exclude.session.state.from.auth.response": "false", + "saml_force_name_id_format": "false", + "saml.client.signature": "false", + "tls.client.certificate.bound.access.tokens": "false", + "saml.authnstatement": "false", + "display.on.consent.screen": "false", + "saml.onetimeuse.condition": "false" + }, + "authenticationFlowBindingOverrides": {}, + "fullScopeAllowed": true, + "nodeReRegistrationTimeout": -1, + "protocolMappers": [ + { + "id": "114169d4-925e-467d-bc7c-7af5627dad55", + "name": "Client ID", + "protocol": "openid-connect", + "protocolMapper": "oidc-usersessionmodel-note-mapper", + "consentRequired": false, + "config": { + "user.session.note": "clientId", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "clientId", + "jsonType.label": "String" + } + }, + { + "id": "cbd0644f-f801-47fe-91d9-766fc1d6b585", + "name": "Client Host", + "protocol": "openid-connect", + "protocolMapper": "oidc-usersessionmodel-note-mapper", + "consentRequired": false, + "config": { + "user.session.note": "clientHost", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "clientHost", + "jsonType.label": "String" + } + }, + { + "id": "33a3938b-bbb0-45db-a250-18f326479c6a", + "name": "Client IP Address", + "protocol": "openid-connect", + "protocolMapper": "oidc-usersessionmodel-note-mapper", + "consentRequired": false, + "config": { + "user.session.note": "clientAddress", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "clientAddress", + "jsonType.label": "String" + } + } + ], + "defaultClientScopes": [ + "web-origins", + "role_list", + "profile", + "roles", + "email" + ], + "optionalClientScopes": ["address", "phone", "offline_access"] + } + ], + "clientScopes": [ + { + "id": "75c69f35-cc9c-4304-8f78-fdb569403645", + "name": "offline_access", + "description": "OpenID Connect built-in scope: offline_access", + "protocol": "openid-connect", + "attributes": { + "consent.screen.text": "${offlineAccessScopeConsentText}", + "display.on.consent.screen": "true" + } + }, + { + "id": "51ce9d07-4357-4d14-aa3e-05b405704c61", + "name": "role_list", + "description": "SAML role list", + "protocol": "saml", + "attributes": { + "consent.screen.text": "${samlRoleListScopeConsentText}", + "display.on.consent.screen": "true" + }, + "protocolMappers": [ + { + "id": "c704f540-8710-4c2f-9702-f6a9350d5d6f", + "name": "role list", + "protocol": "saml", + "protocolMapper": "saml-role-list-mapper", + "consentRequired": false, + "config": { + "single": "false", + "attribute.nameformat": "Basic", + "attribute.name": "Role" + } + } + ] + }, + { + "id": "def8a5f1-fec1-49d4-ad27-3ce354f3d97a", + "name": "profile", + "description": "OpenID Connect built-in scope: profile", + "protocol": "openid-connect", + "attributes": { + "include.in.token.scope": "true", + "display.on.consent.screen": "true", + "consent.screen.text": "${profileScopeConsentText}" + }, + "protocolMappers": [ + { + "id": "03c9d11b-13cc-45d2-8156-b65aeeb80cfd", + "name": "gender", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "gender", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "gender", + "jsonType.label": "String" + } + }, + { + "id": "871988e4-af0e-4119-a213-c88fd6a40b82", + "name": "username", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-property-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "username", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "preferred_username", + "jsonType.label": "String" + } + }, + { + "id": "40610c56-c9f1-4926-b8f0-425542fba2bd", + "name": "picture", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "picture", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "picture", + "jsonType.label": "String" + } + }, + { + "id": "a64456bd-04c7-49ed-8a6d-3808bc83f323", + "name": "zoneinfo", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "zoneinfo", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "zoneinfo", + "jsonType.label": "String" + } + }, + { + "id": "e54b3b20-5189-4655-9db5-bfeb30d2384e", + "name": "birthdate", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "birthdate", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "birthdate", + "jsonType.label": "String" + } + }, + { + "id": "30383ac0-4330-4a79-82aa-3d7a5a77ff3c", + "name": "given name", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-property-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "firstName", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "given_name", + "jsonType.label": "String" + } + }, + { + "id": "661e6bbd-7e85-45a6-b1d8-4b1cf364a24a", + "name": "family name", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-property-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "lastName", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "family_name", + "jsonType.label": "String" + } + }, + { + "id": "2684fd36-d95a-47b0-8131-3fe1a9ecaf07", + "name": "full name", + "protocol": "openid-connect", + "protocolMapper": "oidc-full-name-mapper", + "consentRequired": false, + "config": { + "id.token.claim": "true", + "access.token.claim": "true", + "userinfo.token.claim": "true" + } + }, + { + "id": "79cf8736-c337-464b-95ef-a9798a07847a", + "name": "locale", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "locale", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "locale", + "jsonType.label": "String" + } + }, + { + "id": "33bbc7b9-4195-4430-8863-5f419cf6da4f", + "name": "middle name", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "middleName", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "middle_name", + "jsonType.label": "String" + } + }, + { + "id": "38ebec43-9720-4e7a-a09c-47123cf9e98a", + "name": "nickname", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "nickname", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "nickname", + "jsonType.label": "String" + } + }, + { + "id": "aed26d7e-13de-44c3-8869-53396ef9828f", + "name": "updated at", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "updatedAt", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "updated_at", + "jsonType.label": "String" + } + }, + { + "id": "032fe6fc-ff4a-4f9d-be6a-be57dff58b27", + "name": "website", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "website", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "website", + "jsonType.label": "String" + } + }, + { + "id": "dfac399f-d235-47dd-9322-ae94001a8510", + "name": "profile", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "profile", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "profile", + "jsonType.label": "String" + } + } + ] + }, + { + "id": "caabac93-bcc6-4644-87fa-4ecde5b8d211", + "name": "email", + "description": "OpenID Connect built-in scope: email", + "protocol": "openid-connect", + "attributes": { + "include.in.token.scope": "true", + "display.on.consent.screen": "true", + "consent.screen.text": "${emailScopeConsentText}" + }, + "protocolMappers": [ + { + "id": "5a49669e-6588-4f14-92a0-38011af4f6a1", + "name": "email", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-property-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "email", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "email", + "jsonType.label": "String" + } + }, + { + "id": "89d94fcd-d8a5-4c43-9fe9-f85d08add08c", + "name": "email verified", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-property-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "emailVerified", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "email_verified", + "jsonType.label": "boolean" + } + } + ] + }, + { + "id": "4281e89e-bcfe-4a59-b890-69b330778444", + "name": "address", + "description": "OpenID Connect built-in scope: address", + "protocol": "openid-connect", + "attributes": { + "include.in.token.scope": "true", + "display.on.consent.screen": "true", + "consent.screen.text": "${addressScopeConsentText}" + }, + "protocolMappers": [ + { + "id": "73f7d3b1-c986-4b24-b9ab-b48d913a0b77", + "name": "address", + "protocol": "openid-connect", + "protocolMapper": "oidc-address-mapper", + "consentRequired": false, + "config": { + "user.attribute.formatted": "formatted", + "user.attribute.country": "country", + "user.attribute.postal_code": "postal_code", + "userinfo.token.claim": "true", + "user.attribute.street": "street", + "id.token.claim": "true", + "user.attribute.region": "region", + "access.token.claim": "true", + "user.attribute.locality": "locality" + } + } + ] + }, + { + "id": "cebf8ed5-8be7-4711-ab48-7f08becea35a", + "name": "phone", + "description": "OpenID Connect built-in scope: phone", + "protocol": "openid-connect", + "attributes": { + "include.in.token.scope": "true", + "display.on.consent.screen": "true", + "consent.screen.text": "${phoneScopeConsentText}" + }, + "protocolMappers": [ + { + "id": "217f3f03-abcd-4743-bfe9-ef20939b815d", + "name": "phone number verified", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "phoneNumberVerified", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "phone_number_verified", + "jsonType.label": "boolean" + } + }, + { + "id": "3734ef8e-87ca-4421-aba9-4e88b6a78489", + "name": "phone number", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "phoneNumber", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "phone_number", + "jsonType.label": "String" + } + } + ] + }, + { + "id": "b1fbced9-509d-41c4-bc9b-da8a28259fb9", + "name": "roles", + "description": "OpenID Connect scope for add user roles to the access token", + "protocol": "openid-connect", + "attributes": { + "include.in.token.scope": "false", + "display.on.consent.screen": "true", + "consent.screen.text": "${rolesScopeConsentText}" + }, + "protocolMappers": [ + { + "id": "3962c26f-f81b-46f1-96ac-e34e5af374a8", + "name": "realm roles", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-realm-role-mapper", + "consentRequired": false, + "config": { + "user.attribute": "foo", + "access.token.claim": "true", + "claim.name": "realm_access.roles", + "jsonType.label": "String", + "multivalued": "true" + } + }, + { + "id": "07dc0f5a-e032-4107-8219-2430dfa3cf08", + "name": "client roles", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-client-role-mapper", + "consentRequired": false, + "config": { + "user.attribute": "foo", + "access.token.claim": "true", + "claim.name": "resource_access.${client_id}.roles", + "jsonType.label": "String", + "multivalued": "true" + } + }, + { + "id": "9099ec4b-7dca-43a5-8dd6-64c51a6f4101", + "name": "audience resolve", + "protocol": "openid-connect", + "protocolMapper": "oidc-audience-resolve-mapper", + "consentRequired": false, + "config": {} + } + ] + }, + { + "id": "bad232e9-e8dd-4261-9846-8c6abbbfceff", + "name": "web-origins", + "description": "OpenID Connect scope for add allowed web origins to the access token", + "protocol": "openid-connect", + "attributes": { + "include.in.token.scope": "false", + "display.on.consent.screen": "false", + "consent.screen.text": "" + }, + "protocolMappers": [ + { + "id": "74c55f88-9d31-4cbe-af5f-a5db6b184de3", + "name": "allowed web origins", + "protocol": "openid-connect", + "protocolMapper": "oidc-allowed-origins-mapper", + "consentRequired": false, + "config": {} + } + ] + } + ], + "defaultDefaultClientScopes": [ + "role_list", + "profile", + "email", + "roles", + "web-origins" + ], + "defaultOptionalClientScopes": ["offline_access", "address", "phone"], + "browserSecurityHeaders": { + "contentSecurityPolicyReportOnly": "", + "xContentTypeOptions": "nosniff", + "xRobotsTag": "none", + "xFrameOptions": "SAMEORIGIN", + "xXSSProtection": "1; mode=block", + "contentSecurityPolicy": "frame-src 'self'; frame-ancestors 'self'; object-src 'none';", + "strictTransportSecurity": "max-age=31536000; includeSubDomains" + }, + "smtpServer": {}, + "eventsEnabled": false, + "eventsListeners": ["jboss-logging"], + "enabledEventTypes": [], + "adminEventsEnabled": false, + "adminEventsDetailsEnabled": false, + "components": { + "org.keycloak.services.clientregistration.policy.ClientRegistrationPolicy": [ + { + "id": "844009ab-1529-45d7-8248-d09ac09347c1", + "name": "Full Scope Disabled", + "providerId": "scope", + "subType": "anonymous", + "subComponents": {}, + "config": {} + }, + { + "id": "0d07f93f-f06b-42c6-8882-f22b1aaf257d", + "name": "Allowed Client Scopes", + "providerId": "allowed-client-templates", + "subType": "anonymous", + "subComponents": {}, + "config": { "allow-default-scopes": ["true"] } + }, + { + "id": "f8ed0446-b28a-44f0-90ae-b4b8fc085947", + "name": "Max Clients Limit", + "providerId": "max-clients", + "subType": "anonymous", + "subComponents": {}, + "config": { "max-clients": ["200"] } + }, + { + "id": "6028271a-a54e-4d04-a210-5df57e85d272", + "name": "Allowed Client Scopes", + "providerId": "allowed-client-templates", + "subType": "authenticated", + "subComponents": {}, + "config": { "allow-default-scopes": ["true"] } + }, + { + "id": "e5f36211-3242-4e25-a8e0-f27deccd0e2b", + "name": "Trusted Hosts", + "providerId": "trusted-hosts", + "subType": "anonymous", + "subComponents": {}, + "config": { + "host-sending-registration-request-must-match": ["true"], + "client-uris-must-match": ["true"] + } + }, + { + "id": "2d7128d4-9a2a-49c2-8f81-859a169866d5", + "name": "Consent Required", + "providerId": "consent-required", + "subType": "anonymous", + "subComponents": {}, + "config": {} + }, + { + "id": "51236d0a-9852-4454-ab24-aba979b7ab11", + "name": "Allowed Protocol Mapper Types", + "providerId": "allowed-protocol-mappers", + "subType": "authenticated", + "subComponents": {}, + "config": { + "allowed-protocol-mapper-types": [ + "oidc-usermodel-property-mapper", + "oidc-sha256-pairwise-sub-mapper", + "saml-role-list-mapper", + "oidc-usermodel-attribute-mapper", + "oidc-address-mapper", + "oidc-full-name-mapper", + "saml-user-attribute-mapper", + "saml-user-property-mapper" + ] + } + }, + { + "id": "ede45320-07fa-4554-af86-5d1531589d74", + "name": "Allowed Protocol Mapper Types", + "providerId": "allowed-protocol-mappers", + "subType": "anonymous", + "subComponents": {}, + "config": { + "allowed-protocol-mapper-types": [ + "saml-user-property-mapper", + "oidc-sha256-pairwise-sub-mapper", + "saml-role-list-mapper", + "saml-user-attribute-mapper", + "oidc-address-mapper", + "oidc-full-name-mapper", + "oidc-usermodel-property-mapper", + "oidc-usermodel-attribute-mapper" + ] + } + } + ], + "org.keycloak.keys.KeyProvider": [ + { + "id": "857aeee5-02a9-4a7e-9880-50500e001c99", + "name": "hmac-generated", + "providerId": "hmac-generated", + "subComponents": {}, + "config": { "priority": ["100"], "algorithm": ["HS256"] } + }, + { + "id": "7139bda7-b9b8-40fc-81a3-d2cccf60d1b1", + "name": "aes-generated", + "providerId": "aes-generated", + "subComponents": {}, + "config": { "priority": ["100"] } + }, + { + "id": "8cb8d479-123b-4c1f-bf4c-6e7d8c1cc286", + "name": "rsa-generated", + "providerId": "rsa-generated", + "subComponents": {}, + "config": { "priority": ["100"] } + } + ] + }, + "internationalizationEnabled": false, + "supportedLocales": [], + "authenticationFlows": [ + { + "id": "d6c1ee25-99dc-4ecf-90ff-26bc57b714ee", + "alias": "Handle Existing Account", + "description": "Handle what to do if there is existing account with same email/username like authenticated identity provider", + "providerId": "basic-flow", + "topLevel": false, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "idp-confirm-link", + "requirement": "REQUIRED", + "priority": 10, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticator": "idp-email-verification", + "requirement": "ALTERNATIVE", + "priority": 20, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "requirement": "ALTERNATIVE", + "priority": 30, + "flowAlias": "Verify Existing Account by Re-authentication", + "userSetupAllowed": false, + "autheticatorFlow": true + } + ] + }, + { + "id": "96b2ad3b-8c31-4d03-b883-b86359b240a8", + "alias": "Verify Existing Account by Re-authentication", + "description": "Reauthentication of existing account", + "providerId": "basic-flow", + "topLevel": false, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "idp-username-password-form", + "requirement": "REQUIRED", + "priority": 10, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticator": "auth-otp-form", + "requirement": "OPTIONAL", + "priority": 20, + "userSetupAllowed": false, + "autheticatorFlow": false + } + ] + }, + { + "id": "e3c373ea-1478-4b67-9c08-d1e832457d4d", + "alias": "browser", + "description": "browser based authentication", + "providerId": "basic-flow", + "topLevel": true, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "auth-cookie", + "requirement": "ALTERNATIVE", + "priority": 10, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticator": "auth-spnego", + "requirement": "DISABLED", + "priority": 20, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticator": "identity-provider-redirector", + "requirement": "ALTERNATIVE", + "priority": 25, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "requirement": "ALTERNATIVE", + "priority": 30, + "flowAlias": "forms", + "userSetupAllowed": false, + "autheticatorFlow": true + } + ] + }, + { + "id": "fe618b60-6152-43fe-92c8-7903193ad70c", + "alias": "clients", + "description": "Base authentication for clients", + "providerId": "client-flow", + "topLevel": true, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "client-secret", + "requirement": "ALTERNATIVE", + "priority": 10, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticator": "client-jwt", + "requirement": "ALTERNATIVE", + "priority": 20, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticator": "client-secret-jwt", + "requirement": "ALTERNATIVE", + "priority": 30, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticator": "client-x509", + "requirement": "ALTERNATIVE", + "priority": 40, + "userSetupAllowed": false, + "autheticatorFlow": false + } + ] + }, + { + "id": "636ed2b4-b067-470b-897f-b1f60a5a0cf2", + "alias": "direct grant", + "description": "OpenID Connect Resource Owner Grant", + "providerId": "basic-flow", + "topLevel": true, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "direct-grant-validate-username", + "requirement": "REQUIRED", + "priority": 10, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticator": "direct-grant-validate-password", + "requirement": "REQUIRED", + "priority": 20, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticator": "direct-grant-validate-otp", + "requirement": "OPTIONAL", + "priority": 30, + "userSetupAllowed": false, + "autheticatorFlow": false + } + ] + }, + { + "id": "5a330123-8ad3-4aca-ba3b-a2d885991a77", + "alias": "docker auth", + "description": "Used by Docker clients to authenticate against the IDP", + "providerId": "basic-flow", + "topLevel": true, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "docker-http-basic-authenticator", + "requirement": "REQUIRED", + "priority": 10, + "userSetupAllowed": false, + "autheticatorFlow": false + } + ] + }, + { + "id": "8f2ce50b-b7e3-4416-93dc-fc7557de90a1", + "alias": "first broker login", + "description": "Actions taken after first broker login with identity provider account, which is not yet linked to any Keycloak account", + "providerId": "basic-flow", + "topLevel": true, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticatorConfig": "review profile config", + "authenticator": "idp-review-profile", + "requirement": "REQUIRED", + "priority": 10, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticatorConfig": "create unique user config", + "authenticator": "idp-create-user-if-unique", + "requirement": "ALTERNATIVE", + "priority": 20, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "requirement": "ALTERNATIVE", + "priority": 30, + "flowAlias": "Handle Existing Account", + "userSetupAllowed": false, + "autheticatorFlow": true + } + ] + }, + { + "id": "d1253bb6-eb18-4ae3-baea-d3bf231513e6", + "alias": "forms", + "description": "Username, password, otp and other auth forms.", + "providerId": "basic-flow", + "topLevel": false, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "auth-username-password-form", + "requirement": "REQUIRED", + "priority": 10, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticator": "auth-otp-form", + "requirement": "OPTIONAL", + "priority": 20, + "userSetupAllowed": false, + "autheticatorFlow": false + } + ] + }, + { + "id": "d6591d82-2bcc-40d1-a209-19a5f9cf9021", + "alias": "http challenge", + "description": "An authentication flow based on challenge-response HTTP Authentication Schemes", + "providerId": "basic-flow", + "topLevel": true, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "no-cookie-redirect", + "requirement": "REQUIRED", + "priority": 10, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticator": "basic-auth", + "requirement": "REQUIRED", + "priority": 20, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticator": "basic-auth-otp", + "requirement": "DISABLED", + "priority": 30, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticator": "auth-spnego", + "requirement": "DISABLED", + "priority": 40, + "userSetupAllowed": false, + "autheticatorFlow": false + } + ] + }, + { + "id": "407fdb64-c563-4c48-824e-0ec9232b6d47", + "alias": "registration", + "description": "registration flow", + "providerId": "basic-flow", + "topLevel": true, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "registration-page-form", + "requirement": "REQUIRED", + "priority": 10, + "flowAlias": "registration form", + "userSetupAllowed": false, + "autheticatorFlow": true + } + ] + }, + { + "id": "2e14426b-ca8c-4b27-8381-1c363f7f61f0", + "alias": "registration form", + "description": "registration form", + "providerId": "form-flow", + "topLevel": false, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "registration-user-creation", + "requirement": "REQUIRED", + "priority": 20, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticator": "registration-profile-action", + "requirement": "REQUIRED", + "priority": 40, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticator": "registration-password-action", + "requirement": "REQUIRED", + "priority": 50, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticator": "registration-recaptcha-action", + "requirement": "DISABLED", + "priority": 60, + "userSetupAllowed": false, + "autheticatorFlow": false + } + ] + }, + { + "id": "eaa896bb-77a8-4f0f-8278-ef8b5df2eb7e", + "alias": "reset credentials", + "description": "Reset credentials for a user if they forgot their password or something", + "providerId": "basic-flow", + "topLevel": true, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "reset-credentials-choose-user", + "requirement": "REQUIRED", + "priority": 10, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticator": "reset-credential-email", + "requirement": "REQUIRED", + "priority": 20, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticator": "reset-password", + "requirement": "REQUIRED", + "priority": 30, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticator": "reset-otp", + "requirement": "OPTIONAL", + "priority": 40, + "userSetupAllowed": false, + "autheticatorFlow": false + } + ] + }, + { + "id": "c831f013-dcfd-4fd0-8be8-1219a17182b1", + "alias": "saml ecp", + "description": "SAML ECP Profile Authentication Flow", + "providerId": "basic-flow", + "topLevel": true, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "http-basic-authenticator", + "requirement": "REQUIRED", + "priority": 10, + "userSetupAllowed": false, + "autheticatorFlow": false + } + ] + } + ], + "authenticatorConfig": [ + { + "id": "47f08478-697b-46bd-89bd-3ef622ca9189", + "alias": "create unique user config", + "config": { "require.password.update.after.registration": "false" } + }, + { + "id": "9abefa7d-b833-4063-99ea-99b77ec783da", + "alias": "review profile config", + "config": { "update.profile.on.first.login": "missing" } + } + ], + "requiredActions": [ + { + "alias": "CONFIGURE_TOTP", + "name": "Configure OTP", + "providerId": "CONFIGURE_TOTP", + "enabled": true, + "defaultAction": false, + "priority": 10, + "config": {} + }, + { + "alias": "terms_and_conditions", + "name": "Terms and Conditions", + "providerId": "terms_and_conditions", + "enabled": false, + "defaultAction": false, + "priority": 20, + "config": {} + }, + { + "alias": "UPDATE_PASSWORD", + "name": "Update Password", + "providerId": "UPDATE_PASSWORD", + "enabled": true, + "defaultAction": false, + "priority": 30, + "config": {} + }, + { + "alias": "UPDATE_PROFILE", + "name": "Update Profile", + "providerId": "UPDATE_PROFILE", + "enabled": true, + "defaultAction": false, + "priority": 40, + "config": {} + }, + { + "alias": "VERIFY_EMAIL", + "name": "Verify Email", + "providerId": "VERIFY_EMAIL", + "enabled": true, + "defaultAction": false, + "priority": 50, + "config": {} + } + ], + "browserFlow": "browser", + "registrationFlow": "registration", + "directGrantFlow": "direct grant", + "resetCredentialsFlow": "reset credentials", + "clientAuthenticationFlow": "clients", + "dockerAuthenticationFlow": "docker auth", + "attributes": { + "_browser_header.xXSSProtection": "1; mode=block", + "_browser_header.xFrameOptions": "SAMEORIGIN", + "_browser_header.strictTransportSecurity": "max-age=31536000; includeSubDomains", + "permanentLockout": "false", + "quickLoginCheckMilliSeconds": "1000", + "_browser_header.xRobotsTag": "none", + "maxFailureWaitSeconds": "900", + "minimumQuickLoginWaitSeconds": "60", + "failureFactor": "30", + "actionTokenGeneratedByUserLifespan": "300", + "maxDeltaTimeSeconds": "43200", + "_browser_header.xContentTypeOptions": "nosniff", + "offlineSessionMaxLifespan": "5184000", + "actionTokenGeneratedByAdminLifespan": "43200", + "_browser_header.contentSecurityPolicyReportOnly": "", + "bruteForceProtected": "false", + "_browser_header.contentSecurityPolicy": "frame-src 'self'; frame-ancestors 'self'; object-src 'none';", + "waitIncrementSeconds": "60", + "offlineSessionMaxLifespanEnabled": "false" + }, + "keycloakVersion": "4.8.3.Final", + "userManagedAccessAllowed": false +} From 2ac9d4e406f2922809b5771ed30812c9920b89df Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Fri, 3 May 2019 12:57:41 +0000 Subject: [PATCH 0002/1168] Webclient --- .gitignore | 90 + ui/.browserslistrc | 3 + ui/.editorconfig | 14 + ui/.env.template | 2 + ui/Dockerfile | 25 + ui/LICENSE | 661 ++ ui/LICENSE_HEADER | 2 + ui/README.md | 17 + ui/babel.config.js | 5 + ui/package-lock.json | 10249 +++++++++++++++++ ui/package.json | 42 + ui/postcss.config.js | 5 + ui/public/index.html | 20 + ui/src/App.vue | 87 + ui/src/components/Login.vue | 82 + ui/src/components/auth/module.ts | 72 + ui/src/keycloak.ts | 148 + ui/src/main.ts | 30 + ui/src/router.ts | 43 + ui/src/shims-tsx.d.ts | 13 + ui/src/shims-vue.d.ts | 4 + ui/src/transformation/TransformationMain.vue | 36 + ui/src/transformation/module.ts | 16 + ui/src/transformation/router.ts | 10 + ui/src/transformation/transformationRest.ts | 25 + ui/src/views/About.vue | 5 + ui/src/views/Home.vue | 14 + ui/tsconfig.json | 29 + ui/tslint.json | 17 + ui/vue.config.js | 9 + 30 files changed, 11775 insertions(+) create mode 100644 .gitignore create mode 100644 ui/.browserslistrc create mode 100644 ui/.editorconfig create mode 100644 ui/.env.template create mode 100644 ui/Dockerfile create mode 100644 ui/LICENSE create mode 100644 ui/LICENSE_HEADER create mode 100644 ui/README.md create mode 100644 ui/babel.config.js create mode 100644 ui/package-lock.json create mode 100644 ui/package.json create mode 100644 ui/postcss.config.js create mode 100644 ui/public/index.html create mode 100644 ui/src/App.vue create mode 100644 ui/src/components/Login.vue create mode 100644 ui/src/components/auth/module.ts create mode 100644 ui/src/keycloak.ts create mode 100644 ui/src/main.ts create mode 100644 ui/src/router.ts create mode 100644 ui/src/shims-tsx.d.ts create mode 100644 ui/src/shims-vue.d.ts create mode 100644 ui/src/transformation/TransformationMain.vue create mode 100644 ui/src/transformation/module.ts create mode 100644 ui/src/transformation/router.ts create mode 100644 ui/src/transformation/transformationRest.ts create mode 100644 ui/src/views/About.vue create mode 100644 ui/src/views/Home.vue create mode 100644 ui/tsconfig.json create mode 100644 ui/tslint.json create mode 100644 ui/vue.config.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..534b0f2f9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,90 @@ + +# Created by https://www.gitignore.io/api/node +# Edit at https://www.gitignore.io/?templates=node + +### Node ### +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# next.js build output +.next + +# nuxt.js build output +.nuxt + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# End of https://www.gitignore.io/api/node + +# JS Files created by tsc +dist/ \ No newline at end of file diff --git a/ui/.browserslistrc b/ui/.browserslistrc new file mode 100644 index 000000000..9dee64646 --- /dev/null +++ b/ui/.browserslistrc @@ -0,0 +1,3 @@ +> 1% +last 2 versions +not ie <= 8 diff --git a/ui/.editorconfig b/ui/.editorconfig new file mode 100644 index 000000000..0301b00a8 --- /dev/null +++ b/ui/.editorconfig @@ -0,0 +1,14 @@ +# Editor configuration, see http://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true +end_of_line = lf + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/ui/.env.template b/ui/.env.template new file mode 100644 index 000000000..f4fc76fd5 --- /dev/null +++ b/ui/.env.template @@ -0,0 +1,2 @@ +VUE_APP_AUTH_SERVER_URL=http://localhost:8080/auth +VUE_APP_TRANSFORMATION_SERVICE_URL='http://localhost:4000/job' \ No newline at end of file diff --git a/ui/Dockerfile b/ui/Dockerfile new file mode 100644 index 000000000..c36c4dd66 --- /dev/null +++ b/ui/Dockerfile @@ -0,0 +1,25 @@ +# First stage: image to build node application +FROM node:lts-alpine as builder + +WORKDIR /build +COPY . . + +# Install dependencies and run build +RUN npm install +RUN npm run build + +# Second stage: image to run node application +FROM node:lts-alpine + +# Install simple http server for serving static content +RUN npm install -g http-server + +RUN mkdir /app +WORKDIR /app + +# Pull the dist files from the builder container +COPY --from=builder /build/dist . + +# Run app +EXPOSE 8080 +CMD [ "http-server", "." ] \ No newline at end of file diff --git a/ui/LICENSE b/ui/LICENSE new file mode 100644 index 000000000..dbbe35581 --- /dev/null +++ b/ui/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/ui/LICENSE_HEADER b/ui/LICENSE_HEADER new file mode 100644 index 000000000..df54a2a62 --- /dev/null +++ b/ui/LICENSE_HEADER @@ -0,0 +1,2 @@ +Copyright (c) 2019 Friedrich-Alexander University Erlangen-Nuernberg (FAU) +SPDX-License-Identifier: AGPL-3.0-only \ No newline at end of file diff --git a/ui/README.md b/ui/README.md new file mode 100644 index 000000000..09fde7b49 --- /dev/null +++ b/ui/README.md @@ -0,0 +1,17 @@ +# ods-webclient + +## Development Setup + +We recomend to use [Visual Studio Code](https://code.visualstudio.com/) for development. + +To ensure a consistent style you should use the following Visual Studio Code extension: + +- Vetur: `ext install octref.vetur` +- TSLint Vue: `ext install prograhammer.tslint-vue` + +To enable auto formating on save go to `File > Preference > Settings` and add the option `"editor.formatOnSave": true`. + +## Running the webclient + +To run the webclient, just execute `npm run serve` in the subprojects root directory (i.e. ui/). +In order to communicate with the underlying microservices you need to create a .env file in the root directory (again ui/) and copy the contents of the .env.template file into it. \ No newline at end of file diff --git a/ui/babel.config.js b/ui/babel.config.js new file mode 100644 index 000000000..ba179669a --- /dev/null +++ b/ui/babel.config.js @@ -0,0 +1,5 @@ +module.exports = { + presets: [ + '@vue/app' + ] +} diff --git a/ui/package-lock.json b/ui/package-lock.json new file mode 100644 index 000000000..650562daf --- /dev/null +++ b/ui/package-lock.json @@ -0,0 +1,10249 @@ +{ + "name": "ods-webclient", + "version": "0.1.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/core": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.2.2.tgz", + "integrity": "sha512-59vB0RWt09cAct5EIe58+NzGP4TFSD3Bz//2/ELy3ZeTeKF6VTD1AXlH8BGGbCX0PuobZBsIzO7IAI9PH67eKw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.2.2", + "@babel/helpers": "^7.2.0", + "@babel/parser": "^7.2.2", + "@babel/template": "^7.2.2", + "@babel/traverse": "^7.2.2", + "@babel/types": "^7.2.2", + "convert-source-map": "^1.1.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.10", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "@babel/generator": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.3.2.tgz", + "integrity": "sha512-f3QCuPppXxtZOEm5GWPra/uYUjmNQlu9pbAD8D/9jze4pTY83rTtB1igTBSwvkeNlC5gR24zFFkz+2WHLFQhqQ==", + "dev": true, + "requires": { + "@babel/types": "^7.3.2", + "jsesc": "^2.5.1", + "lodash": "^4.17.10", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz", + "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz", + "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-call-delegate": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz", + "integrity": "sha512-YEtYZrw3GUK6emQHKthltKNZwszBcHK58Ygcis+gVUrF4/FmTVr5CCqQNSfmvg2y+YDEANyYoaLz/SHsnusCwQ==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.0.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.3.2.tgz", + "integrity": "sha512-tdW8+V8ceh2US4GsYdNVNoohq5uVwOf9k6krjwW4E1lINcHgttnWcNqgdoessn12dAy8QkbezlbQh2nXISNY+A==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-member-expression-to-functions": "^7.0.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.2.3" + } + }, + "@babel/helper-define-map": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz", + "integrity": "sha512-yPPcW8dc3gZLN+U1mhYV91QU3n5uTbx7DUdf8NnPbjS0RMwBuHi9Xt2MUgppmNz7CJxTBWsGczTiEp1CSOTPRg==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/types": "^7.0.0", + "lodash": "^4.17.10" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz", + "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz", + "integrity": "sha512-Ggv5sldXUeSKsuzLkddtyhyHe2YantsxWKNi7A+7LeD12ExRDWTRk29JCXpaHPAbMaIPZSil7n+lq78WY2VY7w==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz", + "integrity": "sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", + "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.2.2.tgz", + "integrity": "sha512-YRD7I6Wsv+IHuTPkAmAS4HhY0dkPobgLftHp0cRGZSdrRvmZY8rFvae/GVu3bD00qscuvK3WPHB3YdNpBXUqrA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "@babel/template": "^7.2.2", + "@babel/types": "^7.2.2", + "lodash": "^4.17.10" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz", + "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", + "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.0.0.tgz", + "integrity": "sha512-TR0/N0NDCcUIUEbqV6dCO+LptmmSQFQ7q70lfcEB4URsjD0E1HzicrwUH+ap6BAQ2jhCX9Q4UqZy4wilujWlkg==", + "dev": true, + "requires": { + "lodash": "^4.17.10" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz", + "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-wrap-function": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-replace-supers": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.2.3.tgz", + "integrity": "sha512-GyieIznGUfPXPWu0yLS6U55Mz67AZD9cUk0BfirOWlPrXlBcan9Gz+vHGz+cPfuoweZSnPzPIm67VtQM0OWZbA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.0.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/traverse": "^7.2.3", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-simple-access": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz", + "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==", + "dev": true, + "requires": { + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz", + "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-wrap-function": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz", + "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.2.0" + } + }, + "@babel/helpers": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.3.1.tgz", + "integrity": "sha512-Q82R3jKsVpUV99mgX50gOPCWwco9Ec5Iln/8Vyu4osNIOQgSrd9RFrQeUvmvddFNoLwMyOUWU+5ckioEKpDoGA==", + "dev": true, + "requires": { + "@babel/template": "^7.1.2", + "@babel/traverse": "^7.1.5", + "@babel/types": "^7.3.0" + } + }, + "@babel/highlight": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", + "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.3.2.tgz", + "integrity": "sha512-QzNUC2RO1gadg+fs21fi0Uu0OuGNzRKEmgCxoLNzbCdoprLwjfmZwzUrpUNfJPaVRwBpDY47A17yYEGWyRelnQ==", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz", + "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0", + "@babel/plugin-syntax-async-generators": "^7.2.0" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.3.0.tgz", + "integrity": "sha512-wNHxLkEKTQ2ay0tnsam2z7fGZUi+05ziDJflEt3AZTP3oXLKHJp9HqhfroB/vdMvt3sda9fAbq7FsG8QPDrZBg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.3.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-proposal-decorators": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.3.0.tgz", + "integrity": "sha512-3W/oCUmsO43FmZIqermmq6TKaRSYhmh/vybPfVFwQWdSb8xwki38uAIvknCRzuyHRuYfCYmJzL9or1v0AffPjg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.3.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-decorators": "^7.2.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", + "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-json-strings": "^7.2.0" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.3.2.tgz", + "integrity": "sha512-DjeMS+J2+lpANkYLLO+m6GjoTMygYglKmRe6cDTbFv3L9i6mmiE8fe6B8MtCSLZpVXscD5kn7s6SgtHrDoBWoA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz", + "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.2.0.tgz", + "integrity": "sha512-LvRVYb7kikuOtIoUeWTkOxQEV1kYvL5B6U3iWEGCzPNRus1MzJweFqORTj+0jkxozkTSYNJozPOddxmqdqsRpw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0", + "regexpu-core": "^4.2.0" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz", + "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-decorators": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.2.0.tgz", + "integrity": "sha512-38QdqVoXdHUQfTpZo3rQwqQdWtCn5tMv4uV6r2RMfTqNBuv4ZBhz79SfaQWKTVmxHjeFv/DnXVC/+agHCklYWA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz", + "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz", + "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz", + "integrity": "sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", + "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz", + "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz", + "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.2.0.tgz", + "integrity": "sha512-CEHzg4g5UraReozI9D4fblBYABs7IM6UerAVG7EJVrTLC5keh00aEuLUT+O40+mJCEzaXkYfTCUKIyeDfMOFFQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz", + "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.2.0.tgz", + "integrity": "sha512-vDTgf19ZEV6mx35yiPJe4fS02mPQUUcBNwWQSZFXSzTSbsJFQvHt7DqyS3LK8oOWALFOsJ+8bbqBgkirZteD5Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "lodash": "^4.17.10" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.2.2.tgz", + "integrity": "sha512-gEZvgTy1VtcDOaQty1l10T3jQmJKlNVxLDCs+3rCVPr6nMkODLELxViq5X9l+rfxbie3XrfrMCYYY6eX3aOcOQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-define-map": "^7.1.0", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz", + "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.3.2.tgz", + "integrity": "sha512-Lrj/u53Ufqxl/sGxyjsJ2XNtNuEjDyjpqdhMNh5aZ+XFOdThL46KBj27Uem4ggoezSYBxKWAil6Hu8HtwqesYw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.2.0.tgz", + "integrity": "sha512-sKxnyHfizweTgKZf7XsXu/CNupKhzijptfTM+bozonIuyVrLWVUvYjE2bhuSBML8VQeMxq4Mm63Q9qvcvUcciQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0", + "regexpu-core": "^4.1.3" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz", + "integrity": "sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz", + "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.2.0.tgz", + "integrity": "sha512-Kz7Mt0SsV2tQk6jG5bBv5phVbkd0gd27SgYD4hH1aLMJRchM0dzHaXvrWhVZ+WxAlDoAKZ7Uy3jVTW2mKXQ1WQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.2.0.tgz", + "integrity": "sha512-kWgksow9lHdvBC2Z4mxTsvc7YdY7w/V6B2vy9cTIPtLEE9NhwoWivaxdNM/S37elu5bqlLP/qOY906LukO9lkQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz", + "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz", + "integrity": "sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.2.0.tgz", + "integrity": "sha512-V6y0uaUQrQPXUrmj+hgnks8va2L0zcZymeU7TtWEgdRLNkceafKXEduv7QzgQAE4lT+suwooG9dC7LFhdRAbVQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.2.0.tgz", + "integrity": "sha512-aYJwpAhoK9a+1+O625WIjvMY11wkB/ok0WClVwmeo3mCjcNRjt+/8gHWrB5i+00mUju0gWsBkQnPpdvQ7PImmQ==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz", + "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.3.0.tgz", + "integrity": "sha512-NxIoNVhk9ZxS+9lSoAQ/LM0V2UEvARLttEHUrRDGKFaAxOYQcrkN/nLRE+BbbicCAvZPl7wMP0X60HsHE5DtQw==", + "dev": true, + "requires": { + "regexp-tree": "^0.1.0" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz", + "integrity": "sha512-yin069FYjah+LbqfGeTfzIBODex/e++Yfa0rH0fpfam9uTbuEeEOx5GLGr210ggOV77mVRNoeqSYqeuaqSzVSw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz", + "integrity": "sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.1.0" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.2.0.tgz", + "integrity": "sha512-kB9+hhUidIgUoBQ0MsxMewhzr8i60nMa2KgeJKQWYrqQpqcBYtnpR+JgkadZVZoaEZ/eKu9mclFaVwhRpLNSzA==", + "dev": true, + "requires": { + "@babel/helper-call-delegate": "^7.1.0", + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz", + "integrity": "sha512-sj2qzsEx8KDVv1QuJc/dEfilkg3RRPvPYx/VnKLtItVQRWt1Wqf5eVCOLZm29CiGFfYYsA3VPjfizTCV0S0Dlw==", + "dev": true, + "requires": { + "regenerator-transform": "^0.13.3" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.2.0.tgz", + "integrity": "sha512-jIgkljDdq4RYDnJyQsiWbdvGeei/0MOTtSHKO/rfbd/mXBxNpdlulMx49L0HQ4pug1fXannxoqCI+fYSle9eSw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "resolve": "^1.8.1", + "semver": "^5.5.1" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz", + "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz", + "integrity": "sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz", + "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.2.0.tgz", + "integrity": "sha512-FkPix00J9A/XWXv4VoKJBMeSkyY9x/TqIh76wzcdfl57RJJcf8CehQ08uwfhCDNtRQYtHQKBTwKZDEyjE13Lwg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz", + "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.2.0.tgz", + "integrity": "sha512-m48Y0lMhrbXEJnVUaYly29jRXbQ3ksxPrS1Tg8t+MHqzXhtBYAvI51euOBaoAlZLPHsieY9XPVMf80a5x0cPcA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0", + "regexpu-core": "^4.1.3" + } + }, + "@babel/preset-env": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.3.1.tgz", + "integrity": "sha512-FHKrD6Dxf30e8xgHQO0zJZpUPfVZg+Xwgz5/RdSWCbza9QLNk4Qbp40ctRoqDxml3O8RMzB1DU55SXeDG6PqHQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-async-generator-functions": "^7.2.0", + "@babel/plugin-proposal-json-strings": "^7.2.0", + "@babel/plugin-proposal-object-rest-spread": "^7.3.1", + "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.2.0", + "@babel/plugin-syntax-async-generators": "^7.2.0", + "@babel/plugin-syntax-json-strings": "^7.2.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", + "@babel/plugin-transform-arrow-functions": "^7.2.0", + "@babel/plugin-transform-async-to-generator": "^7.2.0", + "@babel/plugin-transform-block-scoped-functions": "^7.2.0", + "@babel/plugin-transform-block-scoping": "^7.2.0", + "@babel/plugin-transform-classes": "^7.2.0", + "@babel/plugin-transform-computed-properties": "^7.2.0", + "@babel/plugin-transform-destructuring": "^7.2.0", + "@babel/plugin-transform-dotall-regex": "^7.2.0", + "@babel/plugin-transform-duplicate-keys": "^7.2.0", + "@babel/plugin-transform-exponentiation-operator": "^7.2.0", + "@babel/plugin-transform-for-of": "^7.2.0", + "@babel/plugin-transform-function-name": "^7.2.0", + "@babel/plugin-transform-literals": "^7.2.0", + "@babel/plugin-transform-modules-amd": "^7.2.0", + "@babel/plugin-transform-modules-commonjs": "^7.2.0", + "@babel/plugin-transform-modules-systemjs": "^7.2.0", + "@babel/plugin-transform-modules-umd": "^7.2.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.3.0", + "@babel/plugin-transform-new-target": "^7.0.0", + "@babel/plugin-transform-object-super": "^7.2.0", + "@babel/plugin-transform-parameters": "^7.2.0", + "@babel/plugin-transform-regenerator": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.2.0", + "@babel/plugin-transform-spread": "^7.2.0", + "@babel/plugin-transform-sticky-regex": "^7.2.0", + "@babel/plugin-transform-template-literals": "^7.2.0", + "@babel/plugin-transform-typeof-symbol": "^7.2.0", + "@babel/plugin-transform-unicode-regex": "^7.2.0", + "browserslist": "^4.3.4", + "invariant": "^2.2.2", + "js-levenshtein": "^1.1.3", + "semver": "^5.3.0" + } + }, + "@babel/runtime": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.3.1.tgz", + "integrity": "sha512-7jGW8ppV0ant637pIqAcFfQDDH1orEPGJb8aXfUozuCU3QqX7rX4DA8iwrbPrR1hcH0FTTHz47yQnk+bl5xHQA==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.12.0" + } + }, + "@babel/runtime-corejs2": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.3.1.tgz", + "integrity": "sha512-YpO13776h3e6Wy8dl2J8T9Qwlvopr+b4trCEhHE+yek6yIqV8sx6g3KozdHMbXeBpjosbPi+Ii5Z7X9oXFHUKA==", + "dev": true, + "requires": { + "core-js": "^2.5.7", + "regenerator-runtime": "^0.12.0" + } + }, + "@babel/template": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz", + "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.2.2", + "@babel/types": "^7.2.2" + } + }, + "@babel/traverse": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.2.3.tgz", + "integrity": "sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.2.2", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "@babel/parser": "^7.2.3", + "@babel/types": "^7.2.2", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.10" + } + }, + "@babel/types": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.2.tgz", + "integrity": "sha512-3Y6H8xlUlpbGR+XvawiH0UXehqydTmNmEpozWcXymqwcrwYAl5KMvKtQ+TF6f6E08V6Jur7v/ykdDSF+WDEIXQ==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" + } + }, + "@intervolga/optimize-cssnano-plugin": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@intervolga/optimize-cssnano-plugin/-/optimize-cssnano-plugin-1.0.6.tgz", + "integrity": "sha512-zN69TnSr0viRSU6cEDIcuPcP67QcpQ6uHACg58FiN9PDrU6SLyGW3MR4tiISbYxy1kDWAVPwD+XwQTWE5cigAA==", + "dev": true, + "requires": { + "cssnano": "^4.0.0", + "cssnano-preset-default": "^4.0.0", + "postcss": "^7.0.0" + } + }, + "@mdi/font": { + "version": "3.4.93", + "resolved": "https://registry.npmjs.org/@mdi/font/-/font-3.4.93.tgz", + "integrity": "sha512-iXNInmV6Xlmq8SA1zvYxp4uUA7/Z3cNgiK+Ps8UmHZNn1FLD6KDgeg0XE5RCraK+9qPWl8jsiBMpmbs+RFxI4Q==", + "dev": true + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true + }, + "@soda/friendly-errors-webpack-plugin": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.1.tgz", + "integrity": "sha512-cWKrGaFX+rfbMrAxVv56DzhPNqOJPZuNIS2HGMELtgGzb+vsMzyig9mml5gZ/hr2BGtSLV+dP2LUEuAL8aG2mQ==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "error-stack-parser": "^2.0.0", + "string-width": "^2.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 + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "@types/node": { + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-11.13.5.tgz", + "integrity": "sha512-/OMMBnjVtDuwX1tg2pkYVSqRIDSmNTnvVvmvP/2xiMAAWf4a5+JozrApCrO4WCAILmXVxfNoQ3E+0HJbNpFVGg==" + }, + "@types/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.1.tgz", + "integrity": "sha512-eqz8c/0kwNi/OEHQfvIuJVLTst3in0e7uTKeuY+WL/zfKn0xVujOTp42bS/vUUokhK5P2BppLd9JXMOMHcgbjA==", + "dev": true + }, + "@types/webpack-env": { + "version": "1.13.7", + "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.13.7.tgz", + "integrity": "sha512-rzi6fw7hhxPcCoNVsgysHFlKnhYYvVj7AJwdAO0HQNP5vg9sY0DoRRC1pfuCQm94cOa1sab82HGUtdFlWHIhBg==", + "dev": true + }, + "@vue/babel-helper-vue-jsx-merge-props": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.0.0-beta.2.tgz", + "integrity": "sha512-Yj92Q1GcGjjctecBfnBmVqKSlMdyZaVq10hlZB4HSd1DJgu4cWgpEImJSzcJRUCZmas6UigwE7f4IjJuQs+JvQ==", + "dev": true + }, + "@vue/babel-plugin-transform-vue-jsx": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.0.0-beta.2.tgz", + "integrity": "sha512-fvAymRZAPHitomRE+jIipWRj0STXNSMqeOSdOFu9Ffjqg9WGOxSdCjORxexManfZ2y5QDv7gzI1xfgprsK3nlw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0-beta.2", + "html-tags": "^2.0.0", + "lodash.kebabcase": "^4.1.1", + "svg-tags": "^1.0.0" + } + }, + "@vue/babel-preset-app": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-3.4.0.tgz", + "integrity": "sha512-P7IaOFtMUd5iic2PH/iY6YPgtPnyd7SzA+ACv1283F5RcLutTURhl2smC1cWUJFGVrUhTmsYEcbS4+06wKymWw==", + "dev": true, + "requires": { + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-decorators": "^7.1.0", + "@babel/plugin-syntax-dynamic-import": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.0.0", + "@babel/plugin-transform-runtime": "^7.0.0", + "@babel/preset-env": "^7.0.0", + "@babel/runtime": "^7.0.0", + "@babel/runtime-corejs2": "^7.2.0", + "@vue/babel-preset-jsx": "^1.0.0-beta.2", + "babel-plugin-dynamic-import-node": "^2.2.0", + "core-js": "^2.6.3" + } + }, + "@vue/babel-preset-jsx": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.0.0-beta.2.tgz", + "integrity": "sha512-nZoAKBR/h6iPMQ66ieQcIdlpPBmqhtUUcgjBS541jIVxSog1rwzrc00jlsuecLonzUMWPU0PabyitsG74vhN1w==", + "dev": true, + "requires": { + "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0-beta.2", + "@vue/babel-plugin-transform-vue-jsx": "^1.0.0-beta.2", + "@vue/babel-sugar-functional-vue": "^1.0.0-beta.2", + "@vue/babel-sugar-inject-h": "^1.0.0-beta.2", + "@vue/babel-sugar-v-model": "^1.0.0-beta.2", + "@vue/babel-sugar-v-on": "^1.0.0-beta.2" + } + }, + "@vue/babel-sugar-functional-vue": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.0.0-beta.2.tgz", + "integrity": "sha512-5qvi4hmExgjtrESDk0vflL69dIxkDAukJcYH9o4663E8Nh12Jpbmr+Ja8WmgkAPtTVhk90UVcVUFCCZLHBmhkQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@vue/babel-sugar-inject-h": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.0.0-beta.2.tgz", + "integrity": "sha512-qGXZ6yE+1trk82xCVJ9j3shsgI+R2ePj3+o8b2Ee7JNaRqQvMfTwpgx5BRlk4q1+CTjvYexdqBS+q4Kg7sSxcg==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@vue/babel-sugar-v-model": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.0.0-beta.2.tgz", + "integrity": "sha512-63US3IMEtATJzzK2le/Na53Sk2bp3LHfwZ8eMFwbTaz6e2qeV9frBl3ZYaha64ghT4IDSbrDXUmm0J09EAzFfA==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0-beta.2", + "@vue/babel-plugin-transform-vue-jsx": "^1.0.0-beta.2", + "camelcase": "^5.0.0", + "html-tags": "^2.0.0", + "svg-tags": "^1.0.0" + } + }, + "@vue/babel-sugar-v-on": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.0.0-beta.2.tgz", + "integrity": "sha512-XH/m3k11EKdMY0MrTg4+hQv8BFM8juzHT95chYkgxDmvDdVJnSCuf9+mcysEJttWD4PVuUGN7EHoIWsIhC0dRw==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.0.0-beta.2", + "camelcase": "^5.0.0" + } + }, + "@vue/cli-overlay": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@vue/cli-overlay/-/cli-overlay-3.4.0.tgz", + "integrity": "sha512-uLfQZvMChAf3UQNR+WN8a7vAPqvaw2tJs1TrNxPg+Dr7bm7HWoitvFremF0vLWkxIRM5e+VJgYV3wHk9EwWhzg==", + "dev": true + }, + "@vue/cli-plugin-babel": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-babel/-/cli-plugin-babel-3.4.0.tgz", + "integrity": "sha512-8ViOzJa8UqUnmMl1422t8EIlCUc5PegSMsdU6xoqfavL83uEGjR+fE4gAI+g7xKo7Qk9+8Z8VvaredXMbmxCzA==", + "dev": true, + "requires": { + "@babel/core": "^7.0.0", + "@vue/babel-preset-app": "^3.4.0", + "@vue/cli-shared-utils": "^3.4.0", + "babel-loader": "^8.0.5", + "webpack": ">=4 < 4.29" + } + }, + "@vue/cli-plugin-typescript": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-typescript/-/cli-plugin-typescript-3.4.0.tgz", + "integrity": "sha512-VjNlHghaDEFheXg89C+RxPaYGKebst14/C2oVxHNeuzVO2SG6ac2LRJl0KM6eKKUD+QFj0/NJWrJZKmSgpHO9Q==", + "dev": true, + "requires": { + "@types/webpack-env": "^1.13.6", + "@vue/cli-shared-utils": "^3.4.0", + "fork-ts-checker-webpack-plugin": "^0.5.2", + "globby": "^9.0.0", + "ts-loader": "^5.3.3", + "tslint": "^5.12.1", + "webpack": ">=4 < 4.29" + } + }, + "@vue/cli-service": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@vue/cli-service/-/cli-service-3.4.0.tgz", + "integrity": "sha512-AtLiin5Jlw0ULKXJtBhUaykz0VzDgYq2RCf7nxfB7Vsi5fTbJyOVeWYe9KsnsM6VTRBWRUI8NzPPMYxV2uxtQA==", + "dev": true, + "requires": { + "@intervolga/optimize-cssnano-plugin": "^1.0.5", + "@soda/friendly-errors-webpack-plugin": "^1.7.1", + "@vue/cli-overlay": "^3.4.0", + "@vue/cli-shared-utils": "^3.4.0", + "@vue/component-compiler-utils": "^2.5.2", + "@vue/preload-webpack-plugin": "^1.1.0", + "@vue/web-component-wrapper": "^1.2.0", + "acorn": "^6.0.6", + "acorn-walk": "^6.1.1", + "address": "^1.0.3", + "autoprefixer": "^9.4.7", + "cache-loader": "^2.0.1", + "case-sensitive-paths-webpack-plugin": "^2.2.0", + "chalk": "^2.4.2", + "clipboardy": "^1.2.3", + "cliui": "^4.1.0", + "copy-webpack-plugin": "^4.6.0", + "css-loader": "^1.0.1", + "cssnano": "^4.1.8", + "debug": "^4.1.1", + "escape-string-regexp": "^1.0.5", + "file-loader": "^3.0.1", + "fs-extra": "^7.0.1", + "globby": "^9.0.0", + "hash-sum": "^1.0.2", + "html-webpack-plugin": "^3.2.0", + "launch-editor-middleware": "^2.2.1", + "lodash.defaultsdeep": "^4.6.0", + "lodash.mapvalues": "^4.6.0", + "lodash.transform": "^4.6.0", + "mini-css-extract-plugin": "^0.5.0", + "minimist": "^1.2.0", + "ora": "^3.0.0", + "portfinder": "^1.0.20", + "postcss-loader": "^3.0.0", + "read-pkg": "^4.0.1", + "semver": "^5.6.0", + "slash": "^2.0.0", + "source-map-url": "^0.4.0", + "ssri": "^6.0.1", + "string.prototype.padend": "^3.0.0", + "terser-webpack-plugin": "^1.2.1", + "thread-loader": "^2.1.2", + "url-loader": "^1.1.2", + "vue-loader": "^15.6.2", + "webpack": ">=4 < 4.29", + "webpack-bundle-analyzer": "^3.0.3", + "webpack-chain": "^4.11.0", + "webpack-dev-server": "^3.1.14", + "webpack-merge": "^4.2.1", + "yorkie": "^2.0.0" + }, + "dependencies": { + "acorn": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.7.tgz", + "integrity": "sha512-HNJNgE60C9eOTgn974Tlp3dpLZdUr+SoxxDwPaY9J/kDNOLQTkaDgwBUXAF4SSsrAwD9RpdxuHK/EbuF+W9Ahw==", + "dev": true + } + } + }, + "@vue/cli-shared-utils": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-3.4.0.tgz", + "integrity": "sha512-w9j2qIroUUC2ym4Lb0lLMdlGmYThhwV0OizOEVigB5eZOEUEBV2Mv43K+nWJ6OyRBACnvhJTDi1gIwJo8zUvOw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "execa": "^1.0.0", + "joi": "^14.3.0", + "launch-editor": "^2.2.1", + "lru-cache": "^5.1.1", + "node-ipc": "^9.1.1", + "opn": "^5.3.0", + "ora": "^3.0.0", + "request": "^2.87.0", + "request-promise-native": "^1.0.5", + "semver": "^5.5.0", + "string.prototype.padstart": "^3.0.0" + } + }, + "@vue/component-compiler-utils": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-2.5.2.tgz", + "integrity": "sha512-3exq9O89GXo9E+CGKzgURCbasG15FtFMs8QRrCUVWGaKue4Egpw41MHb3Avtikv1VykKfBq3FvAnf9Nx3sdVJg==", + "dev": true, + "requires": { + "consolidate": "^0.15.1", + "hash-sum": "^1.0.2", + "lru-cache": "^4.1.2", + "merge-source-map": "^1.1.0", + "postcss": "^7.0.14", + "postcss-selector-parser": "^5.0.0", + "prettier": "1.16.3", + "source-map": "~0.6.1", + "vue-template-es2015-compiler": "^1.8.2" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "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 + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "@vue/preload-webpack-plugin": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.0.tgz", + "integrity": "sha512-rcn2KhSHESBFMPj5vc5X2pI9bcBNQQixvJXhD5gZ4rN2iym/uH2qfDSQfUS5+qwiz0a85TCkeUs6w6jxFDudbw==", + "dev": true + }, + "@vue/web-component-wrapper": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@vue/web-component-wrapper/-/web-component-wrapper-1.2.0.tgz", + "integrity": "sha512-Xn/+vdm9CjuC9p3Ae+lTClNutrVhsXpzxvoTXXtoys6kVRX9FkueSUAqSWAyZntmVLlR4DosBV4pH8y5Z/HbUw==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.11.tgz", + "integrity": "sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/wast-parser": "1.7.11" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz", + "integrity": "sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz", + "integrity": "sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz", + "integrity": "sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz", + "integrity": "sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.7.11" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz", + "integrity": "sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz", + "integrity": "sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg==", + "dev": true + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz", + "integrity": "sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz", + "integrity": "sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz", + "integrity": "sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.11.tgz", + "integrity": "sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.1" + } + }, + "@webassemblyjs/utf8": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.11.tgz", + "integrity": "sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz", + "integrity": "sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/helper-wasm-section": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11", + "@webassemblyjs/wasm-opt": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11", + "@webassemblyjs/wast-printer": "1.7.11" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz", + "integrity": "sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/ieee754": "1.7.11", + "@webassemblyjs/leb128": "1.7.11", + "@webassemblyjs/utf8": "1.7.11" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz", + "integrity": "sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz", + "integrity": "sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-api-error": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/ieee754": "1.7.11", + "@webassemblyjs/leb128": "1.7.11", + "@webassemblyjs/utf8": "1.7.11" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz", + "integrity": "sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/floating-point-hex-parser": "1.7.11", + "@webassemblyjs/helper-api-error": "1.7.11", + "@webassemblyjs/helper-code-frame": "1.7.11", + "@webassemblyjs/helper-fsm": "1.7.11", + "@xtuc/long": "4.2.1" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz", + "integrity": "sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/wast-parser": "1.7.11", + "@xtuc/long": "4.2.1" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.1.tgz", + "integrity": "sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==", + "dev": true + }, + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "dev": true, + "requires": { + "mime-types": "~2.1.18", + "negotiator": "0.6.1" + } + }, + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", + "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", + "dev": true, + "requires": { + "acorn": "^5.0.0" + } + }, + "acorn-walk": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz", + "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==", + "dev": true + }, + "address": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/address/-/address-1.0.3.tgz", + "integrity": "sha512-z55ocwKBRLryBs394Sm3ushTtBeg6VAeuku7utSoSnsJKvKcnXFIyC6vh27n3rXyxSgkJBBCAvyOn7gSUcTYjg==", + "dev": true + }, + "ajv": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.8.1.tgz", + "integrity": "sha512-eqxCp82P+JfqL683wwsL73XmFs1eG6qjw+RD3YHx+Jll1r0jNd4dh8QG9NYAeNGA/hnZjeEDgtTskgJULbxpWQ==", + "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" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "ajv-keywords": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.3.0.tgz", + "integrity": "sha512-CMzN9S62ZOO4sA/mJZIO4S++ZM7KFWzH3PPWkveLhy4OZ9i1/VatgwWMD46w/XbGCBy7Ye0gCk+Za6mmyfKK7g==", + "dev": true + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "dev": true + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "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" + }, + "dependencies": { + "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" + } + } + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "arch": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.1.tgz", + "integrity": "sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-filter": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "array-map": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", + "dev": true + }, + "array-reduce": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true, + "requires": { + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autoprefixer": { + "version": "9.4.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.4.7.tgz", + "integrity": "sha512-qS5wW6aXHkm53Y4z73tFGsUhmZu4aMPV9iHXYlF0c/wxjknXNHuj/1cIQb+6YH692DbJGGWcckAXX+VxKvahMA==", + "dev": true, + "requires": { + "browserslist": "^4.4.1", + "caniuse-lite": "^1.0.30000932", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.14", + "postcss-value-parser": "^3.3.1" + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "babel-loader": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.5.tgz", + "integrity": "sha512-NTnHnVRd2JnRqPC0vW+iOQWU5pchDbYXsG2E6DMXEpMfUcQKclF9gmf3G3ZMhzG7IG9ji4coL0cm+FxeWxDpnw==", + "dev": true, + "requires": { + "find-cache-dir": "^2.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1", + "util.promisify": "^1.0.0" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.2.0.tgz", + "integrity": "sha512-fP899ELUnTaBcIzmrW7nniyqqdYWrWuJUyPWHxFa/c7r7hS6KC8FscNfLlBNIoPSc55kYMGEEKjPjJGCLbE1qA==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bfj": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.1.tgz", + "integrity": "sha512-+GUNvzHR4nRyGybQc2WpNJL4MJazMuvf92ueIyA0bIkPRwhhQu3IfZQ2PSoVPpCBJfmoSdOxu5rnotfFLlvYRQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.1", + "check-types": "^7.3.0", + "hoopy": "^0.1.2", + "tryer": "^1.0.0" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.0.tgz", + "integrity": "sha512-EgmjVLMn22z7eGGv3kcnHwSnJXmFHjISTY9E/S5lIcTD3Oxw05QTcBLNkJFzcb3cNueUdF/IN4U+d78V0zO8Hw==", + "dev": true + }, + "bluebird": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", + "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "body-parser": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "~1.6.3", + "iconv-lite": "0.4.23", + "on-finished": "~2.3.0", + "qs": "6.5.2", + "raw-body": "2.3.3", + "type-is": "~1.6.16" + }, + "dependencies": { + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + } + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.4.1.tgz", + "integrity": "sha512-pEBxEXg7JwaakBXjATYw/D1YZh4QUSCX/Mnd/wnqSRPPSi1U39iDhDoKGoBUcraKdxDlrYqJxSI5nNvD+dWP2A==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000929", + "electron-to-chromium": "^1.3.103", + "node-releases": "^1.1.3" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cacache": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz", + "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==", + "dev": true, + "requires": { + "bluebird": "^3.5.3", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "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.2", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "cache-loader": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-2.0.1.tgz", + "integrity": "sha512-V99T3FOynmGx26Zom+JrVBytLBsmUCzVG2/4NnUKgvXN4bEV42R1ERl1IyiH/cvFIDA1Ytq2lPZ9tXDSahcQpQ==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.0", + "normalize-path": "^3.0.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "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": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", + "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", + "dev": true + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30000935", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000935.tgz", + "integrity": "sha512-1Y2uJ5y56qDt3jsDTdBHL1OqiImzjoQcBG6Yl3Qizq8mcc2SgCFpi+ZwLLqkztYnk9l87IYqRlNBnPSOTbFkXQ==", + "dev": true + }, + "case-sensitive-paths-webpack-plugin": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.2.0.tgz", + "integrity": "sha512-u5ElzokS8A1pm9vM3/iDgTcI3xqHxuCao94Oz8etI3cf0Tio0p8izkDYbTIn09uP3yUUr6+veaE6IkjnTYS46g==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "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" + } + }, + "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==", + "dev": true + }, + "chokidar": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.0.tgz", + "integrity": "sha512-5t6G2SH8eO6lCvYOoUpaRnF5Qfd//gd7qJAkwRUw9qlGVkiQ13uwQngqbWWaurOsaAm9+kUGbITADxt6H0XFNQ==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.0" + } + }, + "chownr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz", + "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-css": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", + "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-spinners": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.3.1.tgz", + "integrity": "sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==", + "dev": true + }, + "cli-table3": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", + "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", + "dev": true, + "requires": { + "colors": "^1.1.2", + "object-assign": "^4.1.0", + "string-width": "^2.1.1" + } + }, + "clipboardy": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-1.2.3.tgz", + "integrity": "sha512-2WNImOvCRe6r63Gk9pShfkwXsVtKCroMAevIbiae021mS850UkWPbevxsBz3tnvjZIEGvlwaqCPsw+4ulzNgJA==", + "dev": true, + "requires": { + "arch": "^2.1.0", + "execa": "^0.8.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", + "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.0.tgz", + "integrity": "sha512-CwyopLkuRYO5ei2EpzpIh6LqJMt6Mt+jZhO5VI5f/wJLZriXQE32/SSqzmrh+QB+AZT81Cj8yv+7zwToW8ahZg==", + "dev": true, + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "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-string": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "dev": true, + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "colors": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", + "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==", + "dev": true + }, + "combined-stream": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "compressible": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.15.tgz", + "integrity": "sha512-4aE67DL33dSW9gw4CI2H/yTxqHLNcxp0yS6jB+4h+wr3e43+1z7vm0HU9qXOH8j+qjKuL8+UtkOxYQSMq60Ylw==", + "dev": true, + "requires": { + "mime-db": ">= 1.36.0 < 2" + } + }, + "compression": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz", + "integrity": "sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.14", + "debug": "2.6.9", + "on-headers": "~1.0.1", + "safe-buffer": "5.1.2", + "vary": "~1.1.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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "^0.1.4" + } + }, + "consolidate": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz", + "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", + "dev": true, + "requires": { + "bluebird": "^3.1.1" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", + "dev": true + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-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": "4.6.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.6.0.tgz", + "integrity": "sha512-Y+SQCF+0NoWQryez2zXn5J5knmr9z/9qSQt7fbL78u83rxmigOy8X5+BFn8CFSuX+nKT8gpYwJX68ekqtQt6ZA==", + "dev": true, + "requires": { + "cacache": "^10.0.4", + "find-cache-dir": "^1.0.0", + "globby": "^7.1.1", + "is-glob": "^4.0.0", + "loader-utils": "^1.1.0", + "minimatch": "^3.0.4", + "p-limit": "^1.0.0", + "serialize-javascript": "^1.4.0" + }, + "dependencies": { + "cacache": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", + "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", + "dev": true, + "requires": { + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.1", + "mississippi": "^2.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^5.2.4", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" + } + }, + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^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" + } + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + } + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "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" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "mississippi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", + "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "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": "^2.0.1", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "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 + }, + "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" + } + }, + "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" + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "ssri": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", + "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.1" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "core-js": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.4.tgz", + "integrity": "sha512-05qQ5hXShcqGkPZpXEFLIpxayZscVD2kuMBZewxiIPPEagukO4mqgPA9CWhUvFBJfy3ODdK2p9xyHh7FTU9/7A==", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.7.tgz", + "integrity": "sha512-PcLqxTKiDmNT6pSpy4N6KtuPwb53W+2tzNvwOZw0WH9N6O0vLIBq0x8aj8Oj75ere4YcGi48bDFCL+3fRJdlNA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.9.0", + "parse-json": "^4.0.0" + } + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "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" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true + }, + "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" + } + }, + "css-loader": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.1.tgz", + "integrity": "sha512-+ZHAZm/yqvJ2kDtPne3uX0C+Vr3Zn5jFn2N4HywtS5ujwvsVkyg0VArEXpl3BgczDA8anieki1FIzhchX4yrDw==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "css-selector-tokenizer": "^0.7.0", + "icss-utils": "^2.1.0", + "loader-utils": "^1.0.2", + "lodash": "^4.17.11", + "postcss": "^6.0.23", + "postcss-modules-extract-imports": "^1.2.0", + "postcss-modules-local-by-default": "^1.2.0", + "postcss-modules-scope": "^1.1.0", + "postcss-modules-values": "^1.3.0", + "postcss-value-parser": "^3.3.0", + "source-list-map": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "css-select": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.0.2.tgz", + "integrity": "sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^2.1.2", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true + }, + "css-selector-tokenizer": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", + "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", + "dev": true, + "requires": { + "cssesc": "^0.1.0", + "fastparse": "^1.1.1", + "regexpu-core": "^1.0.0" + }, + "dependencies": { + "cssesc": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", + "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", + "dev": true + }, + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + }, + "regexpu-core": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", + "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", + "dev": true, + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + } + } + } + }, + "css-tree": { + "version": "1.0.0-alpha.28", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.28.tgz", + "integrity": "sha512-joNNW1gCp3qFFzj4St6zk+Wh/NBv0vM5YbEreZk0SD4S23S+1xBKb6cLDg2uj4P4k/GUMlIm6cKIDqIG+vdt0w==", + "dev": true, + "requires": { + "mdn-data": "~1.1.0", + "source-map": "^0.5.3" + } + }, + "css-unit-converter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.1.tgz", + "integrity": "sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY=", + "dev": true + }, + "css-url-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/css-url-regex/-/css-url-regex-1.1.0.tgz", + "integrity": "sha1-g4NCMMyfdMRX3lnuvRVD/uuDt+w=", + "dev": true + }, + "css-what": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.2.tgz", + "integrity": "sha512-wan8dMWQ0GUeF7DGEPVjhHemVW/vy6xUYmFzRY8RYqgA0JtXC9rJmbScBjqSu6dg9q0lwPQy6ZAmJVr3PPTvqQ==", + "dev": true + }, + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "dev": true + }, + "cssnano": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.8.tgz", + "integrity": "sha512-5GIY0VzAHORpbKiL3rMXp4w4M1Ki+XlXgEXyuWXVd3h6hlASb+9Vo76dNP56/elLMVBBsUfusCo1q56uW0UWig==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.6", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "cssnano-preset-default": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.6.tgz", + "integrity": "sha512-UPboYbFaJFtDUhJ4fqctThWbbyF4q01/7UhsZbLzp35l+nUxtzh1SifoVlEfyLM3n3Z0htd8B1YlCxy9i+bQvg==", + "dev": true, + "requires": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.0", + "postcss-colormin": "^4.0.2", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.1", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.10", + "postcss-merge-rules": "^4.0.2", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.1", + "postcss-minify-params": "^4.0.1", + "postcss-minify-selectors": "^4.0.1", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.1", + "postcss-normalize-positions": "^4.0.1", + "postcss-normalize-repeat-style": "^4.0.1", + "postcss-normalize-string": "^4.0.1", + "postcss-normalize-timing-functions": "^4.0.1", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.1", + "postcss-ordered-values": "^4.1.1", + "postcss-reduce-initial": "^4.0.2", + "postcss-reduce-transforms": "^4.0.1", + "postcss-svgo": "^4.0.1", + "postcss-unique-selectors": "^4.0.1" + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "dev": true + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", + "dev": true + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "dev": true + }, + "csso": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/csso/-/csso-3.5.1.tgz", + "integrity": "sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg==", + "dev": true, + "requires": { + "css-tree": "1.0.0-alpha.29" + }, + "dependencies": { + "css-tree": { + "version": "1.0.0-alpha.29", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.29.tgz", + "integrity": "sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg==", + "dev": true, + "requires": { + "mdn-data": "~1.1.0", + "source-map": "^0.5.3" + } + } + } + }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", + "dev": true + }, + "deepmerge": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", + "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==", + "dev": true + }, + "default-gateway": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-2.7.2.tgz", + "integrity": "sha512-lAc4i9QJR0YHSDFdzeBQKfZ1SRDG3hsJNEkrpcZa8QhBfidLAilT60BDEIVUUGqosFp425KOgB3uYqcnQrWafQ==", + "dev": true, + "requires": { + "execa": "^0.10.0", + "ip-regex": "^2.1.0" + }, + "dependencies": { + "execa": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", + "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + } + } + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "del": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "dev": true, + "requires": { + "globby": "^6.1.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "p-map": "^1.1.1", + "pify": "^3.0.0", + "rimraf": "^2.2.8" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "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" + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.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-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": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dev": true, + "requires": { + "domelementtype": "~1.1.1", + "entities": "~1.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "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 + }, + "domhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", + "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "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": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, + "requires": { + "is-obj": "^1.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.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "easy-stack": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/easy-stack/-/easy-stack-1.0.0.tgz", + "integrity": "sha1-EskbMIWjfwuqM26UhurEv5Tj54g=", + "dev": true + }, + "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 + }, + "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 + }, + "electron-to-chromium": { + "version": "1.3.113", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.113.tgz", + "integrity": "sha512-De+lPAxEcpxvqPTyZAXELNpRZXABRxf+uL/rSykstQhzj/B0l1150G/ExIIxKc16lI89Hgz81J0BHAcbTqK49g==", + "dev": true + }, + "elliptic": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", + "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "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" + } + }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.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 + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "error-stack-parser": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.2.tgz", + "integrity": "sha512-E1fPutRDdIj/hohG0UpT5mayXNCxXP9d+snxFsPU9X0XgccOumKraa3juDMwTUyi7+Bu5+mCGagjg4IYeNbOdw==", + "dev": true, + "requires": { + "stackframe": "^1.0.4" + } + }, + "es-abstract": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", + "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-keys": "^1.0.12" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint-scope": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", + "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "event-pubsub": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/event-pubsub/-/event-pubsub-4.3.0.tgz", + "integrity": "sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ==", + "dev": true + }, + "eventemitter3": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", + "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==", + "dev": true + }, + "events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", + "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==", + "dev": true, + "requires": { + "original": "^1.0.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==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "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": { + "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" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "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 + } + } + }, + "express": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", + "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.3", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.4", + "qs": "6.5.2", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.2", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "~1.4.0", + "type-is": "~1.6.16", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "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": "2.2.6", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.6.tgz", + "integrity": "sha512-0BvMaZc1k9F+MeWWMe8pL6YltFzZYcJsYU7D4JyDA6PAczaXvxqQQ/z+mDF7/4Mw01DeUc+i3CTKajnkANkV4w==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + } + }, + "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 + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "dev": true + }, + "file-loader": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-3.0.1.tgz", + "integrity": "sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "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": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "filesize": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", + "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", + "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" + } + } + } + }, + "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" + }, + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.0.0.tgz", + "integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^3.0.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" + } + }, + "flush-write-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.0.tgz", + "integrity": "sha512-6MHED/cmsyux1G4/Cek2Z776y9t7WCNd3h2h/HW91vFeU7pzMhA8XvAlDhHcanG5IWuIh/xcC7JASY4WQpG6xg==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.1.1.tgz", + "integrity": "sha512-DkN66hPyqDhnIQ6Jcsvx9bFjhw214O4poMBcIMgPVpQvNy9a0e0Uhg5SqySyDKAmUlwt8LonTBz1ezOnM8pUdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "follow-redirects": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.6.1.tgz", + "integrity": "sha512-t2JCjbzxQpWvbhts3l6SH1DKzSrx8a+SsaVf4h6bG4kOXUuPYS/kg2Lr4gQSb7eemaHqJkOThF1BGyjlUkO1GQ==", + "dev": true, + "requires": { + "debug": "=3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "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": "0.5.2", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-0.5.2.tgz", + "integrity": "sha512-a5IG+xXyKnpruI0CP/anyRLAoxWtp3lzdG6flxicANnoSzz64b12dJ7ASAVRrI2OaWwZR2JyBaMHFQqInhWhIw==", + "dev": true, + "requires": { + "babel-code-frame": "^6.22.0", + "chalk": "^2.4.1", + "chokidar": "^2.0.4", + "micromatch": "^3.1.10", + "minimatch": "^3.0.4", + "tapable": "^1.0.0" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz", + "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "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 + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "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==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, + "globals": { + "version": "11.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.10.0.tgz", + "integrity": "sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ==", + "dev": true + }, + "globby": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-9.0.0.tgz", + "integrity": "sha512-q0qiO/p1w/yJ0hk8V9x1UXlgsXUxlGd0AHUOXZVXBO6aznDtpx7M8D1kBrCAItoPm+4l8r6ATXV1JpjY2SBQOw==", + "dev": true, + "requires": { + "array-union": "^1.0.2", + "dir-glob": "^2.2.1", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "gzip-size": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.0.0.tgz", + "integrity": "sha512-5iI7omclyqrnWw4XbXAmGhPsABkSIDQonv2K0h61lybgofWa6iZyvrI3r2zsJH4P8Nb64fFVzlvfhs0g7BBxAA==", + "dev": true, + "requires": { + "duplexer": "^0.1.1", + "pify": "^3.0.0" + } + }, + "handle-thing": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", + "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "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 + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-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-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", + "dev": true + }, + "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" + } + }, + "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 + }, + "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" + } + }, + "hoek": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-6.1.2.tgz", + "integrity": "sha512-6qhh/wahGYZHFSFw12tBbJw5fsAhhwrrG/y3Cs0YMTv2WzMnL0oLPnQJjv1QJvEfylRSOFuP+xCu+tdx0tD16Q==", + "dev": true + }, + "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 + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, + "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==", + "dev": true + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, + "html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + } + }, + "html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", + "dev": true + }, + "html-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", + "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", + "dev": true, + "requires": { + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", + "util.promisify": "1.0.0" + }, + "dependencies": { + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + } + } + }, + "htmlparser2": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", + "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", + "dev": true, + "requires": { + "domelementtype": "1", + "domhandler": "2.1", + "domutils": "1.1", + "readable-stream": "1.0" + }, + "dependencies": { + "domutils": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", + "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "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.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" + } + }, + "http-parser-js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz", + "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==", + "dev": true + }, + "http-proxy": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", + "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", + "dev": true, + "requires": { + "eventemitter3": "^3.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz", + "integrity": "sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q==", + "dev": true, + "requires": { + "http-proxy": "^1.16.2", + "is-glob": "^4.0.0", + "lodash": "^4.17.5", + "micromatch": "^3.1.9" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "husky": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/husky/-/husky-1.3.1.tgz", + "integrity": "sha512-86U6sVVVf4b5NYSZ0yvv88dRgBSSXXmHaiq5pP4KDj5JVzdwKgBjEtUPOm8hcoytezFwbU+7gotXNhpHdystlg==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.7", + "execa": "^1.0.0", + "find-up": "^3.0.0", + "get-stdin": "^6.0.0", + "is-ci": "^2.0.0", + "pkg-dir": "^3.0.0", + "please-upgrade-node": "^3.1.1", + "read-pkg": "^4.0.1", + "run-node": "^1.0.0", + "slash": "^2.0.0" + }, + "dependencies": { + "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 + }, + "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": { + "ci-info": "^2.0.0" + } + } + } + }, + "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" + } + }, + "icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", + "dev": true + }, + "icss-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", + "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", + "dev": true, + "requires": { + "postcss": "^6.0.1" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "ieee754": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", + "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "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 + }, + "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": { + "import-from": "^2.1.0" + } + }, + "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": { + "caller-path": "^2.0.0", + "resolve-from": "^3.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": { + "resolve-from": "^3.0.0" + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "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 + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "internal-ip": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-3.0.1.tgz", + "integrity": "sha512-NXXgESC2nNVtU+pqmC9e6R8B1GpKxzsAQhffvh5AL79qKnodd+L7tnEQmTiUAVngqLalPbSqRA7XGIEL5nCd0Q==", + "dev": true, + "requires": { + "default-gateway": "^2.6.0", + "ipaddr.js": "^1.5.2" + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "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=", + "dev": true + }, + "ipaddr.js": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", + "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=", + "dev": true + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "requires": { + "ci-info": "^1.5.0" + } + }, + "is-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" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-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-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": "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-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-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-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "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, + "requires": { + "html-comment-regex": "^1.1.0" + } + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isemail": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/isemail/-/isemail-3.2.0.tgz", + "integrity": "sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg==", + "dev": true, + "requires": { + "punycode": "2.x.x" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "javascript-stringify": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-1.6.0.tgz", + "integrity": "sha1-FC0RHzpuPa6PSpr9d9RYVbWpzOM=", + "dev": true + }, + "joi": { + "version": "14.3.1", + "resolved": "https://registry.npmjs.org/joi/-/joi-14.3.1.tgz", + "integrity": "sha512-LQDdM+pkOrpAn4Lp+neNIFV3axv1Vna3j38bisbQhETPMANYRbFJFUyOZcOClYvM/hppMhGWuKSFEK9vjrB+bQ==", + "dev": true, + "requires": { + "hoek": "6.x.x", + "isemail": "3.x.x", + "topo": "3.x.x" + } + }, + "js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", + "dev": true + }, + "js-message": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/js-message/-/js-message-1.0.5.tgz", + "integrity": "sha1-IwDSSxrwjondCVvBpMnJz8uJLRU=", + "dev": true + }, + "js-queue": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/js-queue/-/js-queue-2.0.0.tgz", + "integrity": "sha1-NiITz4YPRo8BJfxslqvBdCUx+Ug=", + "dev": true, + "requires": { + "easy-stack": "^1.0.0" + } + }, + "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 + }, + "js-yaml": { + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz", + "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "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-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "json5": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", + "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "dev": true, + "requires": { + "minimist": "^1.2.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" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "keycloak-js": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/keycloak-js/-/keycloak-js-4.8.3.tgz", + "integrity": "sha512-TXoZdoOYu2ScYs58L95/xSYjsTto9KRvZ+vt6mv4Dyf4pYhYZSgwMPnmi128qj/z8sm4mL1Z8nncR6XdWgNKMQ==" + }, + "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.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "launch-editor": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.2.1.tgz", + "integrity": "sha512-On+V7K2uZK6wK7x691ycSUbLD/FyKKelArkbaAMSSJU8JmqmhwN2+mnJDNINuJWSrh2L0kDk+ZQtbC/gOWUwLw==", + "dev": true, + "requires": { + "chalk": "^2.3.0", + "shell-quote": "^1.6.1" + } + }, + "launch-editor-middleware": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/launch-editor-middleware/-/launch-editor-middleware-2.2.1.tgz", + "integrity": "sha512-s0UO2/gEGiCgei3/2UN3SMuUj1phjQN8lcpnvgLSz26fAzNWPQ6Nf/kF5IFClnfU2ehp6LrmKdMU/beveO+2jg==", + "dev": true, + "requires": { + "launch-editor": "^2.2.1" + } + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "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": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "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" + } + } + } + }, + "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" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "lodash.defaultsdeep": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.0.tgz", + "integrity": "sha1-vsECT4WxvZbL6kBbI8FK1kQ6b4E=", + "dev": true + }, + "lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=", + "dev": true + }, + "lodash.mapvalues": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", + "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.transform": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.transform/-/lodash.transform-4.6.0.tgz", + "integrity": "sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A=", + "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 + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "loglevel": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz", + "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "lru-cache": { + "version": "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" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "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=", + "dev": true, + "requires": { + "object-visit": "^1.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==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mdn-data": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz", + "integrity": "sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA==", + "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 + }, + "mem": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.1.0.tgz", + "integrity": "sha512-I5u6Q1x7wxO0kdOpYBB28xueHADYps5uty/zg936CiG8NTe5sJL8EjrCuLneuDW3PlMdZBGDIn8BirEVdovZvg==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^1.0.0", + "p-is-promise": "^2.0.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge-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==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "merge2": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz", + "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz", + "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==", + "dev": true + }, + "mime-db": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", + "dev": true + }, + "mime-types": { + "version": "2.1.21", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", + "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", + "dev": true, + "requires": { + "mime-db": "~1.37.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "mini-css-extract-plugin": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.5.0.tgz", + "integrity": "sha512-IuaLjruM0vMKhUUT51fQdQzBYTX49dLj8w68ALEAe2A4iYNpIC4eMac67mt3NzycvjOlf07/kYxJDc0RTl1Wqw==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "dependencies": { + "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": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "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" + } + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "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": { + "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": { + "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 + }, + "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" + } + }, + "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 + }, + "nan": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", + "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "dev": true + }, + "neo-async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", + "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", + "dev": true + }, + "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": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-forge": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", + "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==", + "dev": true + }, + "node-ipc": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/node-ipc/-/node-ipc-9.1.1.tgz", + "integrity": "sha512-FAyICv0sIRJxVp3GW5fzgaf9jwwRQxAKDJlmNFUL5hOy+W4X/I5AypyHoq0DXXbo9o/gt79gj++4cMr4jVWE/w==", + "dev": true, + "requires": { + "event-pubsub": "4.3.0", + "js-message": "1.0.5", + "js-queue": "2.0.0" + } + }, + "node-libs-browser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz", + "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==", + "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.0", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "0.0.4" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "node-releases": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.7.tgz", + "integrity": "sha512-bKdrwaqJUPHqlCzDD7so/R+Nk0jGv9a11ZhLrD9f6i947qGLrGAhU3OxRENa19QQmwzGy/g6zCDEuLGDO8HPvA==", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "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": "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 + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-keys": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "object.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" + } + }, + "object.values": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", + "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "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" + } + }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", + "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": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "opener": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", + "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==", + "dev": true + }, + "opn": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz", + "integrity": "sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "ora": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-3.0.0.tgz", + "integrity": "sha512-LBS97LFe2RV6GJmXBi6OKcETKyklHNMV0xw7BtsVn2MlsgsydyZetSCbCANr+PFLmDyv4KV88nn0eCKza665Mg==", + "dev": true, + "requires": { + "chalk": "^2.3.1", + "cli-cursor": "^2.1.0", + "cli-spinners": "^1.1.0", + "log-symbols": "^2.2.0", + "strip-ansi": "^4.0.0", + "wcwidth": "^1.0.1" + } + }, + "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 + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "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-is-promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.0.0.tgz", + "integrity": "sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg==", + "dev": true + }, + "p-limit": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", + "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", + "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": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + }, + "pako": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.8.tgz", + "integrity": "sha512-6i0HVbUfcKaTv+EG8ZTr75az7GFXcLYk9UyLEg7Notv/Ma+z/UG3TCoz6GiNeOrn1E/e63I0X/Hpw18jHOTUnA==", + "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, + "requires": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "parse-asn1": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.3.tgz", + "integrity": "sha512-VrPoetlz7B/FqjBLD2f5wBVZvsZVLnRUrxVLfRYhGXCODa/NWE4p3Wp+6+aV3ZPL3KM7/OZmxDIwwijD7yuucg==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.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=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "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": "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": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-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" + } + }, + "please-upgrade-node": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.1.1.tgz", + "integrity": "sha512-KY1uHnQ2NlQHqIJQpnh/i54rKkuxCEBx+voJIS/Mvb+L2iYd2NMotwduhKTMjfC1uKoX3VXOxLjIYG66dfJTVQ==", + "dev": true, + "requires": { + "semver-compare": "^1.0.0" + } + }, + "portfinder": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.20.tgz", + "integrity": "sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw==", + "dev": true, + "requires": { + "async": "^1.5.2", + "debug": "^2.2.0", + "mkdirp": "0.5.x" + }, + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.14.tgz", + "integrity": "sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.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 + }, + "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-calc": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.1.tgz", + "integrity": "sha512-oXqx0m6tb4N3JGdmeMSc/i91KppbYsFZKdH0xMOqK8V1rJlzrKlTdokz8ozUXLVejydRN6u2IddxpcijRj2FqQ==", + "dev": true, + "requires": { + "css-unit-converter": "^1.1.1", + "postcss": "^7.0.5", + "postcss-selector-parser": "^5.0.0-rc.4", + "postcss-value-parser": "^3.3.1" + } + }, + "postcss-colormin": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.2.tgz", + "integrity": "sha512-1QJc2coIehnVFsz0otges8kQLsryi4lo19WD+U5xCWvXd0uw/Z+KKYnbiNDCnO9GP+PvErPHCG0jNvWTngk9Rw==", + "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" + } + }, + "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" + } + }, + "postcss-discard-comments": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.1.tgz", + "integrity": "sha512-Ay+rZu1Sz6g8IdzRjUgG2NafSNpp2MSMOQUb+9kkzzzP+kh07fP0yNbhtFejURnyVXSX3FYy2nVNW1QTnNjgBQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "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": { + "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-load-config": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.0.0.tgz", + "integrity": "sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ==", + "dev": true, + "requires": { + "cosmiconfig": "^4.0.0", + "import-cwd": "^2.0.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz", + "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", + "dev": true, + "requires": { + "is-directory": "^0.3.1", + "js-yaml": "^3.9.0", + "parse-json": "^4.0.0", + "require-from-string": "^2.0.1" + } + } + } + }, + "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": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "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": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "postcss-merge-longhand": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.10.tgz", + "integrity": "sha512-hME10s6CSjm9nlVIcO1ukR7Jr5RisTaaC1y83jWCivpuBtPohA3pZE7cGTIVSYjXvLnXozHTiVOkG4dnnl756g==", + "dev": true, + "requires": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + } + }, + "postcss-merge-rules": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.2.tgz", + "integrity": "sha512-UiuXwCCJtQy9tAIxsnurfF0mrNHKc4NnNx6NxqmzNNjXpQwLSukUxELHTRF0Rg1pAmcoKLih8PwvZbiordchag==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", + "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "dev": true, + "requires": { + "dot-prop": "^4.1.1", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-minify-gradients": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.1.tgz", + "integrity": "sha512-pySEW3E6Ly5mHm18rekbWiAjVi/Wj8KKt2vwSfVFAWdW6wOIekgqxKxLU7vJfb107o3FDNPkaYFCxGAJBFyogA==", + "dev": true, + "requires": { + "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": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.1.tgz", + "integrity": "sha512-h4W0FEMEzBLxpxIVelRtMheskOKKp52ND6rJv+nBS33G1twu2tCyurYj/YtgU76+UDCvWeNs0hs8HFAWE2OUFg==", + "dev": true, + "requires": { + "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": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.1.tgz", + "integrity": "sha512-8+plQkomve3G+CodLCgbhAKrb5lekAnLYuL1d7Nz+/7RANpBEVdgBkPNwljfSKvZ9xkkZTZITd04KP+zeJTJqg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", + "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "dev": true, + "requires": { + "dot-prop": "^4.1.1", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-modules-extract-imports": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz", + "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==", + "dev": true, + "requires": { + "postcss": "^6.0.1" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-modules-local-by-default": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", + "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", + "dev": true, + "requires": { + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-modules-scope": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", + "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", + "dev": true, + "requires": { + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-modules-values": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", + "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", + "dev": true, + "requires": { + "icss-replace-symbols": "^1.1.0", + "postcss": "^6.0.1" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-normalize-display-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.1.tgz", + "integrity": "sha512-R5mC4vaDdvsrku96yXP7zak+O3Mm9Y8IslUobk7IMP+u/g+lXvcN4jngmHY5zeJnrQvE13dfAg5ViU05ZFDwdg==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-positions": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.1.tgz", + "integrity": "sha512-GNoOaLRBM0gvH+ZRb2vKCIujzz4aclli64MBwDuYGU2EY53LwiP7MxOZGE46UGtotrSnmarPPZ69l2S/uxdaWA==", + "dev": true, + "requires": { + "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": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.1.tgz", + "integrity": "sha512-fFHPGIjBUyUiswY2rd9rsFcC0t3oRta4wxE1h3lpwfQZwFeFjXFSiDtdJ7APCmHQOnUZnqYBADNRPKPwFAONgA==", + "dev": true, + "requires": { + "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": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.1.tgz", + "integrity": "sha512-IJoexFTkAvAq5UZVxWXAGE0yLoNN/012v7TQh5nDo6imZJl2Fwgbhy3J2qnIoaDBrtUP0H7JrXlX1jjn2YcvCQ==", + "dev": true, + "requires": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-timing-functions": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.1.tgz", + "integrity": "sha512-1nOtk7ze36+63ONWD8RCaRDYsnzorrj+Q6fxkQV+mlY5+471Qx9kspqv0O/qQNMeApg8KNrRf496zHwJ3tBZ7w==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^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" + } + }, + "postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "dev": true, + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-whitespace": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.1.tgz", + "integrity": "sha512-U8MBODMB2L+nStzOk6VvWWjZgi5kQNShCyjRhMT3s+W9Jw93yIjOnrEkKYD3Ul7ChWbEcjDWmXq0qOL9MIAnAw==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-ordered-values": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.1.tgz", + "integrity": "sha512-PeJiLgJWPzkVF8JuKSBcylaU+hDJ/TX3zqAMIjlghgn1JBi6QwQaDZoDIlqWRcCAI8SxKrt3FCPSRmOgKRB97Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-reduce-initial": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.2.tgz", + "integrity": "sha512-epUiC39NonKUKG+P3eAOKKZtm5OtAtQJL7Ye0CBN1f+UQTHzqotudp+hki7zxXm7tT0ZAKDMBj1uihpPjP25ug==", + "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.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.1.tgz", + "integrity": "sha512-sZVr3QlGs0pjh6JAIe6DzWvBaqYw05V1t3d9Tp+VnFRT5j+rsqoWsysh/iSD7YNsULjq9IAylCznIwVd5oU/zA==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "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": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "postcss-svgo": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.1.tgz", + "integrity": "sha512-YD5uIk5NDRySy0hcI+ZJHwqemv2WiqqzDgtvgMzO8EGSkK5aONyX8HMVFRFJSdO8wUWTuisUFn/d7yRRbBr5Qw==", + "dev": true, + "requires": { + "is-svg": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + } + }, + "postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "prettier": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.16.3.tgz", + "integrity": "sha512-kn/GU6SMRYPxUakNXhpP0EedT/KmaPzr0H5lIsDogrykbaxOpOfAFfk5XA7DZrJyMAv1wlMV3CPcZruGXVVUZw==", + "dev": true + }, + "pretty-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", + "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "dev": true, + "requires": { + "renderkid": "^2.0.1", + "utila": "~0.4" + } + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "proxy-addr": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", + "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.8.0" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.1.31", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", + "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "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" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "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": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "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 + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.0.tgz", + "integrity": "sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==", + "dev": true + }, + "randombytes": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "dev": true + }, + "raw-body": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "dev": true, + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", + "unpipe": "1.0.0" + } + }, + "read-pkg": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", + "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", + "dev": true, + "requires": { + "normalize-package-data": "^2.3.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz", + "integrity": "sha512-s5NGghCE4itSlUS+0WUj88G6cfMVMmH8boTPNvABf8od+2dhT9WDlWu8n01raQAJZMOK8Ch6jSexaRO7swd6aw==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", + "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==", + "dev": true + }, + "regenerator-transform": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.13.3.tgz", + "integrity": "sha512-5ipTrZFSq5vU2YoGoww4uaRVAK4wyYC4TSICibbfEPOruUu8FFP7ErV0BjmbIOEpn3O/k9na9UEdYR/3m7N6uA==", + "dev": true, + "requires": { + "private": "^0.1.6" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexp-tree": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.1.tgz", + "integrity": "sha512-HwRjOquc9QOwKTgbxvZTcddS5mlNlwePMQ3NFL8broajMLD5CXDAqas8Y5yxJH5QtZp5iRor3YCILd5pz71Cgw==", + "dev": true, + "requires": { + "cli-table3": "^0.5.0", + "colors": "^1.1.2", + "yargs": "^12.0.5" + } + }, + "regexpu-core": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.4.0.tgz", + "integrity": "sha512-eDDWElbwwI3K0Lo6CqbQbA6FwgtCz4kYTarrri1okfkRLZAqstU+B3voZBCjg8Fl6iq0gXrJG6MvRgLthfvgOA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^7.0.0", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.0.2" + } + }, + "regjsgen": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", + "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", + "dev": true + }, + "regjsparser": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", + "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "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.2", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.2.tgz", + "integrity": "sha512-FsygIxevi1jSiPY9h7vZmBFUbAOcbYm9UwyiLNdVsLRs/5We9Ob5NMPbGYUTWiLq5L+ezlVdE0A8bbME5CWTpg==", + "dev": true, + "requires": { + "css-select": "^1.1.0", + "dom-converter": "~0.2", + "htmlparser2": "~3.3.0", + "strip-ansi": "^3.0.0", + "utila": "^0.4.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 + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "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.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "request-promise-core": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", + "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", + "dev": true, + "requires": { + "lodash": "^4.13.1" + } + }, + "request-promise-native": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz", + "integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=", + "dev": true, + "requires": { + "request-promise-core": "1.1.1", + "stealthy-require": "^1.1.0", + "tough-cookie": ">=2.3.3" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-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": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", + "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", + "dev": true + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/run-node/-/run-node-1.0.0.tgz", + "integrity": "sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A==", + "dev": true + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.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 + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selfsigned": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz", + "integrity": "sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==", + "dev": true, + "requires": { + "node-forge": "0.7.5" + } + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + }, + "dependencies": { + "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" + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.6.1.tgz", + "integrity": "sha512-A5MOagrPFga4YaKQSWHryl7AXvbQkEqpw4NNYMTNYUNV51bA8ABHgYFpqKx+YFFrw59xMV1qGH1R4AgoNIVgCw==", + "dev": true + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "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 + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shell-quote": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", + "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", + "dev": true, + "requires": { + "array-filter": "~0.0.0", + "array-map": "~0.0.0", + "array-reduce": "~0.0.0", + "jsonify": "~0.0.0" + } + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dev": true, + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + } + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "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 + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "dev": true, + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" + } + }, + "sockjs-client": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", + "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", + "dev": true, + "requires": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "faye-websocket": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", + "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + } + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", + "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz", + "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==", + "dev": true + }, + "spdy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.0.tgz", + "integrity": "sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "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": { + "readable-stream": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.1.1.tgz", + "integrity": "sha512-DkN66hPyqDhnIQ6Jcsvx9bFjhw214O4poMBcIMgPVpQvNy9a0e0Uhg5SqySyDKAmUlwt8LonTBz1ezOnM8pUdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "stackframe": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.0.4.tgz", + "integrity": "sha512-to7oADIniaYwS3MhtCa/sQhrxidCCQiF/qp4/m5iN3ipf0Y7Xlri0f6eG29r08aL7JYl8n32AF3Q5GYBZ7K8vw==", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "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": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "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", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "string.prototype.padend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz", + "integrity": "sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.4.3", + "function-bind": "^1.0.2" + } + }, + "string.prototype.padstart": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.padstart/-/string.prototype.padstart-3.0.0.tgz", + "integrity": "sha1-W8+tOfRkm7LQMSkuGbzwtRDUskI=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.4.3", + "function-bind": "^1.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, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.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-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, + "stylehacks": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.1.tgz", + "integrity": "sha512-TK5zEPeD9NyC1uPIdjikzsgWxdQQN/ry1X3d1iOz1UkYDCmcr928gWD1KHgyC27F50UnE0xCTrBOO1l6KR8M4w==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", + "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "dev": true, + "requires": { + "dot-prop": "^4.1.1", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "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" + } + }, + "svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", + "dev": true + }, + "svgo": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.1.1.tgz", + "integrity": "sha512-GBkJbnTuFpM4jFbiERHDWhZc/S/kpHToqmZag3aEBjPYK44JAN2QBjvrGIxLOoCyMZjuFQIfTO2eJd8uwLY/9g==", + "dev": true, + "requires": { + "coa": "~2.0.1", + "colors": "~1.1.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "~0.1.0", + "css-tree": "1.0.0-alpha.28", + "css-url-regex": "^1.1.0", + "csso": "^3.5.0", + "js-yaml": "^3.12.0", + "mkdirp": "~0.5.1", + "object.values": "^1.0.4", + "sax": "~1.2.4", + "stable": "~0.1.6", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "dependencies": { + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + } + } + }, + "tapable": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.1.tgz", + "integrity": "sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA==", + "dev": true + }, + "terser": { + "version": "3.16.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-3.16.1.tgz", + "integrity": "sha512-JDJjgleBROeek2iBcSNzOHLKsB/MdDf+E/BOAJ0Tk9r7p9/fVobfv7LMJ/g/k3v9SXdmjZnIlFd5nfn/Rt0Xow==", + "dev": true, + "requires": { + "commander": "~2.17.1", + "source-map": "~0.6.1", + "source-map-support": "~0.5.9" + }, + "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 + } + } + }, + "terser-webpack-plugin": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.2.2.tgz", + "integrity": "sha512-1DMkTk286BzmfylAvLXwpJrI7dWa5BnFmscV/2dCr8+c56egFcbaeFAl7+sujAjdmpLam21XRdhA4oifLyiWWg==", + "dev": true, + "requires": { + "cacache": "^11.0.2", + "find-cache-dir": "^2.0.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.4.0", + "source-map": "^0.6.1", + "terser": "^3.16.1", + "webpack-sources": "^1.1.0", + "worker-farm": "^1.5.2" + }, + "dependencies": { + "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": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.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 + } + } + }, + "thread-loader": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/thread-loader/-/thread-loader-2.1.2.tgz", + "integrity": "sha512-7xpuc9Ifg6WU+QYw/8uUqNdRwMD+N5gjwHKMqETrs96Qn+7BHwECpt2Brzr4HFlf4IAkZsayNhmGdbkBsTJ//w==", + "dev": true, + "requires": { + "loader-runner": "^2.3.1", + "loader-utils": "^1.1.0", + "neo-async": "^2.6.0" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "thunky": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", + "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==", + "dev": true + }, + "timers-browserify": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", + "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "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 + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "topo": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/topo/-/topo-3.0.3.tgz", + "integrity": "sha512-IgpPtvD4kjrJ7CRA3ov2FhWQADwv+Tdqbsf1ZnPUSAtCJ9e1Z44MmoSGDXGk4IppoZA7jd/QRkNddlLJWlUZsQ==", + "dev": true, + "requires": { + "hoek": "6.x.x" + } + }, + "toposort": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", + "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", + "dev": true + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "dev": true + }, + "ts-loader": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-5.3.3.tgz", + "integrity": "sha512-KwF1SplmOJepnoZ4eRIloH/zXL195F51skt7reEsS6jvDqzgc/YSbz9b8E07GxIUwLXdcD4ssrJu6v8CwaTafA==", + "dev": true, + "requires": { + "chalk": "^2.3.0", + "enhanced-resolve": "^4.0.0", + "loader-utils": "^1.0.2", + "micromatch": "^3.1.4", + "semver": "^5.0.1" + } + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "dev": true + }, + "tslint": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.12.1.tgz", + "integrity": "sha512-sfodBHOucFg6egff8d1BvuofoOQ/nOeYNfbp7LDlKBcLNrL3lmS5zoiDGyOMdT7YsEXAwWpTdAHwOGOc8eRZAw==", + "dev": true, + "requires": { + "babel-code-frame": "^6.22.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^3.2.0", + "glob": "^7.1.1", + "js-yaml": "^3.7.0", + "minimatch": "^3.0.4", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.27.2" + } + }, + "tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-is": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.18" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typescript": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.3.1.tgz", + "integrity": "sha512-cTmIDFW7O0IHbn1DPYjkiebHxwtCMU+eTy30ZtJNBPF9j2O1ITu5XH2YnBeVRKWHqF+3JQwWJv0Q0aUgX8W7IA==", + "dev": true + }, + "uglify-js": { + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", + "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", + "dev": true, + "requires": { + "commander": "~2.17.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "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 + } + } + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz", + "integrity": "sha512-Rx7yODZC1L/T8XKo/2kNzVAQaRE88AaMvI1EF/Xnj3GW2wzN6fop9DDWuFAKUVFH7vozkz26DzP0qyWLKLIVPQ==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz", + "integrity": "sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg==", + "dev": true + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", + "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", + "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", + "dev": true + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-loader": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.2.tgz", + "integrity": "sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "mime": "^2.0.3", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "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": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "url-parse": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.4.tgz", + "integrity": "sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg==", + "dev": true, + "requires": { + "querystringify": "^2.0.0", + "requires-port": "^1.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "vendors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.2.tgz", + "integrity": "sha512-w/hry/368nO21AN9QljsaIhb9ZiZtZARoVH5f3CsFbawdLdayCgKRPup7CggujvySMxx0I91NOyxdVENohprLQ==", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "requires": { + "indexof": "0.0.1" + } + }, + "vue": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.3.tgz", + "integrity": "sha512-yftjtahz4UTAtOlXXuw7UaYD86fWrMDAAzqTdqJJx2FIBqcPmBN6kPBHiBJFGaQELVblb5ijbFMXsx0i0F7q3g==" + }, + "vue-class-component": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/vue-class-component/-/vue-class-component-6.3.2.tgz", + "integrity": "sha512-cH208IoM+jgZyEf/g7mnFyofwPDJTM/QvBNhYMjqGB8fCsRyTf68rH2ISw/G20tJv+5mIThQ3upKwoL4jLTr1A==" + }, + "vue-hot-reload-api": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.1.tgz", + "integrity": "sha512-AA86yKZ5uOKz87/q1UpngEXhbRkaYg1b7HMMVRobNV1IVKqZe8oLIzo6iMocVwZXnYitlGwf2k4ZRLOZlS8oPQ==", + "dev": true + }, + "vue-loader": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.6.2.tgz", + "integrity": "sha512-T6fONodj861M3PqZ1jlbUFjeezbUnPRY2bd+3eZuDvYADgkN3VFU2H5feqySNg9XBt8rcbyBGmFWTZtrOX+v5w==", + "dev": true, + "requires": { + "@vue/component-compiler-utils": "^2.5.1", + "hash-sum": "^1.0.2", + "loader-utils": "^1.1.0", + "vue-hot-reload-api": "^2.3.0", + "vue-style-loader": "^4.1.0" + } + }, + "vue-router": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.0.2.tgz", + "integrity": "sha512-opKtsxjp9eOcFWdp6xLQPLmRGgfM932Tl56U9chYTnoWqKxQ8M20N7AkdEbM5beUh6wICoFGYugAX9vQjyJLFg==" + }, + "vue-style-loader": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.2.tgz", + "integrity": "sha512-0ip8ge6Gzz/Bk0iHovU9XAUQaFt/G2B61bnWa2tCcqqdgfHs1lF9xXorFbE55Gmy92okFT+8bfmySuUOu13vxQ==", + "dev": true, + "requires": { + "hash-sum": "^1.0.2", + "loader-utils": "^1.0.2" + } + }, + "vue-template-compiler": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.3.tgz", + "integrity": "sha512-SQ3lJk7fwquz8fGac7MwvP9cEBZntokTWITaDrLC0zmyBKjcOfJtWZkMsv+2uSUBDD8kwz8Bsad9xmBWaNULhg==", + "dev": true, + "requires": { + "de-indent": "^1.0.2", + "he": "^1.1.0" + } + }, + "vue-template-es2015-compiler": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.8.2.tgz", + "integrity": "sha512-cliV19VHLJqFUYbz/XeWXe5CO6guzwd0yrrqqp0bmjlMP3ZZULY7fu8RTC4+3lmHwo6ESVDHFDsvjB15hcR5IA==", + "dev": true + }, + "vuetify": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-1.5.0.tgz", + "integrity": "sha512-I2bITwvtkfbUf2hfrKo3Uta4egpv5KzEcKR1czgdyjZdA1nlo96XV2EDu0XetLl6p+AjhOqwlZWbLSezy9ZZmQ==" + }, + "vuex": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vuex/-/vuex-3.1.0.tgz", + "integrity": "sha512-mdHeHT/7u4BncpUZMlxNaIdcN/HIt1GsGG5LKByArvYG/v6DvHcOxvDCts+7SRdCoIRGllK8IMZvQtQXLppDYg==" + }, + "vuex-class": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/vuex-class/-/vuex-class-0.3.1.tgz", + "integrity": "sha512-d7Hc+ItQx6p9E/2mEWiyrvyEuo7Uj0mq4VNImd7dmxTelnkhOavKPMEG1Xdypug2RlPEYv0920IOa3hdVZ+4AA==" + }, + "vuex-module-decorators": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/vuex-module-decorators/-/vuex-module-decorators-0.9.8.tgz", + "integrity": "sha512-yyh9+0mO7NYZxw5BlXWNA/lHioVOUL0muDpJPL9ssAvje2PHQfFSOCSridK4vA3HasjyaGRtTPJKH7+7UCcpwg==", + "dev": true + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "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" + } + }, + "webpack": { + "version": "4.28.4", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.28.4.tgz", + "integrity": "sha512-NxjD61WsK/a3JIdwWjtIpimmvE6UrRi3yG54/74Hk9rwNj5FPkA4DJCf1z4ByDWLkvZhTZE+P3C/eh6UD5lDcw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-module-context": "1.7.11", + "@webassemblyjs/wasm-edit": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11", + "acorn": "^5.6.2", + "acorn-dynamic-import": "^3.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "chrome-trace-event": "^1.0.0", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.0", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "micromatch": "^3.1.8", + "mkdirp": "~0.5.0", + "neo-async": "^2.5.0", + "node-libs-browser": "^2.0.0", + "schema-utils": "^0.4.4", + "tapable": "^1.1.0", + "terser-webpack-plugin": "^1.1.0", + "watchpack": "^1.5.0", + "webpack-sources": "^1.3.0" + } + }, + "webpack-bundle-analyzer": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.0.3.tgz", + "integrity": "sha512-naLWiRfmtH4UJgtUktRTLw6FdoZJ2RvCR9ePbwM9aRMsS/KjFerkPZG9epEvXRAw5d5oPdrs9+3p+afNjxW8Xw==", + "dev": true, + "requires": { + "acorn": "^5.7.3", + "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": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + } + } + }, + "webpack-chain": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/webpack-chain/-/webpack-chain-4.12.1.tgz", + "integrity": "sha512-BCfKo2YkDe2ByqkEWe1Rw+zko4LsyS75LVr29C6xIrxAg9JHJ4pl8kaIZ396SUSNp6b4815dRZPSTAS8LlURRQ==", + "dev": true, + "requires": { + "deepmerge": "^1.5.2", + "javascript-stringify": "^1.6.0" + } + }, + "webpack-dev-middleware": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz", + "integrity": "sha512-Q9Iyc0X9dP9bAsYskAVJ/hmIZZQwf/3Sy4xCAZgL5cUkjZmUZLt4l5HpbST/Pdgjn3u6pE7u5OdGd1apgzRujA==", + "dev": true, + "requires": { + "memory-fs": "~0.4.1", + "mime": "^2.3.1", + "range-parser": "^1.0.3", + "webpack-log": "^2.0.0" + } + }, + "webpack-dev-server": { + "version": "3.1.14", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.1.14.tgz", + "integrity": "sha512-mGXDgz5SlTxcF3hUpfC8hrQ11yhAttuUQWf1Wmb+6zo3x6rb7b9mIfuQvAPLdfDRCGRGvakBWHdHOa0I9p/EVQ==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.0.0", + "compression": "^1.5.2", + "connect-history-api-fallback": "^1.3.0", + "debug": "^3.1.0", + "del": "^3.0.0", + "express": "^4.16.2", + "html-entities": "^1.2.0", + "http-proxy-middleware": "~0.18.0", + "import-local": "^2.0.0", + "internal-ip": "^3.0.1", + "ip": "^1.1.5", + "killable": "^1.0.0", + "loglevel": "^1.4.1", + "opn": "^5.1.0", + "portfinder": "^1.0.9", + "schema-utils": "^1.0.0", + "selfsigned": "^1.9.1", + "semver": "^5.6.0", + "serve-index": "^1.7.2", + "sockjs": "0.3.19", + "sockjs-client": "1.3.0", + "spdy": "^4.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^5.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "3.4.0", + "webpack-log": "^2.0.0", + "yargs": "12.0.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 + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz", + "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==", + "dev": true, + "requires": { + "xregexp": "4.0.0" + } + }, + "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": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.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" + } + }, + "yargs": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz", + "integrity": "sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^2.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^10.1.0" + } + }, + "yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "webpack-merge": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.1.tgz", + "integrity": "sha512-4p8WQyS98bUJcCvFMbdGZyZmsKuWjWVnVHnAS3FFg0HDaRVrPbkivx2RYCre8UiemD67RsiFFLfn4JhLAin8Vw==", + "dev": true, + "requires": { + "lodash": "^4.17.5" + } + }, + "webpack-sources": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", + "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "websocket-driver": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", + "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "dev": true, + "requires": { + "http-parser-js": ">=0.4.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "worker-farm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", + "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "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" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "ws": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.3.tgz", + "integrity": "sha512-tbSxiT+qJI223AP4iLfQbkbxkwdFcneYinM2+x46Gx2wgvbaOMO36czfdfVUBRTHvzAMRhDd98sA5d/BuWbQdg==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xregexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz", + "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yorkie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yorkie/-/yorkie-2.0.0.tgz", + "integrity": "sha512-jcKpkthap6x63MB4TxwCyuIGkV0oYP/YRyuQU5UO0Yz/E/ZAu+653/uov+phdmO54n6BcvFRyyt0RRrWdN2mpw==", + "dev": true, + "requires": { + "execa": "^0.8.0", + "is-ci": "^1.0.10", + "normalize-path": "^1.0.0", + "strip-indent": "^2.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", + "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "normalize-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz", + "integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + } + } +} diff --git a/ui/package.json b/ui/package.json new file mode 100644 index 000000000..7739530cd --- /dev/null +++ b/ui/package.json @@ -0,0 +1,42 @@ +{ + "name": "ods-webclient", + "version": "0.1.0", + "homepage": "https://github.com/jvalue/ods-webclient", + "repository": "https://github.com/jvalue/ods-webclient.git", + "licenses": [ + { + "type": "GNU Affero General Public License 3", + "url": "https://opensource.org/licenses/AGPL-3.0" + } + ], + "scripts": { + "serve": "vue-cli-service serve", + "build": "vue-cli-service build", + "lint": "vue-cli-service lint" + }, + "husky": { + "hooks": { + "pre-commit": "vue-cli-service lint" + } + }, + "dependencies": { + "@types/node": "^11.13.5", + "keycloak-js": "^4.8.3", + "vue": "^2.6.3", + "vue-class-component": "^6.3.0", + "vue-router": "^3.0.1", + "vuetify": "^1.5.0", + "vuex": "^3.1.0", + "vuex-class": "^0.3.1" + }, + "devDependencies": { + "@mdi/font": "^3.4.93", + "@vue/cli-plugin-babel": "^3.4.0", + "@vue/cli-plugin-typescript": "^3.4.0", + "@vue/cli-service": "^3.4.0", + "husky": "^1.3.1", + "typescript": "^3.3.1", + "vue-template-compiler": "^2.6.3", + "vuex-module-decorators": "^0.9.8" + } +} diff --git a/ui/postcss.config.js b/ui/postcss.config.js new file mode 100644 index 000000000..961986e2b --- /dev/null +++ b/ui/postcss.config.js @@ -0,0 +1,5 @@ +module.exports = { + plugins: { + autoprefixer: {} + } +} diff --git a/ui/public/index.html b/ui/public/index.html new file mode 100644 index 000000000..246bb8b09 --- /dev/null +++ b/ui/public/index.html @@ -0,0 +1,20 @@ + + + + + + + + ODS-Webclient + + + +
+ + + diff --git a/ui/src/App.vue b/ui/src/App.vue new file mode 100644 index 000000000..e76b47460 --- /dev/null +++ b/ui/src/App.vue @@ -0,0 +1,87 @@ + + + + + diff --git a/ui/src/components/Login.vue b/ui/src/components/Login.vue new file mode 100644 index 000000000..a337f5c57 --- /dev/null +++ b/ui/src/components/Login.vue @@ -0,0 +1,82 @@ + + + diff --git a/ui/src/components/auth/module.ts b/ui/src/components/auth/module.ts new file mode 100644 index 000000000..afcc9749a --- /dev/null +++ b/ui/src/components/auth/module.ts @@ -0,0 +1,72 @@ +import { Module, VuexModule, Mutation, Action } from 'vuex-module-decorators'; +import { + keycloakLogin, + loadKeycloakUserProfile, + isAuthenticated, + keycloakInit, + keycloakEditProfile, +} from '@/keycloak'; +import { KeycloakProfile } from 'keycloak-js'; + +const AUTH_URL: string = process.env.VUE_APP_AUTH_SERVER_URL; + +@Module({ namespaced: true }) +export default class AuthModule extends VuexModule { + private isAuth: boolean = false; + private userProfile: KeycloakProfile = {}; + + @Action({ commit: 'setAuth' }) + public async initKeycloak() { + await keycloakInit(AUTH_URL); + const isAuth = isAuthenticated(); + + if (isAuth) { + this.context.dispatch('loadUserProfile'); + } + return isAuth; + } + + @Action({ commit: 'setAuth' }) + public async login() { + const isSuccessful: boolean = await keycloakLogin(); + + if (isSuccessful) { + this.context.dispatch('loadUserProfile'); + } + + return isSuccessful; + } + + @Action({ commit: 'setAuth' }) + public logout() { + this.context.commit('setUserProfile', {}); + return false; + } + + @Action + public async editProfile() { + await keycloakEditProfile(); + } + + @Action({ commit: 'setUserProfile' }) + public async loadUserProfile() { + return new Promise((resolve, reject) => { + loadKeycloakUserProfile() + .success(profile => { + resolve(profile); + }) + .error(err => { + reject(err); + }); + }); + } + + @Mutation + private setAuth(value: boolean) { + this.isAuth = value; + } + + @Mutation private setUserProfile(value: KeycloakProfile) { + this.userProfile = value; + } +} diff --git a/ui/src/keycloak.ts b/ui/src/keycloak.ts new file mode 100644 index 000000000..a0797d1c0 --- /dev/null +++ b/ui/src/keycloak.ts @@ -0,0 +1,148 @@ +import Keycloak, { KeycloakInitOptions, KeycloakInstance } from 'keycloak-js'; + +// ================================================================================================= + +let keycloak: KeycloakInstance | undefined; + +// ================================================================================================= + +const options: KeycloakInitOptions = { + onLoad: 'check-sso', + checkLoginIframe: false, + }; + + +export function keycloakInit( + keycloakURL: string, +): Promise { + const constructorOptions = { + url: keycloakURL, + realm: 'ods-userservice', + clientId: 'ods-webclient', + }; + return new Promise((resolve, reject) => { + const keycloakAuth = (keycloak = Keycloak(constructorOptions)); + function init() { + keycloakAuth + .init(options) + .success(authenticated => { + console.log('Keycloak initialization successful:', authenticated); + resolve(keycloakAuth); + }) + .error((errorData: any) => { + console.error('Error during Keycloak initialization:', errorData); + reject(errorData); + }); + } + + keycloakAuth.onAuthSuccess = () => { + console.log('onAuthSuccess', arguments); + loadKeycloakUserProfile(); + }; + keycloakAuth.onAuthError = () => console.log('onAuthError', arguments); + keycloakAuth.onAuthLogout = () => console.log('onAuthLogout', arguments); + keycloakAuth.onAuthRefreshSuccess = () => + console.log('onAuthRefreshSuccess', arguments); + keycloakAuth.onAuthRefreshError = () => { + console.log('onAuthRefreshError', arguments); + init(); + }; + init(); + }); +} + +export function keycloakLogin(): Promise { + return new Promise((resolve, reject) => { + if (keycloak) { + const keycloakAuth = keycloak; + keycloakAuth + .login() + .success(() => { + console.log('login successful'); + resolve(true); + }) + .error(() => { + console.error('login failed'); + reject(false); + }); + } else { + console.error('login failed: keycloak undefined'); + reject(false); + } + }); +} + +export function keycloakEditProfile(): Promise { + return new Promise((resolve, reject) => { + if (keycloak) { + const keycloakAuth = keycloak; + keycloakAuth + .accountManagement() + .success(() => { + console.log('edit profile successful'); + resolve(true); + }) + .error(() => { + console.error('edit profile failed'); + reject(false); + }); + } else { + console.error('edit profile failed: keycloak undefined'); + reject(false); + } + }); +} + +export function editKeycloakUserProfile(): Promise { + return new Promise((resolve, reject) => { + if (keycloak) { + const keycloakAuth = keycloak; + keycloakAuth + .accountManagement() + .success(() => { + console.log('edit profile redirect successful'); + resolve(true); + }) + .error(() => { + console.error('edit profile failed'); + reject(false); + }); + } else { + console.error('edit profile error: keycloak undefined'); + reject(false); + } + }); +} + +export function useBearer(): Promise { + return new Promise((resolve, reject) => { + if (keycloak && keycloak.token) { + const keycloakAuth = keycloak; + keycloakAuth + .updateToken(5) + .success(() => { + resolve(keycloakAuth.token); + }) + .error(() => { + reject('Failed to refresh token'); + }); + } else { + reject('Not logged in'); + } + }); +} + +export function isAuthenticated(): boolean { + if (keycloak === undefined || keycloak!.authenticated === undefined) { + return false; + } + + return keycloak.authenticated; +} + +export function loadKeycloakUserProfile(): Keycloak.KeycloakPromise< + Keycloak.KeycloakProfile, + void +> { + return keycloak!.loadUserProfile(); +} diff --git a/ui/src/main.ts b/ui/src/main.ts new file mode 100644 index 000000000..9ddc44a64 --- /dev/null +++ b/ui/src/main.ts @@ -0,0 +1,30 @@ +import Vue from 'vue'; +import Vuex from 'vuex'; +import App from './App.vue'; +import router from './router'; +import Vuetify from 'vuetify'; +import 'vuetify/dist/vuetify.min.css'; +import '@mdi/font/css/materialdesignicons.css'; +import TransformationModule from '@/transformation/module'; +import AuthModule from '@/components/auth/module'; + +Vue.use(Vuetify, { + iconfont: 'mdi', +}); + +Vue.use(Vuex); + +Vue.config.productionTip = false; + +export const store = new Vuex.Store({ + modules: { + auth: AuthModule, + transformation: TransformationModule, + }, +}); + +new Vue({ + router, + store, + render: h => h(App), +}).$mount('#app'); diff --git a/ui/src/router.ts b/ui/src/router.ts new file mode 100644 index 000000000..351d616ea --- /dev/null +++ b/ui/src/router.ts @@ -0,0 +1,43 @@ +import Vue from 'vue'; +import Router from 'vue-router'; +import Home from './views/Home.vue'; +import transformationRoutes from '@/transformation/router'; +import { isAuthenticated, keycloakLogin, keycloakInit } from './keycloak'; + +Vue.use(Router); + +const baseRoutes = [ + { + path: '/', + name: 'home', + component: Home, + meta: { title: 'Dashboard' }, + }, + { + path: '/about', + name: 'about', + meta: { title: 'About' }, + // route level code-splitting + // this generates a separate chunk (about.[hash].js) for this route + // which is lazy-loaded when the route is visited. + component: () => + import(/* webpackChunkName: "about" */ './views/About.vue'), + }, +]; + +const routes = baseRoutes.concat(transformationRoutes); + +const router = new Router({ + mode: 'history', + base: process.env.BASE_URL, + routes, +}); + +router.beforeEach((to, from, next) => { + if (to.meta.requiresAuth && !isAuthenticated()) { + keycloakLogin(); + } + next(); +}); + +export default router; diff --git a/ui/src/shims-tsx.d.ts b/ui/src/shims-tsx.d.ts new file mode 100644 index 000000000..3b88b5829 --- /dev/null +++ b/ui/src/shims-tsx.d.ts @@ -0,0 +1,13 @@ +import Vue, { VNode } from 'vue'; + +declare global { + namespace JSX { + // tslint:disable no-empty-interface + interface Element extends VNode {} + // tslint:disable no-empty-interface + interface ElementClass extends Vue {} + interface IntrinsicElements { + [elem: string]: any; + } + } +} diff --git a/ui/src/shims-vue.d.ts b/ui/src/shims-vue.d.ts new file mode 100644 index 000000000..8f6f41026 --- /dev/null +++ b/ui/src/shims-vue.d.ts @@ -0,0 +1,4 @@ +declare module '*.vue' { + import Vue from 'vue'; + export default Vue; +} diff --git a/ui/src/transformation/TransformationMain.vue b/ui/src/transformation/TransformationMain.vue new file mode 100644 index 000000000..47de1a90d --- /dev/null +++ b/ui/src/transformation/TransformationMain.vue @@ -0,0 +1,36 @@ + + + + \ No newline at end of file diff --git a/ui/src/transformation/module.ts b/ui/src/transformation/module.ts new file mode 100644 index 000000000..82b13ed63 --- /dev/null +++ b/ui/src/transformation/module.ts @@ -0,0 +1,16 @@ +import { Module, VuexModule, Mutation, Action } from 'vuex-module-decorators'; +import * as TransformationRestService from './transformationRest'; + +@Module({ namespaced: true }) +export default class TransformationModule extends VuexModule { + private transformationResult: object = {}; + + @Action({ commit: 'setTransformationResult' }) + public async transformData(inputFunc: string) { + return await TransformationRestService.transformData(inputFunc); + } + + @Mutation private setTransformationResult(value: object) { + this.transformationResult = value; + } +} diff --git a/ui/src/transformation/router.ts b/ui/src/transformation/router.ts new file mode 100644 index 000000000..985eab52e --- /dev/null +++ b/ui/src/transformation/router.ts @@ -0,0 +1,10 @@ +import TransformationMain from './TransformationMain.vue'; + +export default [ + { + path: '/transformation', + name: 'transformation', + component: TransformationMain, + meta: { title: 'Transformation Service', requiresAuth: true }, + }, +]; diff --git a/ui/src/transformation/transformationRest.ts b/ui/src/transformation/transformationRest.ts new file mode 100644 index 000000000..271c9b1a3 --- /dev/null +++ b/ui/src/transformation/transformationRest.ts @@ -0,0 +1,25 @@ +import { useBearer } from '@/keycloak'; + +export async function transformData(inputFunc: string): Promise { + console.log(process.env.VUE_APP_TRANSFORMATION_SERVICE_URL); + const token = await useBearer().catch(error => { + console.error('Unable to get keycloak token. Error: ' + error); + }); + + if (token === undefined) { + return; + } + + return fetch(process.env.VUE_APP_TRANSFORMATION_SERVICE_URL, { + method: 'POST', + mode: 'cors', + body: inputFunc, + headers: { + 'Content-Type': 'application/json', + 'Authorization': 'Bearer ' + token, + }, + }).then(response => { + return response.json(); + }); +} + diff --git a/ui/src/views/About.vue b/ui/src/views/About.vue new file mode 100644 index 000000000..3fa28070d --- /dev/null +++ b/ui/src/views/About.vue @@ -0,0 +1,5 @@ + diff --git a/ui/src/views/Home.vue b/ui/src/views/Home.vue new file mode 100644 index 000000000..a263a80ff --- /dev/null +++ b/ui/src/views/Home.vue @@ -0,0 +1,14 @@ + + + diff --git a/ui/tsconfig.json b/ui/tsconfig.json new file mode 100644 index 000000000..204fa50e0 --- /dev/null +++ b/ui/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "target": "esnext", + "module": "esnext", + "strict": true, + "jsx": "preserve", + "importHelpers": true, + "moduleResolution": "node", + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "sourceMap": true, + "experimentalDecorators": true, + "allowJs": true, + "baseUrl": ".", + "types": ["webpack-env", "node"], + "paths": { + "@/*": ["src/*"] + }, + "lib": ["esnext", "dom", "dom.iterable", "scripthost"] + }, + "include": [ + "src/**/*.ts", + "src/**/*.tsx", + "src/**/*.vue", + "tests/**/*.ts", + "tests/**/*.tsx" + ], + "exclude": ["node_modules"] +} diff --git a/ui/tslint.json b/ui/tslint.json new file mode 100644 index 000000000..1c32b76d2 --- /dev/null +++ b/ui/tslint.json @@ -0,0 +1,17 @@ +{ + "defaultSeverity": "warning", + "extends": ["tslint:recommended"], + "linterOptions": { + "exclude": ["node_modules/**"] + }, + "rules": { + "quotemark": [true, "single"], + "indent": [true, "spaces", 2], + "interface-name": false, + "ordered-imports": false, + "object-literal-sort-keys": false, + "no-consecutive-blank-lines": false, + "arrow-parens": false, + "no-console": false + } +} diff --git a/ui/vue.config.js b/ui/vue.config.js new file mode 100644 index 000000000..5bfe7f340 --- /dev/null +++ b/ui/vue.config.js @@ -0,0 +1,9 @@ +module.exports = { + configureWebpack: { + devServer: { + open: true, + port: 3000 + }, + devtool: 'source-map' + } +}; From 3331e051c00a0a77bb193507bfc2535628b1380e Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Fri, 3 May 2019 16:23:35 +0200 Subject: [PATCH 0003/1168] migrate transformation service --- transformation/.eslintrc | 3 + transformation/.gitignore | 87 ++ transformation/.prettierrc | 5 + transformation/LICENSE | 661 +++++++++ transformation/README.md | 36 + transformation/keycloak.json | 8 + transformation/package-lock.json | 2331 ++++++++++++++++++++++++++++++ transformation/package.json | 29 + transformation/src/api.js | 31 + transformation/src/sandbox.js | 26 + 10 files changed, 3217 insertions(+) create mode 100644 transformation/.eslintrc create mode 100644 transformation/.gitignore create mode 100644 transformation/.prettierrc create mode 100644 transformation/LICENSE create mode 100644 transformation/README.md create mode 100644 transformation/keycloak.json create mode 100644 transformation/package-lock.json create mode 100644 transformation/package.json create mode 100644 transformation/src/api.js create mode 100644 transformation/src/sandbox.js diff --git a/transformation/.eslintrc b/transformation/.eslintrc new file mode 100644 index 000000000..e3578aadf --- /dev/null +++ b/transformation/.eslintrc @@ -0,0 +1,3 @@ +{ + "extends": "standard" +} diff --git a/transformation/.gitignore b/transformation/.gitignore new file mode 100644 index 000000000..f0aeaf5da --- /dev/null +++ b/transformation/.gitignore @@ -0,0 +1,87 @@ + +# Created by https://www.gitignore.io/api/node +# Edit at https://www.gitignore.io/?templates=node + +### Node ### +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# next.js build output +.next + +# nuxt.js build output +.nuxt + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# End of https://www.gitignore.io/api/node diff --git a/transformation/.prettierrc b/transformation/.prettierrc new file mode 100644 index 000000000..e6f8ee392 --- /dev/null +++ b/transformation/.prettierrc @@ -0,0 +1,5 @@ +{ + "singleQuote": true, + "trailingComma": "es5", + "semi": false +} diff --git a/transformation/LICENSE b/transformation/LICENSE new file mode 100644 index 000000000..dbbe35581 --- /dev/null +++ b/transformation/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/transformation/README.md b/transformation/README.md new file mode 100644 index 000000000..0c5c8d304 --- /dev/null +++ b/transformation/README.md @@ -0,0 +1,36 @@ +# Open Data Service - Transformation-Service + +TBD + +## Getting started + +TBD + +## Build + +TBD + +## Running unit tests + +TBD + +## Running end-to-end tests + +TBD + +## License + +Copyright 2018 Friedrich-Alexander Universität Erlangen-Nürnberg + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . diff --git a/transformation/keycloak.json b/transformation/keycloak.json new file mode 100644 index 000000000..2cce10290 --- /dev/null +++ b/transformation/keycloak.json @@ -0,0 +1,8 @@ +{ + "realm": "ods-userservice", + "bearer-only": true, + "auth-server-url": "http://localhost:8080/auth", + "ssl-required": "external", + "resource": "transformation-service", + "confidential-port": 0 +} diff --git a/transformation/package-lock.json b/transformation/package-lock.json new file mode 100644 index 000000000..8d22d7fa7 --- /dev/null +++ b/transformation/package-lock.json @@ -0,0 +1,2331 @@ +{ + "name": "open-data-service-transformation", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/highlight": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", + "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "requires": { + "mime-types": "~2.1.18", + "negotiator": "0.6.1" + } + }, + "acorn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.5.tgz", + "integrity": "sha512-i33Zgp3XWtmZBMNvCr4azvOFeWVw1Rk6p3hfi3LUDvIFraOMywb1kAtrbi+med14m4Xfpqm3zRZMT+c0FNE7kg==", + "dev": true + }, + "acorn-jsx": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", + "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", + "dev": true + }, + "ajv": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz", + "integrity": "sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==", + "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" + } + }, + "ajv-keywords": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.3.0.tgz", + "integrity": "sha512-CMzN9S62ZOO4sA/mJZIO4S++ZM7KFWzH3PPWkveLhy4OZ9i1/VatgwWMD46w/XbGCBy7Ye0gCk+Za6mmyfKK7g==", + "dev": true + }, + "ansi-escapes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" + } + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "body-parser": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", + "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" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "^0.2.0" + }, + "dependencies": { + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + } + } + }, + "callsites": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.0.0.tgz", + "integrity": "sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw==", + "dev": true + }, + "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" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "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 + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "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.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "crc": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.4.4.tgz", + "integrity": "sha1-naHpgOO9RPxck79as9ozeNheRms=" + }, + "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" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "debug-log": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", + "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "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" + } + }, + "deglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.1.tgz", + "integrity": "sha512-2kjwuGGonL7gWE1XU4Fv79+vVzpoQCl0V+boMwWtOQJV2AGDabCwez++nB1Nli/8BabAfZQ/UuHPlp6AymKdWw==", + "dev": true, + "requires": { + "find-root": "^1.0.0", + "glob": "^7.0.5", + "ignore": "^3.0.9", + "pkg-config": "^1.1.0", + "run-parallel": "^1.1.2", + "uniq": "^1.0.1" + }, + "dependencies": { + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + } + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "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" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "elliptic": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", + "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", + "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" + } + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", + "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-keys": "^1.0.12" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint": { + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.12.0.tgz", + "integrity": "sha512-LntwyPxtOHrsJdcSwyQKVtHofPHdv+4+mFwEe91r2V13vqpM8yLr7b1sW+Oo/yheOPkWYsYlYJCkzlFAt8KV7g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.5.3", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^2.1.0", + "eslint-scope": "^4.0.0", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^5.0.0", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.7.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^6.1.0", + "js-yaml": "^3.12.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.5", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^5.5.1", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", + "table": "^5.0.2", + "text-table": "^0.2.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.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "eslint-config-standard": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz", + "integrity": "sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ==", + "dev": true + }, + "eslint-config-standard-jsx": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-6.0.2.tgz", + "integrity": "sha512-D+YWAoXw+2GIdbMBRAzWwr1ZtvnSf4n4yL0gKGg7ShUOGXkSOLerI17K4F6LdQMJPNMoWYqepzQD/fKY+tXNSg==", + "dev": true + }, + "eslint-import-resolver-node": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", + "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.5.0" + } + }, + "eslint-module-utils": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.3.0.tgz", + "integrity": "sha512-lmDJgeOOjk8hObTysjqH7wyMi+nsHwwvfBykwfhjR1LNdd7C2uFJBvx4OpWYpXOw4df1yE1cDEVd1yLHitk34w==", + "dev": true, + "requires": { + "debug": "^2.6.8", + "pkg-dir": "^2.0.0" + } + }, + "eslint-plugin-es": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-1.4.0.tgz", + "integrity": "sha512-XfFmgFdIUDgvaRAlaXUkxrRg5JSADoRC8IkKLc/cISeR3yHVMefFHQZpcyXXEUUPHfy5DwviBcrfqlyqEwlQVw==", + "dev": true, + "requires": { + "eslint-utils": "^1.3.0", + "regexpp": "^2.0.1" + } + }, + "eslint-plugin-import": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz", + "integrity": "sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g==", + "dev": true, + "requires": { + "contains-path": "^0.1.0", + "debug": "^2.6.8", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.1", + "eslint-module-utils": "^2.2.0", + "has": "^1.0.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.3", + "read-pkg-up": "^2.0.0", + "resolve": "^1.6.0" + }, + "dependencies": { + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + } + } + }, + "eslint-plugin-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-7.0.1.tgz", + "integrity": "sha512-lfVw3TEqThwq0j2Ba/Ckn2ABdwmL5dkOgAux1rvOk6CO7A6yGyPI2+zIxN6FyNkp1X1X/BSvKOceD6mBWSj4Yw==", + "dev": true, + "requires": { + "eslint-plugin-es": "^1.3.1", + "eslint-utils": "^1.3.1", + "ignore": "^4.0.2", + "minimatch": "^3.0.4", + "resolve": "^1.8.1", + "semver": "^5.5.0" + } + }, + "eslint-plugin-promise": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.0.1.tgz", + "integrity": "sha512-Si16O0+Hqz1gDHsys6RtFRrW7cCTB6P7p3OJmKp3Y3dxpQE2qwOA7d3xnV+0mBmrPoi0RBnxlCKvqu70te6wjg==", + "dev": true + }, + "eslint-plugin-react": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz", + "integrity": "sha512-cVVyMadRyW7qsIUh3FHp3u6QHNhOgVrLQYdQEB1bPWBsgbNCHdFAeNMquBMCcZJu59eNthX053L70l7gRt4SCw==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.0.1", + "prop-types": "^15.6.2" + } + }, + "eslint-plugin-standard": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.0.tgz", + "integrity": "sha512-OwxJkR6TQiYMmt1EsNRMe5qG3GsbjlcOhbGUBY4LtavF9DsLaTcoR+j2Tdjqi23oUwKNUqX7qcn5fPStafMdlA==", + "dev": true + }, + "eslint-scope": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", + "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz", + "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==", + "dev": true + }, + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "dev": true + }, + "espree": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.0.tgz", + "integrity": "sha512-1MpUfwsdS9MMoN7ZXqAr9e9UKdVHDcvrJpyx7mm1WuQlx/ygErEQBzgi5Nh5qBHIoYweprhtMkTCb9GhcAIcsA==", + "dev": true, + "requires": { + "acorn": "^6.0.2", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" + } + }, + "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 + }, + "esquery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "dev": true, + "requires": { + "estraverse": "^4.0.0" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "express": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", + "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", + "requires": { + "accepts": "~1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.3", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.4", + "qs": "6.5.2", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.2", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "~1.4.0", + "type-is": "~1.6.16", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + } + } + }, + "express-session": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.15.6.tgz", + "integrity": "sha512-r0nrHTCYtAMrFwZ0kBzZEXa1vtPVrw0dKvGSrKP4dahwBQ1BJpF2/y1Pp4sCD/0kvxV4zZeclyvfmw0B4RMJQA==", + "requires": { + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "crc": "3.4.4", + "debug": "2.6.9", + "depd": "~1.1.1", + "on-headers": "~1.0.1", + "parseurl": "~1.3.2", + "uid-safe": "~2.1.5", + "utils-merge": "1.0.1" + } + }, + "external-editor": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", + "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", + "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" + } + } + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" + } + }, + "finalhandler": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "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" + }, + "dependencies": { + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + } + } + }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "flat-cache": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", + "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", + "dev": true, + "requires": { + "circular-json": "^0.3.1", + "graceful-fs": "^4.1.2", + "rimraf": "~2.6.2", + "write": "^0.2.1" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "globals": { + "version": "11.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.10.0.tgz", + "integrity": "sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ==", + "dev": true + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "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 + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, + "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=", + "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==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "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 + }, + "import-fresh": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz", + "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "inquirer": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.1.tgz", + "integrity": "sha512-088kl3DRT2dLU5riVMKKr1DlImd6X7smDhpXUCkJDCKvTEJeRiXh0G132HG9u5a+6Ylw9plFRY7RuTnwohYSpg==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.0", + "figures": "^2.0.0", + "lodash": "^4.17.10", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.1.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", + "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==", + "dev": true + }, + "strip-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", + "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", + "dev": true, + "requires": { + "ansi-regex": "^4.0.0" + } + } + } + }, + "ipaddr.js": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", + "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-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-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-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-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "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 + }, + "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 + }, + "js-yaml": { + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz", + "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "jsx-ast-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz", + "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", + "dev": true, + "requires": { + "array-includes": "^3.0.3" + } + }, + "jwk-to-pem": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwk-to-pem/-/jwk-to-pem-2.0.1.tgz", + "integrity": "sha512-KKu0WuDDjqw2FlRFp9/vk9TMO/KvgpZVKzdhhYcNyy5OwE8dw9lOK5OQTQHIJ7m+HioI/4P44sAtVuDrQ8KQfw==", + "requires": { + "asn1.js": "^4.5.2", + "elliptic": "^6.2.3", + "safe-buffer": "^5.0.1" + } + }, + "keycloak-connect": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/keycloak-connect/-/keycloak-connect-5.0.0.tgz", + "integrity": "sha512-9SDZc6bbNzWY1di1qEQAW4RY94t/z6hWvkj6RNro3sWV3PSuT/DNXsCyfZpEJlj5Vz60w8p496HuNdMyqsV7AQ==", + "requires": { + "jwk-to-pem": "^2.0.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "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": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.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" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, + "mime-db": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" + }, + "mime-types": { + "version": "2.1.21", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", + "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", + "requires": { + "mime-db": "~1.37.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "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=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-keys": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "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==" + }, + "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": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-limit": { + "version": "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 + }, + "parent-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.0.tgz", + "integrity": "sha512-8Mf5juOMmiE4FcmzYc4IaiS9L3+9paz2KOiXzkRviCP6aDmN49Hz6EMWz0lGNp9pX80GvvAuLADtyGfW/Em3TA==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + }, + "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.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": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pkg-conf": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", + "integrity": "sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "load-json-file": "^4.0.0" + }, + "dependencies": { + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "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": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "pkg-config": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pkg-config/-/pkg-config-1.1.1.tgz", + "integrity": "sha1-VX7yLXPaPIg3EHdmxS6tq94pj+Q=", + "dev": true, + "requires": { + "debug-log": "^1.0.0", + "find-root": "^1.0.0", + "xtend": "^4.0.1" + } + }, + "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" + } + }, + "pluralize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", + "dev": true + }, + "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 + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "prop-types": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", + "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", + "dev": true, + "requires": { + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + }, + "proxy-addr": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", + "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.8.0" + } + }, + "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 + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=" + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "raw-body": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", + "unpipe": "1.0.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + } + } + }, + "resolve": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", + "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "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 + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "run-parallel": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", + "dev": true + }, + "rxjs": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", + "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", + "dev": true, + "requires": { + "tslib": "^1.9.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==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + }, + "dependencies": { + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + } + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "slice-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.0.0.tgz", + "integrity": "sha512-4j2WTWjp3GsZ+AOagyzVbzp4vWGtZ0hEZ/gDY/uTvm6MTxUfTUIsnMIFb1bn8o0RuXiqUw15H1bue8f22Vw2oQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz", + "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "standard": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/standard/-/standard-12.0.1.tgz", + "integrity": "sha512-UqdHjh87OG2gUrNCSM4QRLF5n9h3TFPwrCNyVlkqu31Hej0L/rc8hzKqVvkb2W3x0WMq7PzZdkLfEcBhVOR6lg==", + "dev": true, + "requires": { + "eslint": "~5.4.0", + "eslint-config-standard": "12.0.0", + "eslint-config-standard-jsx": "6.0.2", + "eslint-plugin-import": "~2.14.0", + "eslint-plugin-node": "~7.0.1", + "eslint-plugin-promise": "~4.0.0", + "eslint-plugin-react": "~7.11.1", + "eslint-plugin-standard": "~4.0.0", + "standard-engine": "~9.0.0" + }, + "dependencies": { + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "eslint": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.4.0.tgz", + "integrity": "sha512-UIpL91XGex3qtL6qwyCQJar2j3osKxK9e3ano3OcGEIRM4oWIpCkDg9x95AXEC2wMs7PnxzOkPZ2gq+tsMS9yg==", + "dev": true, + "requires": { + "ajv": "^6.5.0", + "babel-code-frame": "^6.26.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^3.1.0", + "doctrine": "^2.1.0", + "eslint-scope": "^4.0.0", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^4.0.0", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.7.0", + "ignore": "^4.0.2", + "imurmurhash": "^0.1.4", + "inquirer": "^5.2.0", + "is-resolvable": "^1.1.0", + "js-yaml": "^3.11.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.5", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "regexpp": "^2.0.0", + "require-uncached": "^1.0.3", + "semver": "^5.5.0", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", + "table": "^4.0.3", + "text-table": "^0.2.0" + } + }, + "espree": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-4.1.0.tgz", + "integrity": "sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w==", + "dev": true, + "requires": { + "acorn": "^6.0.2", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" + } + }, + "external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dev": true, + "requires": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + } + }, + "inquirer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", + "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.1.0", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^5.5.2", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + } + }, + "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 + }, + "rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "dev": true, + "requires": { + "symbol-observable": "1.0.1" + } + }, + "slice-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0" + } + }, + "table": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", + "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", + "dev": true, + "requires": { + "ajv": "^6.0.1", + "ajv-keywords": "^3.0.0", + "chalk": "^2.1.0", + "lodash": "^4.17.4", + "slice-ansi": "1.0.0", + "string-width": "^2.1.1" + } + } + } + }, + "standard-engine": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-9.0.0.tgz", + "integrity": "sha512-ZfNfCWZ2Xq67VNvKMPiVMKHnMdvxYzvZkf1AH8/cw2NLDBm5LRsxMqvEJpsjLI/dUosZ3Z1d6JlHDp5rAvvk2w==", + "dev": true, + "requires": { + "deglob": "^2.1.0", + "get-stdin": "^6.0.0", + "minimist": "^1.1.0", + "pkg-conf": "^2.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "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-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 + }, + "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" + } + }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "dev": true + }, + "table": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/table/-/table-5.2.1.tgz", + "integrity": "sha512-qmhNs2GEHNqY5fd2Mo+8N1r2sw/rvTAAvBZTaTx+Y7PHLypqyrxr1MdIu0pLw6Xvl/Gi4ONu/sdceP8vvUjkyA==", + "dev": true, + "requires": { + "ajv": "^6.6.1", + "lodash": "^4.17.11", + "slice-ansi": "2.0.0", + "string-width": "^2.1.1" + } + }, + "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=", + "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" + } + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-is": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.18" + } + }, + "uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "requires": { + "random-bytes": "~1.0.0" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "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" + } + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "vm2": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.6.6.tgz", + "integrity": "sha512-SXC941SEoL0c8+qe+N/PVYsck6vN6fzdkObISlF+YlCHeMCHhHsFD4yuydr1azEYqE8qgxHHkGPOd+iiV9sUyA==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } +} diff --git a/transformation/package.json b/transformation/package.json new file mode 100644 index 000000000..340e5bc84 --- /dev/null +++ b/transformation/package.json @@ -0,0 +1,29 @@ +{ + "name": "open-data-service-transformation", + "version": "1.0.0", + "description": "TBD", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node src/api.js", + "lint": "./node_modules/.bin/eslint src/ --fix" + }, + "repository": { + "type": "git", + "url": "https://mojo-forge.cs.fau.de/open-data/open-data-service-transformation.git" + }, + "author": "", + "license": "ISC", + "dependencies": { + "body-parser": "^1.18.3", + "cors": "^2.8.5", + "express": "^4.16.4", + "express-session": "^1.15.6", + "keycloak-connect": "^5.0.0" + }, + "devDependencies": { + "eslint": "^5.12.0", + "standard": "^12.0.1", + "vm2": "^3.6.6" + } +} diff --git a/transformation/src/api.js b/transformation/src/api.js new file mode 100644 index 000000000..c4d3030bc --- /dev/null +++ b/transformation/src/api.js @@ -0,0 +1,31 @@ +// @ts-check + +const bodyParser = require('body-parser') +const express = require('express') +const session = require('express-session') +const cors = require('cors') +const sandbox = require('./sandbox') +const Keycloak = require('keycloak-connect') + +const memoryStore = new session.MemoryStore() + +const app = express() +const port = 4000 +const keycloak = new Keycloak({ store: memoryStore }) + +app.use(cors()) +app.use(keycloak.middleware()) +app.use(bodyParser.json()) +app.use(bodyParser.urlencoded({ extended: false })) + +app.listen(port, () => { + console.log('listening on port ' + port) +}) + +app.post('/job', keycloak.protect(), (req, res) => { + let answer = '' + sandbox.execute(req.body.func, req.body.data) + res.setHeader('Content-Type', 'application/json') + res.writeHead(200) + res.write(answer) + res.end() +}) diff --git a/transformation/src/sandbox.js b/transformation/src/sandbox.js new file mode 100644 index 000000000..1d1936298 --- /dev/null +++ b/transformation/src/sandbox.js @@ -0,0 +1,26 @@ +// @ts-check + +const { VM } = require('vm2') +const vm = new VM({ + timeout: 5000 +}) + +function assertIsObjectOrArray (data) { + if (!(typeof data === 'object')) { + throw new TypeError('given data is no object or array') + } +} + +exports.execute = function (func, data) { + assertIsObjectOrArray(data) + + let wrapper = + 'f=function(data){' + + func + + ' ;return data;};f(' + + JSON.stringify(data) + + ')' + console.log(wrapper) + const result = vm.run(wrapper) + return JSON.stringify(result) +} From bc44e63a933b8dbdef407dc8a9b5e93967c589ef Mon Sep 17 00:00:00 2001 From: Andreas Bauer Date: Fri, 17 May 2019 12:22:34 +0000 Subject: [PATCH 0004/1168] Code style guide configuration with Eslint and Editorconfig (issue #2) --- ui/.editorconfig => .editorconfig | 1 + .vscode/settings.json | 9 + transformation/.eslintrc | 17 +- transformation/.prettierrc | 5 - transformation/package-lock.json | 375 +++++-- transformation/package.json | 8 +- transformation/src/sandbox.js | 5 +- ui/.eslintrc | 32 + .gitignore => ui/.gitignore | 0 ui/package-lock.json | 990 +++++++++++++++++++ ui/package.json | 18 +- ui/src/App.vue | 66 +- ui/src/components/Login.vue | 75 +- ui/src/components/auth/module.ts | 61 +- ui/src/keycloak.ts | 158 +-- ui/src/main.ts | 36 +- ui/src/router.ts | 34 +- ui/src/shims-tsx.d.ts | 8 +- ui/src/shims-vue.d.ts | 4 +- ui/src/transformation/TransformationMain.vue | 35 +- ui/src/transformation/module.ts | 16 +- ui/src/transformation/router.ts | 8 +- ui/src/transformation/transformationRest.ts | 27 +- ui/src/views/Home.vue | 4 +- ui/tslint.json | 17 - 25 files changed, 1660 insertions(+), 349 deletions(-) rename ui/.editorconfig => .editorconfig (92%) create mode 100644 .vscode/settings.json delete mode 100644 transformation/.prettierrc create mode 100644 ui/.eslintrc rename .gitignore => ui/.gitignore (100%) delete mode 100644 ui/tslint.json diff --git a/ui/.editorconfig b/.editorconfig similarity index 92% rename from ui/.editorconfig rename to .editorconfig index 0301b00a8..819d984be 100644 --- a/ui/.editorconfig +++ b/.editorconfig @@ -8,6 +8,7 @@ indent_size = 2 insert_final_newline = true trim_trailing_whitespace = true end_of_line = lf +max_line_length = 120 [*.md] max_line_length = off diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..df8b5f64e --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,9 @@ +{ + "editor.formatOnSave": false, + "eslint.workingDirectories": ["./transformation", "./ui"], + "eslint.autoFixOnSave": true, + "eslint.validate": [ + "javascript", + { "language": "typescript", "autoFix": true } + ] +} diff --git a/transformation/.eslintrc b/transformation/.eslintrc index e3578aadf..a186f6724 100644 --- a/transformation/.eslintrc +++ b/transformation/.eslintrc @@ -1,3 +1,18 @@ { - "extends": "standard" + "env": { + "browser": true, + "es6": true + }, + "extends": ["standard"], + "globals": { + "Atomics": "readonly", + "SharedArrayBuffer": "readonly" + }, + "parserOptions": { + "ecmaVersion": 2018, + "sourceType": "module" + }, + "rules": { + "max-len": [2, 120, 4, {"ignoreUrls": true}] + } } diff --git a/transformation/.prettierrc b/transformation/.prettierrc deleted file mode 100644 index e6f8ee392..000000000 --- a/transformation/.prettierrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "singleQuote": true, - "trailingComma": "es5", - "semi": false -} diff --git a/transformation/package-lock.json b/transformation/package-lock.json index 8d22d7fa7..72ac24f86 100644 --- a/transformation/package-lock.json +++ b/transformation/package-lock.json @@ -249,9 +249,9 @@ } }, "callsites": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.0.0.tgz", - "integrity": "sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, "chalk": { @@ -455,6 +455,12 @@ "minimalistic-crypto-utils": "^1.0.0" } }, + "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 + }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -506,50 +512,61 @@ "dev": true }, "eslint": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.12.0.tgz", - "integrity": "sha512-LntwyPxtOHrsJdcSwyQKVtHofPHdv+4+mFwEe91r2V13vqpM8yLr7b1sW+Oo/yheOPkWYsYlYJCkzlFAt8KV7g==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", + "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "ajv": "^6.5.3", + "ajv": "^6.9.1", "chalk": "^2.1.0", "cross-spawn": "^6.0.5", "debug": "^4.0.1", - "doctrine": "^2.1.0", - "eslint-scope": "^4.0.0", + "doctrine": "^3.0.0", + "eslint-scope": "^4.0.3", "eslint-utils": "^1.3.1", "eslint-visitor-keys": "^1.0.0", - "espree": "^5.0.0", + "espree": "^5.0.1", "esquery": "^1.0.1", "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", + "file-entry-cache": "^5.0.1", "functional-red-black-tree": "^1.0.1", "glob": "^7.1.2", "globals": "^11.7.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^6.1.0", - "js-yaml": "^3.12.0", + "inquirer": "^6.2.2", + "js-yaml": "^3.13.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.3.0", - "lodash": "^4.17.5", + "lodash": "^4.17.11", "minimatch": "^3.0.4", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", "optionator": "^0.8.2", "path-is-inside": "^1.0.2", - "pluralize": "^7.0.0", "progress": "^2.0.0", "regexpp": "^2.0.1", "semver": "^5.5.1", "strip-ansi": "^4.0.0", "strip-json-comments": "^2.0.1", - "table": "^5.0.2", + "table": "^5.2.3", "text-table": "^0.2.0" }, "dependencies": { + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "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" + } + }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -559,11 +576,69 @@ "ms": "^2.1.1" } }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "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" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + } + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, "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 + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } } } }, @@ -590,9 +665,9 @@ } }, "eslint-module-utils": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.3.0.tgz", - "integrity": "sha512-lmDJgeOOjk8hObTysjqH7wyMi+nsHwwvfBykwfhjR1LNdd7C2uFJBvx4OpWYpXOw4df1yE1cDEVd1yLHitk34w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.0.tgz", + "integrity": "sha512-14tltLm38Eu3zS+mt0KvILC3q8jyIAH518MlG+HO0p+yK885Lb1UHTY/UgR91eOyGdmxAPb+OLoW4znqIT6Ndw==", "dev": true, "requires": { "debug": "^2.6.8", @@ -610,21 +685,22 @@ } }, "eslint-plugin-import": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz", - "integrity": "sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g==", + "version": "2.17.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.17.2.tgz", + "integrity": "sha512-m+cSVxM7oLsIpmwNn2WXTJoReOF9f/CtLMo7qOVmKd1KntBy0hEcuNZ3erTmWjx+DxRO0Zcrm5KwAvI9wHcV5g==", "dev": true, "requires": { + "array-includes": "^3.0.3", "contains-path": "^0.1.0", - "debug": "^2.6.8", + "debug": "^2.6.9", "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.1", - "eslint-module-utils": "^2.2.0", - "has": "^1.0.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.3", + "eslint-import-resolver-node": "^0.3.2", + "eslint-module-utils": "^2.4.0", + "has": "^1.0.3", + "lodash": "^4.17.11", + "minimatch": "^3.0.4", "read-pkg-up": "^2.0.0", - "resolve": "^1.6.0" + "resolve": "^1.10.0" }, "dependencies": { "doctrine": { @@ -640,23 +716,37 @@ } }, "eslint-plugin-node": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-7.0.1.tgz", - "integrity": "sha512-lfVw3TEqThwq0j2Ba/Ckn2ABdwmL5dkOgAux1rvOk6CO7A6yGyPI2+zIxN6FyNkp1X1X/BSvKOceD6mBWSj4Yw==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-9.0.1.tgz", + "integrity": "sha512-fljT5Uyy3lkJzuqhxrYanLSsvaILs9I7CmQ31atTtZ0DoIzRbbvInBh4cQ1CrthFHInHYBQxfPmPt6KLHXNXdw==", "dev": true, "requires": { - "eslint-plugin-es": "^1.3.1", + "eslint-plugin-es": "^1.4.0", "eslint-utils": "^1.3.1", - "ignore": "^4.0.2", + "ignore": "^5.1.1", "minimatch": "^3.0.4", - "resolve": "^1.8.1", - "semver": "^5.5.0" + "resolve": "^1.10.1", + "semver": "^6.0.0" + }, + "dependencies": { + "ignore": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.1.tgz", + "integrity": "sha512-DWjnQIFLenVrwyRCKZT+7a7/U4Cqgar4WG8V++K3hw+lrW1hc/SIwdiGmtxKCVACmHULTuGeBbHJmbwW7/sAvA==", + "dev": true + }, + "semver": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", + "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==", + "dev": true + } } }, "eslint-plugin-promise": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.0.1.tgz", - "integrity": "sha512-Si16O0+Hqz1gDHsys6RtFRrW7cCTB6P7p3OJmKp3Y3dxpQE2qwOA7d3xnV+0mBmrPoi0RBnxlCKvqu70te6wjg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.1.1.tgz", + "integrity": "sha512-faAHw7uzlNPy7b45J1guyjazw28M+7gJokKUjC5JSFoYfUEyy6Gw/i7YQvmv2Yk00sUjWcmzXQLpU1Ki/C2IZQ==", "dev": true }, "eslint-plugin-react": { @@ -701,14 +791,22 @@ "dev": true }, "espree": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.0.tgz", - "integrity": "sha512-1MpUfwsdS9MMoN7ZXqAr9e9UKdVHDcvrJpyx7mm1WuQlx/ygErEQBzgi5Nh5qBHIoYweprhtMkTCb9GhcAIcsA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", + "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", "dev": true, "requires": { - "acorn": "^6.0.2", + "acorn": "^6.0.7", "acorn-jsx": "^5.0.0", "eslint-visitor-keys": "^1.0.0" + }, + "dependencies": { + "acorn": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", + "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "dev": true + } } }, "esprima": { @@ -919,6 +1017,12 @@ "write": "^0.2.1" } }, + "flatted": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz", + "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==", + "dev": true + }, "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", @@ -1099,39 +1203,45 @@ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "inquirer": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.1.tgz", - "integrity": "sha512-088kl3DRT2dLU5riVMKKr1DlImd6X7smDhpXUCkJDCKvTEJeRiXh0G132HG9u5a+6Ylw9plFRY7RuTnwohYSpg==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.3.1.tgz", + "integrity": "sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA==", "dev": true, "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", "cli-cursor": "^2.1.0", "cli-width": "^2.0.0", - "external-editor": "^3.0.0", + "external-editor": "^3.0.3", "figures": "^2.0.0", - "lodash": "^4.17.10", + "lodash": "^4.17.11", "mute-stream": "0.0.7", "run-async": "^2.2.0", - "rxjs": "^6.1.0", + "rxjs": "^6.4.0", "string-width": "^2.1.0", - "strip-ansi": "^5.0.0", + "strip-ansi": "^5.1.0", "through": "^2.3.6" }, "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, "ansi-regex": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", - "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==", + "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.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", - "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", + "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.0.0" + "ansi-regex": "^4.1.0" } } } @@ -1515,9 +1625,9 @@ "dev": true }, "parent-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.0.tgz", - "integrity": "sha512-8Mf5juOMmiE4FcmzYc4IaiS9L3+9paz2KOiXzkRviCP6aDmN49Hz6EMWz0lGNp9pX80GvvAuLADtyGfW/Em3TA==", + "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" @@ -1762,9 +1872,9 @@ } }, "resolve": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", - "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.1.tgz", + "integrity": "sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -1811,9 +1921,9 @@ "dev": true }, "rxjs": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", - "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", + "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -1900,9 +2010,9 @@ "dev": true }, "slice-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.0.0.tgz", - "integrity": "sha512-4j2WTWjp3GsZ+AOagyzVbzp4vWGtZ0hEZ/gDY/uTvm6MTxUfTUIsnMIFb1bn8o0RuXiqUw15H1bue8f22Vw2oQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", "dev": true, "requires": { "ansi-styles": "^3.2.0", @@ -1937,9 +2047,9 @@ } }, "spdx-license-ids": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz", - "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", + "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", "dev": true }, "sprintf-js": { @@ -2026,6 +2136,71 @@ "text-table": "^0.2.0" } }, + "eslint-plugin-import": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz", + "integrity": "sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g==", + "dev": true, + "requires": { + "contains-path": "^0.1.0", + "debug": "^2.6.8", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.1", + "eslint-module-utils": "^2.2.0", + "has": "^1.0.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.3", + "read-pkg-up": "^2.0.0", + "resolve": "^1.6.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" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-plugin-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-7.0.1.tgz", + "integrity": "sha512-lfVw3TEqThwq0j2Ba/Ckn2ABdwmL5dkOgAux1rvOk6CO7A6yGyPI2+zIxN6FyNkp1X1X/BSvKOceD6mBWSj4Yw==", + "dev": true, + "requires": { + "eslint-plugin-es": "^1.3.1", + "eslint-utils": "^1.3.1", + "ignore": "^4.0.2", + "minimatch": "^3.0.4", + "resolve": "^1.8.1", + "semver": "^5.5.0" + } + }, + "eslint-plugin-promise": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.0.1.tgz", + "integrity": "sha512-Si16O0+Hqz1gDHsys6RtFRrW7cCTB6P7p3OJmKp3Y3dxpQE2qwOA7d3xnV+0mBmrPoi0RBnxlCKvqu70te6wjg==", + "dev": true + }, "espree": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/espree/-/espree-4.1.0.tgz", @@ -2181,15 +2356,55 @@ "dev": true }, "table": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/table/-/table-5.2.1.tgz", - "integrity": "sha512-qmhNs2GEHNqY5fd2Mo+8N1r2sw/rvTAAvBZTaTx+Y7PHLypqyrxr1MdIu0pLw6Xvl/Gi4ONu/sdceP8vvUjkyA==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/table/-/table-5.3.3.tgz", + "integrity": "sha512-3wUNCgdWX6PNpOe3amTTPWPuF6VGvgzjKCaO1snFj0z7Y3mUPWf5+zDtxUVGispJkDECPmR29wbzh6bVMOHbcw==", "dev": true, "requires": { - "ajv": "^6.6.1", + "ajv": "^6.9.1", "lodash": "^4.17.11", - "slice-ansi": "2.0.0", - "string-width": "^2.1.1" + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "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" + } + }, + "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 + }, + "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" + } + } } }, "text-table": { diff --git a/transformation/package.json b/transformation/package.json index 340e5bc84..99498ac3e 100644 --- a/transformation/package.json +++ b/transformation/package.json @@ -22,8 +22,12 @@ "keycloak-connect": "^5.0.0" }, "devDependencies": { - "eslint": "^5.12.0", - "standard": "^12.0.1", + "eslint": "^5.16.0", + "eslint-config-standard": "^12.0.0", + "eslint-plugin-import": "^2.17.2", + "eslint-plugin-node": "^9.0.1", + "eslint-plugin-promise": "^4.1.1", + "eslint-plugin-standard": "^4.0.0", "vm2": "^3.6.6" } } diff --git a/transformation/src/sandbox.js b/transformation/src/sandbox.js index 1d1936298..e9c4ea943 100644 --- a/transformation/src/sandbox.js +++ b/transformation/src/sandbox.js @@ -1,6 +1,7 @@ // @ts-check -const { VM } = require('vm2') +import { VM } from 'vm2' + const vm = new VM({ timeout: 5000 }) @@ -11,7 +12,7 @@ function assertIsObjectOrArray (data) { } } -exports.execute = function (func, data) { +export function execute (func, data) { assertIsObjectOrArray(data) let wrapper = diff --git a/ui/.eslintrc b/ui/.eslintrc new file mode 100644 index 000000000..2e0375815 --- /dev/null +++ b/ui/.eslintrc @@ -0,0 +1,32 @@ +{ + "env": { + "browser": true, + "es6": true + }, + + "extends": [ + "standard", + "plugin:@typescript-eslint/recommended", + "plugin:vue/recommended", + "@vue/typescript" + ], + "globals": { + "Atomics": "readonly", + "SharedArrayBuffer": "readonly" + }, + "parser": "vue-eslint-parser", + "parserOptions": { + "parser": "@typescript-eslint/parser", + "ecmaVersion": 2018, + "sourceType": "module" + }, + "plugins": [ + "vue", + "@typescript-eslint" + ], + "rules": { + "@typescript-eslint/indent": [2, 2], + "max-len": [2, 120, 4, { "ignoreUrls": true }], + "@typescript-eslint/explicit-function-return-type": [1, {"allowExpressions": true}] + } +} diff --git a/.gitignore b/ui/.gitignore similarity index 100% rename from .gitignore rename to ui/.gitignore diff --git a/ui/package-lock.json b/ui/package-lock.json index 650562daf..69cec7078 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -919,6 +919,70 @@ "integrity": "sha512-rzi6fw7hhxPcCoNVsgysHFlKnhYYvVj7AJwdAO0HQNP5vg9sY0DoRRC1pfuCQm94cOa1sab82HGUtdFlWHIhBg==", "dev": true }, + "@typescript-eslint/eslint-plugin": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.8.0.tgz", + "integrity": "sha512-wypT9PZUDKxCc2wVMqifo5unmtHqOPuBdcvuY03fPWQfHLqWEl49JCbGzRRXovRROONxMqbaiJPo+biL7QoDwQ==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "1.8.0", + "@typescript-eslint/parser": "1.8.0", + "eslint-utils": "^1.3.1", + "regexpp": "^2.0.1", + "requireindex": "^1.2.0", + "tsutils": "^3.7.0" + }, + "dependencies": { + "tsutils": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.10.0.tgz", + "integrity": "sha512-q20XSMq7jutbGB8luhKKsQldRKWvyBO2BGqni3p4yq8Ys9bEP/xQw3KepKmMRt9gJ4lvQSScrihJrcKdKoSU7Q==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + } + } + }, + "@typescript-eslint/experimental-utils": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-1.8.0.tgz", + "integrity": "sha512-j+uDLmB/OC8Siir8bJk7PzGxkDn04MVLC+hRMADrK5JnKRXxiE2nSR2E6jk4XP36y/Hba2uma+CRGfs6n+Kwaw==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "1.8.0" + } + }, + "@typescript-eslint/parser": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-1.8.0.tgz", + "integrity": "sha512-3SK++gL2ndV/X7jlceiaRfHww7/JVguxFKMSF7k8iNXflR+oSucfRacReXuwVcNy09aepgDD/MCMJo/7Eh/GVg==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "1.8.0", + "@typescript-eslint/typescript-estree": "1.8.0", + "eslint-scope": "^4.0.0", + "eslint-visitor-keys": "^1.0.0" + } + }, + "@typescript-eslint/typescript-estree": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-1.8.0.tgz", + "integrity": "sha512-3ZeE79z+L8W/zsuta8vStI8W0d5j5BYiFc5sH8zerIl61hlwU3HJZIQTAnzX9r7kqf0QvIk5ak5iacttmci/mg==", + "dev": true, + "requires": { + "lodash.unescape": "4.0.1", + "semver": "5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + } + } + }, "@vue/babel-helper-vue-jsx-merge-props": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.0.0-beta.2.tgz", @@ -1177,6 +1241,16 @@ } } }, + "@vue/eslint-config-typescript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-4.0.0.tgz", + "integrity": "sha512-uSMAMgw4xDgVdZQhpbtJRo8nMV4oOy3Ht8olfOo7xvYFYLMF2JZ1tDRKd9/NSusxA72O2Vma+HzmyzDHg9evcQ==", + "dev": true, + "requires": { + "@typescript-eslint/eslint-plugin": "^1.1.0", + "@typescript-eslint/parser": "^1.1.0" + } + }, "@vue/preload-webpack-plugin": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.0.tgz", @@ -1398,6 +1472,12 @@ "acorn": "^5.0.0" } }, + "acorn-jsx": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", + "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", + "dev": true + }, "acorn-walk": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz", @@ -1446,6 +1526,12 @@ "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", "dev": true }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, "ansi-html": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", @@ -1539,6 +1625,16 @@ "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", "dev": true }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" + } + }, "array-map": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", @@ -1630,6 +1726,12 @@ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, "async": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", @@ -2273,6 +2375,12 @@ "supports-color": "^5.3.0" } }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, "check-types": { "version": "7.4.0", "resolved": "https://registry.npmjs.org/check-types/-/check-types-7.4.0.tgz", @@ -2396,6 +2504,12 @@ "string-width": "^2.1.1" } }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, "clipboardy": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-1.2.3.tgz", @@ -2657,6 +2771,12 @@ "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", "dev": true }, + "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.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", @@ -3294,6 +3414,12 @@ "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", "dev": true }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, "deepmerge": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", @@ -3514,6 +3640,15 @@ "buffer-indexof": "^1.0.0" } }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, "dom-converter": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", @@ -3648,6 +3783,12 @@ "minimalistic-crypto-utils": "^1.0.0" } }, + "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 + }, "emojis-list": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", @@ -3750,6 +3891,326 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, + "eslint": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", + "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.9.1", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^4.0.3", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^5.0.1", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.7.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^6.2.2", + "js-yaml": "^3.13.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.11", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^5.5.1", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0" + }, + "dependencies": { + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "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" + } + }, + "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" + } + }, + "import-fresh": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz", + "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "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 + } + } + }, + "eslint-config-standard": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz", + "integrity": "sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ==", + "dev": true + }, + "eslint-import-resolver-node": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", + "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.5.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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-module-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.0.tgz", + "integrity": "sha512-14tltLm38Eu3zS+mt0KvILC3q8jyIAH518MlG+HO0p+yK885Lb1UHTY/UgR91eOyGdmxAPb+OLoW4znqIT6Ndw==", + "dev": true, + "requires": { + "debug": "^2.6.8", + "pkg-dir": "^2.0.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" + } + }, + "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 + }, + "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 + }, + "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" + } + } + } + }, + "eslint-plugin-es": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-1.4.0.tgz", + "integrity": "sha512-XfFmgFdIUDgvaRAlaXUkxrRg5JSADoRC8IkKLc/cISeR3yHVMefFHQZpcyXXEUUPHfy5DwviBcrfqlyqEwlQVw==", + "dev": true, + "requires": { + "eslint-utils": "^1.3.0", + "regexpp": "^2.0.1" + } + }, + "eslint-plugin-import": { + "version": "2.17.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.17.2.tgz", + "integrity": "sha512-m+cSVxM7oLsIpmwNn2WXTJoReOF9f/CtLMo7qOVmKd1KntBy0hEcuNZ3erTmWjx+DxRO0Zcrm5KwAvI9wHcV5g==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.2", + "eslint-module-utils": "^2.4.0", + "has": "^1.0.3", + "lodash": "^4.17.11", + "minimatch": "^3.0.4", + "read-pkg-up": "^2.0.0", + "resolve": "^1.10.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" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-plugin-node": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-9.0.1.tgz", + "integrity": "sha512-fljT5Uyy3lkJzuqhxrYanLSsvaILs9I7CmQ31atTtZ0DoIzRbbvInBh4cQ1CrthFHInHYBQxfPmPt6KLHXNXdw==", + "dev": true, + "requires": { + "eslint-plugin-es": "^1.4.0", + "eslint-utils": "^1.3.1", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.0.0" + }, + "dependencies": { + "ignore": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.1.tgz", + "integrity": "sha512-DWjnQIFLenVrwyRCKZT+7a7/U4Cqgar4WG8V++K3hw+lrW1hc/SIwdiGmtxKCVACmHULTuGeBbHJmbwW7/sAvA==", + "dev": true + }, + "resolve": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.1.tgz", + "integrity": "sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "semver": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", + "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==", + "dev": true + } + } + }, + "eslint-plugin-promise": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.1.1.tgz", + "integrity": "sha512-faAHw7uzlNPy7b45J1guyjazw28M+7gJokKUjC5JSFoYfUEyy6Gw/i7YQvmv2Yk00sUjWcmzXQLpU1Ki/C2IZQ==", + "dev": true + }, + "eslint-plugin-standard": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.0.tgz", + "integrity": "sha512-OwxJkR6TQiYMmt1EsNRMe5qG3GsbjlcOhbGUBY4LtavF9DsLaTcoR+j2Tdjqi23oUwKNUqX7qcn5fPStafMdlA==", + "dev": true + }, + "eslint-plugin-vue": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-5.2.2.tgz", + "integrity": "sha512-CtGWH7IB0DA6BZOwcV9w9q3Ri6Yuo8qMjx05SmOGJ6X6E0Yo3y9E/gQ5tuNxg2dEt30tRnBoFTbvtmW9iEoyHA==", + "dev": true, + "requires": { + "vue-eslint-parser": "^5.0.0" + } + }, "eslint-scope": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", @@ -3760,12 +4221,52 @@ "estraverse": "^4.1.1" } }, + "eslint-utils": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz", + "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==", + "dev": true + }, + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "dev": true + }, + "espree": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", + "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", + "dev": true, + "requires": { + "acorn": "^6.0.7", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" + }, + "dependencies": { + "acorn": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", + "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "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 }, + "esquery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "dev": true, + "requires": { + "estraverse": "^4.0.0" + } + }, "esrecurse": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", @@ -3977,6 +4478,28 @@ } } }, + "external-editor": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", + "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", + "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" + } + } + } + }, "extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", @@ -4074,6 +4597,12 @@ "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", "dev": true }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, "fastparse": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", @@ -4095,6 +4624,24 @@ "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", "dev": true }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, "file-loader": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-3.0.1.tgz", @@ -4199,6 +4746,23 @@ "locate-path": "^3.0.0" } }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + } + }, + "flatted": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz", + "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==", + "dev": true + }, "flush-write-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.0.tgz", @@ -4899,6 +5463,12 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", @@ -5557,6 +6127,44 @@ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, + "inquirer": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.3.1.tgz", + "integrity": "sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA==", + "dev": true, + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.11", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "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" + } + } + } + }, "internal-ip": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-3.0.1.tgz", @@ -5813,6 +6421,12 @@ "isobject": "^3.0.1" } }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, "is-regex": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", @@ -5987,6 +6601,12 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -6080,6 +6700,45 @@ "invert-kv": "^2.0.0" } }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "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": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, "loader-runner": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", @@ -6154,6 +6813,12 @@ "integrity": "sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A=", "dev": true }, + "lodash.unescape": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz", + "integrity": "sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=", + "dev": true + }, "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -6512,6 +7177,12 @@ "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", "dev": true }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, "nan": { "version": "2.12.1", "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", @@ -6538,6 +7209,12 @@ "to-regex": "^3.0.1" } }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, "negotiator": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", @@ -6845,6 +7522,20 @@ "is-wsl": "^1.1.0" } }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + } + }, "ora": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ora/-/ora-3.0.0.tgz", @@ -6885,6 +7576,12 @@ "mem": "^4.0.0" } }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", @@ -6959,6 +7656,23 @@ "no-case": "^2.2.0" } }, + "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" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + } + } + }, "parse-asn1": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.3.tgz", @@ -7681,6 +8395,12 @@ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true }, + "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 + }, "prettier": { "version": "1.16.3", "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.16.3.tgz", @@ -7715,6 +8435,12 @@ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "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-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", @@ -7880,6 +8606,87 @@ "pify": "^3.0.0" } }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "dependencies": { + "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" + } + }, + "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-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "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" + } + } + } + }, "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", @@ -7957,6 +8764,12 @@ "yargs": "^12.0.5" } }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, "regexpu-core": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.4.0.tgz", @@ -8136,6 +8949,12 @@ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", "dev": true }, + "requireindex": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", + "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==", + "dev": true + }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -8219,6 +9038,15 @@ "inherits": "^2.0.1" } }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, "run-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/run-node/-/run-node-1.0.0.tgz", @@ -8234,6 +9062,15 @@ "aproba": "^1.1.1" } }, + "rxjs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", + "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -8499,6 +9336,17 @@ "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", "dev": true }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -8961,6 +9809,12 @@ "ansi-regex": "^3.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-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -8973,6 +9827,12 @@ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", "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 + }, "stylehacks": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.1.tgz", @@ -9042,6 +9902,58 @@ } } }, + "table": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/table/-/table-5.3.3.tgz", + "integrity": "sha512-3wUNCgdWX6PNpOe3amTTPWPuF6VGvgzjKCaO1snFj0z7Y3mUPWf5+zDtxUVGispJkDECPmR29wbzh6bVMOHbcw==", + "dev": true, + "requires": { + "ajv": "^6.9.1", + "lodash": "^4.17.11", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "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" + } + }, + "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 + }, + "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" + } + } + } + }, "tapable": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.1.tgz", @@ -9102,6 +10014,12 @@ } } }, + "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 + }, "thread-loader": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/thread-loader/-/thread-loader-2.1.2.tgz", @@ -9113,6 +10031,12 @@ "neo-async": "^2.6.0" } }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, "through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -9144,6 +10068,15 @@ "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" + } + }, "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", @@ -9312,6 +10245,15 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, "type-is": { "version": "1.6.16", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", @@ -9683,6 +10625,39 @@ "resolved": "https://registry.npmjs.org/vue-class-component/-/vue-class-component-6.3.2.tgz", "integrity": "sha512-cH208IoM+jgZyEf/g7mnFyofwPDJTM/QvBNhYMjqGB8fCsRyTf68rH2ISw/G20tJv+5mIThQ3upKwoL4jLTr1A==" }, + "vue-eslint-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-5.0.0.tgz", + "integrity": "sha512-JlHVZwBBTNVvzmifwjpZYn0oPWH2SgWv5dojlZBsrhablDu95VFD+hriB1rQGwbD+bms6g+rAFhQHk6+NyiS6g==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "eslint-scope": "^4.0.0", + "eslint-visitor-keys": "^1.0.0", + "espree": "^4.1.0", + "esquery": "^1.0.1", + "lodash": "^4.17.11" + }, + "dependencies": { + "acorn": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", + "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "dev": true + }, + "espree": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-4.1.0.tgz", + "integrity": "sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w==", + "dev": true, + "requires": { + "acorn": "^6.0.2", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" + } + } + } + }, "vue-hot-reload-api": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.1.tgz", @@ -10052,6 +11027,12 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, "worker-farm": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", @@ -10114,6 +11095,15 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, "ws": { "version": "6.1.3", "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.3.tgz", diff --git a/ui/package.json b/ui/package.json index 7739530cd..8422c30b9 100644 --- a/ui/package.json +++ b/ui/package.json @@ -12,12 +12,7 @@ "scripts": { "serve": "vue-cli-service serve", "build": "vue-cli-service build", - "lint": "vue-cli-service lint" - }, - "husky": { - "hooks": { - "pre-commit": "vue-cli-service lint" - } + "lint": "./node_modules/.bin/eslint src --ext .ts,.js,.vue --fix" }, "dependencies": { "@types/node": "^11.13.5", @@ -31,10 +26,19 @@ }, "devDependencies": { "@mdi/font": "^3.4.93", + "@typescript-eslint/eslint-plugin": "^1.8.0", + "@typescript-eslint/parser": "^1.8.0", "@vue/cli-plugin-babel": "^3.4.0", "@vue/cli-plugin-typescript": "^3.4.0", "@vue/cli-service": "^3.4.0", - "husky": "^1.3.1", + "@vue/eslint-config-typescript": "^4.0.0", + "eslint": "^5.16.0", + "eslint-config-standard": "^12.0.0", + "eslint-plugin-import": "^2.17.2", + "eslint-plugin-node": "^9.0.1", + "eslint-plugin-promise": "^4.1.1", + "eslint-plugin-standard": "^4.0.0", + "eslint-plugin-vue": "^5.2.2", "typescript": "^3.3.1", "vue-template-compiler": "^2.6.3", "vuex-module-decorators": "^0.9.8" diff --git a/ui/src/App.vue b/ui/src/App.vue index e76b47460..5c3ea2f06 100644 --- a/ui/src/App.vue +++ b/ui/src/App.vue @@ -1,13 +1,25 @@ diff --git a/ui/src/components/Login.vue b/ui/src/components/Login.vue index a337f5c57..825676fa1 100644 --- a/ui/src/components/Login.vue +++ b/ui/src/components/Login.vue @@ -1,27 +1,51 @@ diff --git a/ui/src/components/auth/module.ts b/ui/src/components/auth/module.ts index afcc9749a..df25ad5b5 100644 --- a/ui/src/components/auth/module.ts +++ b/ui/src/components/auth/module.ts @@ -1,72 +1,73 @@ -import { Module, VuexModule, Mutation, Action } from 'vuex-module-decorators'; +import { Module, VuexModule, Mutation, Action } from 'vuex-module-decorators' import { keycloakLogin, loadKeycloakUserProfile, isAuthenticated, keycloakInit, - keycloakEditProfile, -} from '@/keycloak'; -import { KeycloakProfile } from 'keycloak-js'; + keycloakEditProfile +} from '@/keycloak' +// eslint-disable-next-line no-unused-vars +import { KeycloakProfile } from 'keycloak-js' -const AUTH_URL: string = process.env.VUE_APP_AUTH_SERVER_URL; +const AUTH_URL: string = process.env.VUE_APP_AUTH_SERVER_URL as string @Module({ namespaced: true }) export default class AuthModule extends VuexModule { - private isAuth: boolean = false; - private userProfile: KeycloakProfile = {}; + private isAuth: boolean = false + private userProfile: KeycloakProfile = {} @Action({ commit: 'setAuth' }) - public async initKeycloak() { - await keycloakInit(AUTH_URL); - const isAuth = isAuthenticated(); + public async initKeycloak (): Promise { + await keycloakInit(AUTH_URL) + const isAuth = isAuthenticated() if (isAuth) { - this.context.dispatch('loadUserProfile'); + this.context.dispatch('loadUserProfile') } - return isAuth; + return isAuth } @Action({ commit: 'setAuth' }) - public async login() { - const isSuccessful: boolean = await keycloakLogin(); + public async login (): Promise { + const isSuccessful: boolean = await keycloakLogin() if (isSuccessful) { - this.context.dispatch('loadUserProfile'); + this.context.dispatch('loadUserProfile') } - return isSuccessful; + return isSuccessful } @Action({ commit: 'setAuth' }) - public logout() { - this.context.commit('setUserProfile', {}); - return false; + public logout (): boolean { + this.context.commit('setUserProfile', {}) + return false } @Action - public async editProfile() { - await keycloakEditProfile(); + public async editProfile (): Promise { + return keycloakEditProfile() } @Action({ commit: 'setUserProfile' }) - public async loadUserProfile() { + public async loadUserProfile (): Promise { return new Promise((resolve, reject) => { loadKeycloakUserProfile() .success(profile => { - resolve(profile); + resolve(profile) }) .error(err => { - reject(err); - }); - }); + reject(err) + }) + }) } @Mutation - private setAuth(value: boolean) { - this.isAuth = value; + private setAuth (value: boolean): void { + this.isAuth = value } - @Mutation private setUserProfile(value: KeycloakProfile) { - this.userProfile = value; + @Mutation private setUserProfile (value: KeycloakProfile): void { + this.userProfile = value } } diff --git a/ui/src/keycloak.ts b/ui/src/keycloak.ts index a0797d1c0..1921b23d7 100644 --- a/ui/src/keycloak.ts +++ b/ui/src/keycloak.ts @@ -1,148 +1,154 @@ -import Keycloak, { KeycloakInitOptions, KeycloakInstance } from 'keycloak-js'; +/* eslint-disable prefer-promise-reject-errors */ +// eslint-disable-next-line no-unused-vars +import Keycloak, { KeycloakError, KeycloakInitOptions, KeycloakInstance } from 'keycloak-js' // ================================================================================================= -let keycloak: KeycloakInstance | undefined; +let keycloak: KeycloakInstance | undefined // ================================================================================================= const options: KeycloakInitOptions = { - onLoad: 'check-sso', - checkLoginIframe: false, - }; + onLoad: 'check-sso', + checkLoginIframe: false +} +export function loadKeycloakUserProfile (): Promise { + return new Promise((resolve, reject) => { + if (keycloak) { + keycloak.loadUserProfile() + .success(profile => resolve(profile)) + .error(error => reject(error)) + } else { + reject('Keycloak is not initiated!') + } + }) +} -export function keycloakInit( - keycloakURL: string, +export function keycloakInit ( + keycloakURL: string ): Promise { const constructorOptions = { url: keycloakURL, realm: 'ods-userservice', - clientId: 'ods-webclient', - }; + clientId: 'ods-webclient' + } return new Promise((resolve, reject) => { - const keycloakAuth = (keycloak = Keycloak(constructorOptions)); - function init() { + const keycloakAuth = (keycloak = Keycloak(constructorOptions)) + function init (): void { keycloakAuth .init(options) .success(authenticated => { - console.log('Keycloak initialization successful:', authenticated); - resolve(keycloakAuth); + console.log('Keycloak initialization successful:', authenticated) + resolve(keycloakAuth) + }) + .error((errorData: KeycloakError) => { + console.error('Error during Keycloak initialization:', errorData) + reject(errorData) }) - .error((errorData: any) => { - console.error('Error during Keycloak initialization:', errorData); - reject(errorData); - }); } keycloakAuth.onAuthSuccess = () => { - console.log('onAuthSuccess', arguments); - loadKeycloakUserProfile(); - }; - keycloakAuth.onAuthError = () => console.log('onAuthError', arguments); - keycloakAuth.onAuthLogout = () => console.log('onAuthLogout', arguments); + console.log('onAuthSuccess', arguments) + loadKeycloakUserProfile() + } + keycloakAuth.onAuthError = () => console.log('onAuthError', arguments) + keycloakAuth.onAuthLogout = () => console.log('onAuthLogout', arguments) keycloakAuth.onAuthRefreshSuccess = () => - console.log('onAuthRefreshSuccess', arguments); + console.log('onAuthRefreshSuccess', arguments) keycloakAuth.onAuthRefreshError = () => { - console.log('onAuthRefreshError', arguments); - init(); - }; - init(); - }); + console.log('onAuthRefreshError', arguments) + init() + } + init() + }) } -export function keycloakLogin(): Promise { +export function keycloakLogin (): Promise { return new Promise((resolve, reject) => { if (keycloak) { - const keycloakAuth = keycloak; + const keycloakAuth = keycloak keycloakAuth .login() .success(() => { - console.log('login successful'); - resolve(true); + console.log('login successful') + resolve(true) }) .error(() => { - console.error('login failed'); - reject(false); - }); + console.error('login failed') + reject(false) + }) } else { - console.error('login failed: keycloak undefined'); - reject(false); + console.error('login failed: keycloak undefined') + reject(false) } - }); + }) } -export function keycloakEditProfile(): Promise { +export function keycloakEditProfile (): Promise { return new Promise((resolve, reject) => { if (keycloak) { - const keycloakAuth = keycloak; + const keycloakAuth = keycloak keycloakAuth .accountManagement() .success(() => { - console.log('edit profile successful'); - resolve(true); + console.log('edit profile successful') + resolve(true) }) .error(() => { - console.error('edit profile failed'); - reject(false); - }); + console.error('edit profile failed') + reject(false) + }) } else { - console.error('edit profile failed: keycloak undefined'); - reject(false); + console.error('edit profile failed: keycloak undefined') + reject(false) } - }); + }) } -export function editKeycloakUserProfile(): Promise { +export function editKeycloakUserProfile (): Promise { return new Promise((resolve, reject) => { if (keycloak) { - const keycloakAuth = keycloak; + const keycloakAuth = keycloak keycloakAuth .accountManagement() .success(() => { - console.log('edit profile redirect successful'); - resolve(true); + console.log('edit profile redirect successful') + resolve(true) }) .error(() => { - console.error('edit profile failed'); - reject(false); - }); + console.error('edit profile failed') + reject(false) + }) } else { - console.error('edit profile error: keycloak undefined'); - reject(false); + console.error('edit profile error: keycloak undefined') + reject(false) } - }); + }) } -export function useBearer(): Promise { +export function useBearer (): Promise { return new Promise((resolve, reject) => { if (keycloak && keycloak.token) { - const keycloakAuth = keycloak; + const keycloakAuth = keycloak keycloakAuth .updateToken(5) .success(() => { - resolve(keycloakAuth.token); + resolve(keycloakAuth.token) }) .error(() => { - reject('Failed to refresh token'); - }); + reject('Failed to refresh token') + }) } else { - reject('Not logged in'); + reject('Not logged in') } - }); + }) } -export function isAuthenticated(): boolean { - if (keycloak === undefined || keycloak!.authenticated === undefined) { - return false; +export function isAuthenticated (): boolean { + if (!keycloak || keycloak.authenticated === undefined) { + return false } - return keycloak.authenticated; -} - -export function loadKeycloakUserProfile(): Keycloak.KeycloakPromise< - Keycloak.KeycloakProfile, - void -> { - return keycloak!.loadUserProfile(); + return keycloak.authenticated } diff --git a/ui/src/main.ts b/ui/src/main.ts index 9ddc44a64..134447ad8 100644 --- a/ui/src/main.ts +++ b/ui/src/main.ts @@ -1,30 +1,30 @@ -import Vue from 'vue'; -import Vuex from 'vuex'; -import App from './App.vue'; -import router from './router'; -import Vuetify from 'vuetify'; -import 'vuetify/dist/vuetify.min.css'; -import '@mdi/font/css/materialdesignicons.css'; -import TransformationModule from '@/transformation/module'; -import AuthModule from '@/components/auth/module'; +import Vue from 'vue' +import Vuex from 'vuex' +import App from './App.vue' +import router from './router' +import Vuetify from 'vuetify' +import 'vuetify/dist/vuetify.min.css' +import '@mdi/font/css/materialdesignicons.css' +import TransformationModule from '@/transformation/module' +import AuthModule from '@/components/auth/module' Vue.use(Vuetify, { - iconfont: 'mdi', -}); + iconfont: 'mdi' +}) -Vue.use(Vuex); +Vue.use(Vuex) -Vue.config.productionTip = false; +Vue.config.productionTip = false export const store = new Vuex.Store({ modules: { auth: AuthModule, - transformation: TransformationModule, - }, -}); + transformation: TransformationModule + } +}) new Vue({ router, store, - render: h => h(App), -}).$mount('#app'); + render: h => h(App) +}).$mount('#app') diff --git a/ui/src/router.ts b/ui/src/router.ts index 351d616ea..8f91ff9da 100644 --- a/ui/src/router.ts +++ b/ui/src/router.ts @@ -1,17 +1,17 @@ -import Vue from 'vue'; -import Router from 'vue-router'; -import Home from './views/Home.vue'; -import transformationRoutes from '@/transformation/router'; -import { isAuthenticated, keycloakLogin, keycloakInit } from './keycloak'; +import Vue from 'vue' +import Router from 'vue-router' +import Home from './views/Home.vue' +import transformationRoutes from '@/transformation/router' +import { isAuthenticated, keycloakLogin } from './keycloak' -Vue.use(Router); +Vue.use(Router) const baseRoutes = [ { path: '/', name: 'home', component: Home, - meta: { title: 'Dashboard' }, + meta: { title: 'Dashboard' } }, { path: '/about', @@ -21,23 +21,23 @@ const baseRoutes = [ // this generates a separate chunk (about.[hash].js) for this route // which is lazy-loaded when the route is visited. component: () => - import(/* webpackChunkName: "about" */ './views/About.vue'), - }, -]; + import(/* webpackChunkName: "about" */ './views/About.vue') + } +] -const routes = baseRoutes.concat(transformationRoutes); +const routes = baseRoutes.concat(transformationRoutes) const router = new Router({ mode: 'history', base: process.env.BASE_URL, - routes, -}); + routes +}) router.beforeEach((to, from, next) => { if (to.meta.requiresAuth && !isAuthenticated()) { - keycloakLogin(); + keycloakLogin() } - next(); -}); + next() +}) -export default router; +export default router diff --git a/ui/src/shims-tsx.d.ts b/ui/src/shims-tsx.d.ts index 3b88b5829..6849e8d0b 100644 --- a/ui/src/shims-tsx.d.ts +++ b/ui/src/shims-tsx.d.ts @@ -1,12 +1,14 @@ -import Vue, { VNode } from 'vue'; +// eslint-disable-next-line @typescript-eslint/no-unused-vars +import Vue, { VNode } from 'vue' declare global { namespace JSX { - // tslint:disable no-empty-interface + // eslint-disable-next-line @typescript-eslint/no-empty-interface interface Element extends VNode {} - // tslint:disable no-empty-interface + // eslint-disable-next-line @typescript-eslint/no-empty-interface interface ElementClass extends Vue {} interface IntrinsicElements { + // eslint-disable-next-line @typescript-eslint/no-explicit-any [elem: string]: any; } } diff --git a/ui/src/shims-vue.d.ts b/ui/src/shims-vue.d.ts index 8f6f41026..d9f24faa4 100644 --- a/ui/src/shims-vue.d.ts +++ b/ui/src/shims-vue.d.ts @@ -1,4 +1,4 @@ declare module '*.vue' { - import Vue from 'vue'; - export default Vue; + import Vue from 'vue' + export default Vue } diff --git a/ui/src/transformation/TransformationMain.vue b/ui/src/transformation/TransformationMain.vue index 47de1a90d..fae455cfd 100644 --- a/ui/src/transformation/TransformationMain.vue +++ b/ui/src/transformation/TransformationMain.vue @@ -3,34 +3,43 @@

transformation service

- + - submit -

{{transformationResult}}

+ + submit + +

{{ transformationResult }}

- \ No newline at end of file + diff --git a/ui/src/transformation/module.ts b/ui/src/transformation/module.ts index 82b13ed63..a4281fb39 100644 --- a/ui/src/transformation/module.ts +++ b/ui/src/transformation/module.ts @@ -1,16 +1,18 @@ -import { Module, VuexModule, Mutation, Action } from 'vuex-module-decorators'; -import * as TransformationRestService from './transformationRest'; +import { Module, VuexModule, Mutation, Action } from 'vuex-module-decorators' +import * as TransformationRestService from './transformationRest' @Module({ namespaced: true }) export default class TransformationModule extends VuexModule { - private transformationResult: object = {}; + private transformationResult: object = {} @Action({ commit: 'setTransformationResult' }) - public async transformData(inputFunc: string) { - return await TransformationRestService.transformData(inputFunc); + // TODO: remove if possible + // eslint-disable-next-line @typescript-eslint/no-explicit-any + public async transformData (inputFunc: string): Promise { + return TransformationRestService.transformData(inputFunc) } - @Mutation private setTransformationResult(value: object) { - this.transformationResult = value; + @Mutation private setTransformationResult (value: object): void { + this.transformationResult = value } } diff --git a/ui/src/transformation/router.ts b/ui/src/transformation/router.ts index 985eab52e..5e3cff32a 100644 --- a/ui/src/transformation/router.ts +++ b/ui/src/transformation/router.ts @@ -1,10 +1,10 @@ -import TransformationMain from './TransformationMain.vue'; +import TransformationMain from './TransformationMain.vue' export default [ { path: '/transformation', name: 'transformation', component: TransformationMain, - meta: { title: 'Transformation Service', requiresAuth: true }, - }, -]; + meta: { title: 'Transformation Service', requiresAuth: true } + } +] diff --git a/ui/src/transformation/transformationRest.ts b/ui/src/transformation/transformationRest.ts index 271c9b1a3..a9db54591 100644 --- a/ui/src/transformation/transformationRest.ts +++ b/ui/src/transformation/transformationRest.ts @@ -1,25 +1,28 @@ -import { useBearer } from '@/keycloak'; +import { useBearer } from '@/keycloak' -export async function transformData(inputFunc: string): Promise { - console.log(process.env.VUE_APP_TRANSFORMATION_SERVICE_URL); +const TRANSFORMATION_URL = process.env.VUE_APP_TRANSFORMATION_SERVICE_URL as string + +// TODO: remove if possible +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export async function transformData (inputFunc: string): Promise { + console.log(process.env.VUE_APP_TRANSFORMATION_SERVICE_URL) const token = await useBearer().catch(error => { - console.error('Unable to get keycloak token. Error: ' + error); - }); + console.error('Unable to get keycloak token. Error: ' + error) + }) if (token === undefined) { - return; + return } - return fetch(process.env.VUE_APP_TRANSFORMATION_SERVICE_URL, { + return fetch(TRANSFORMATION_URL, { method: 'POST', mode: 'cors', body: inputFunc, headers: { 'Content-Type': 'application/json', - 'Authorization': 'Bearer ' + token, - }, + Authorization: 'Bearer ' + token + } }).then(response => { - return response.json(); - }); + return response.json() + }) } - diff --git a/ui/src/views/Home.vue b/ui/src/views/Home.vue index a263a80ff..885631fea 100644 --- a/ui/src/views/Home.vue +++ b/ui/src/views/Home.vue @@ -5,8 +5,8 @@ diff --git a/ui/src/pipeline/module.ts b/ui/src/pipeline/module.ts new file mode 100644 index 000000000..b76534464 --- /dev/null +++ b/ui/src/pipeline/module.ts @@ -0,0 +1,47 @@ +import { Module, VuexModule, Mutation, Action } from 'vuex-module-decorators' +import Pipeline from './pipeline' +import * as RestService from './pipelineRest' + +@Module({ namespaced: true }) +export default class PipelineModule extends VuexModule { + private pipelines: Pipeline[] = [] + + private isLoadingPipelines: boolean = true + + @Mutation + public setPipelines (pipelines: Pipeline[]): void { + this.pipelines = pipelines + this.isLoadingPipelines = false + } + + @Mutation + public setIsLoadingPipelines (value: boolean): void { + this.isLoadingPipelines = value + } + + @Action({ commit: 'setPipelines' }) + public async loadPipelines (): Promise { + this.context.commit('setIsLoadingPipelines', true) + + return RestService.getAllPipelines() + } + + @Action({ commit: 'setPipelines' }) + public async createPipeline (pipeline: Pipeline): Promise { + await RestService.createPipeline(pipeline) + return RestService.getAllPipelines() + } + + @Action({ commit: 'setPipelines' }) + public async updatePipeline (pipeline: Pipeline): Promise { + await RestService.updatePipeline(pipeline) + return RestService.getAllPipelines() + } + + @Action({ commit: 'setPipelines' }) + public async deletePipeline (pipelineId: string): Promise { + await RestService.deletePipeline(pipelineId) + return RestService.getAllPipelines() + } + +} diff --git a/ui/src/pipeline/pipeline.ts b/ui/src/pipeline/pipeline.ts new file mode 100644 index 000000000..5430a1422 --- /dev/null +++ b/ui/src/pipeline/pipeline.ts @@ -0,0 +1,8 @@ +export default interface Pipeline { + id: string; + adapter: object; + metadata: object; + transformations: object[]; + trigger: object; + persistence?: object; +} diff --git a/ui/src/pipeline/pipelineRest.ts b/ui/src/pipeline/pipelineRest.ts new file mode 100644 index 000000000..23b44f512 --- /dev/null +++ b/ui/src/pipeline/pipelineRest.ts @@ -0,0 +1,37 @@ +import Pipeline from './pipeline' + +const CORE_SERVICE_URL = process.env.VUE_APP_CORE_SERVICE_URL as string +export async function getAllPipelines (): Promise { + const response = await fetch(`${CORE_SERVICE_URL}/pipelines`) + const data = await response.json() + return data +} + +export async function createPipeline (pipeline: Pipeline): Promise { + const options = { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(pipeline) } + + const response = await fetch(`${CORE_SERVICE_URL}/pipelines`, options) + const data = await response.json() + return data +} + +export async function updatePipeline (pipeline: Pipeline): Promise { + const options = { + method: 'PUT', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(pipeline) } + + return fetch(`${CORE_SERVICE_URL}/pipelines/${pipeline.id}`, options) +} + +export async function deletePipeline (pipelineId: string): Promise { + const options = { method: 'DELETE' } + return fetch(`${CORE_SERVICE_URL}/pipelines/${pipelineId}`, options) +} diff --git a/ui/src/pipeline/router.ts b/ui/src/pipeline/router.ts new file mode 100644 index 000000000..c45b4cca1 --- /dev/null +++ b/ui/src/pipeline/router.ts @@ -0,0 +1,10 @@ +import PipelineOverview from './PipelineOverview.vue' + +export default [ + { + path: '/pipeline', + name: 'pipeline-overview', + component: PipelineOverview, + meta: { title: 'Pipeline Overview', requiresAuth: true } + } +] diff --git a/ui/src/router.ts b/ui/src/router.ts index 8f91ff9da..b53c7c62a 100644 --- a/ui/src/router.ts +++ b/ui/src/router.ts @@ -1,12 +1,14 @@ import Vue from 'vue' import Router from 'vue-router' -import Home from './views/Home.vue' +import Home from '@/views/Home.vue' import transformationRoutes from '@/transformation/router' +import storageRoutes from '@/storage/router' +import pipelineRoutes from '@/pipeline/router' import { isAuthenticated, keycloakLogin } from './keycloak' Vue.use(Router) -const baseRoutes = [ +let routes = [ { path: '/', name: 'home', @@ -25,11 +27,13 @@ const baseRoutes = [ } ] -const routes = baseRoutes.concat(transformationRoutes) +routes = routes.concat(transformationRoutes) +routes = routes.concat(pipelineRoutes) +routes = routes.concat(storageRoutes) const router = new Router({ mode: 'history', - base: process.env.BASE_URL, + base: process.env.VUE_APP_BASE_URL, routes }) diff --git a/ui/src/storage/PipelineStorageOverview.vue b/ui/src/storage/PipelineStorageOverview.vue new file mode 100644 index 000000000..6419da4e7 --- /dev/null +++ b/ui/src/storage/PipelineStorageOverview.vue @@ -0,0 +1,141 @@ + + + diff --git a/ui/src/storage/module.ts b/ui/src/storage/module.ts new file mode 100644 index 000000000..4eb0e64f6 --- /dev/null +++ b/ui/src/storage/module.ts @@ -0,0 +1,21 @@ +import { Module, VuexModule, Mutation, Action } from 'vuex-module-decorators' +import * as StorageRestService from './storageRest' +import { StorageItem } from '@/storage/storage-item'; + +@Module({ namespaced: true }) +export default class StorageModule extends VuexModule { + private data: StorageItem[] = [] + + @Action({ commit: 'setData' }) + public async fetchData (storageId: string): Promise { + try { + return await StorageRestService.getData(storageId) + } catch (e) { + return Promise.resolve([]) + } + } + + @Mutation private setData (data: StorageItem[]): void { + this.data = data.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()) + } +} diff --git a/ui/src/storage/router.ts b/ui/src/storage/router.ts new file mode 100644 index 000000000..4b1dcc626 --- /dev/null +++ b/ui/src/storage/router.ts @@ -0,0 +1,10 @@ +import PipelineStorageOverview from './PipelineStorageOverview.vue' + +export default [ + { + path: '/storage/:storageId', + name: 'pipeline-storage-overview', + component: PipelineStorageOverview, + meta: { title: 'Storage Service', requiresAuth: true } + } +] diff --git a/ui/src/storage/storage-item.ts b/ui/src/storage/storage-item.ts new file mode 100644 index 000000000..c6733433f --- /dev/null +++ b/ui/src/storage/storage-item.ts @@ -0,0 +1,8 @@ +export interface StorageItem { + id: number, + data: object, + timestamp: string, + origin: string, + license: string, + pipelineId: string +} \ No newline at end of file diff --git a/ui/src/storage/storageRest.ts b/ui/src/storage/storageRest.ts new file mode 100644 index 000000000..6c8da1f2c --- /dev/null +++ b/ui/src/storage/storageRest.ts @@ -0,0 +1,28 @@ +import {StorageItem} from '@/storage/storage-item' + +const STORAGE_SERVICE_URL = process.env.VUE_APP_STORAGE_SERVICE_URL as string + +export async function getData (storageId: string): Promise { + const requestUrl = getUrl(storageId) + return fetch(requestUrl, { + method: 'GET', + mode: 'cors', + headers: { + 'Content-Type': 'application/json' + } + }).then(response => { + return response.json() + }) +} + +export function getUrl(storageId: string): string { + return `${STORAGE_SERVICE_URL}/${storageId}` +} + +export function getItemUrl(storageId: string, itemId: string): string { + return `${getUrl(storageId)}?id=eq.${itemId}` +} + +export function getLatestItemUrl(storageId: string): string { + return `${getUrl(storageId)}?order=id.desc&limit=1` +} From b4a5ad68cc6be3d33f51e83fbade9a59a487898a Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Tue, 16 Jul 2019 08:27:40 +0000 Subject: [PATCH 0037/1168] Create example pegelonline pipeline --- doc/example-requests/core.http | 4 +- .../mirror-and-cuxhaven-via-internal.http | 54 +++++++++++++++++++ .../pegelonline/station-constanz.http | 27 ++++++++++ 3 files changed, 82 insertions(+), 3 deletions(-) create mode 100644 doc/example-requests/pegelonline/mirror-and-cuxhaven-via-internal.http create mode 100644 doc/example-requests/pegelonline/station-constanz.http diff --git a/doc/example-requests/core.http b/doc/example-requests/core.http index 1273f54d3..b5ec7e388 100644 --- a/doc/example-requests/core.http +++ b/doc/example-requests/core.http @@ -3,11 +3,9 @@ ### Get all pipelines GET {{baseURL}}/pipelines HTTP/1.1 - ### Create a pipeline POST {{baseURL}}/pipelines HTTP/1.1 Content-Type: application/json - { "adapter": { "protocol": "HTTP", @@ -30,4 +28,4 @@ Content-Type: application/json "author": "icke", "license": "none" } -} \ No newline at end of file +} diff --git a/doc/example-requests/pegelonline/mirror-and-cuxhaven-via-internal.http b/doc/example-requests/pegelonline/mirror-and-cuxhaven-via-internal.http new file mode 100644 index 000000000..0ced5cfd5 --- /dev/null +++ b/doc/example-requests/pegelonline/mirror-and-cuxhaven-via-internal.http @@ -0,0 +1,54 @@ +@baseURL = http://localhost:9000 + +### Create a pipeline for PegelOnline mirror +POST {{baseURL}}/core/pipelines HTTP/1.1 +Content-Type: application/json + +{ + "adapter": { + "protocol": "HTTP", + "format": "JSON", + "location": "https://www.pegelonline.wsv.de/webservices/rest-api/v2/stations.json?includeTimeseries=true&includeCurrentMeasurement=true" + }, + "transformations": [ + { + "func": "data.forEach((x) => { var currentMeasurement = x.timeseries[0].currentMeasurement; currentMeasurement.value /= 100; currentMeasurement.unit = 'm'; x.timeseries = undefined; x.currentMeasurement = currentMeasurement;}); return data;" + } + ], + "trigger": { + "firstExecution": "2018-10-07T01:32:00.123", + "periodic": true, + "interval": 60000 + }, + "metadata": { + "author": "icke", + "license": "none" + } +} + +@pipelineId = 4d49ac4a-0fe2-4bd2-9c28-428923755fd0 +### Create a pipeline for PegelOnline mirror -> Cuxhaven +POST {{baseURL}}/core/pipelines HTTP/1.1 +Content-Type: application/json + +{ + "adapter": { + "protocol": "HTTP", + "format": "JSON", + "location": "http://storage-service:3000/{{pipelineId}}?select=data&order=id.desc&limit=1" + }, + "transformations": [ + { + "func": "var data = data[0].data; var dataCuxhaven = data.filter((x) => x.shortname.toLowerCase().includes('cuxhaven')); return dataCuxhaven;" + } + ], + "trigger": { + "firstExecution": "2018-10-07T01:32:03.123", + "periodic": true, + "interval": 60000 + }, + "metadata": { + "author": "icke", + "license": "none" + } +} \ No newline at end of file diff --git a/doc/example-requests/pegelonline/station-constanz.http b/doc/example-requests/pegelonline/station-constanz.http new file mode 100644 index 000000000..fad460927 --- /dev/null +++ b/doc/example-requests/pegelonline/station-constanz.http @@ -0,0 +1,27 @@ +@baseURL = http://localhost:9000 + +### Pegelonline data for Konstanz +POST {{baseURL}}/core/pipelines HTTP/1.1 +Content-Type: application/json + +{ + "adapter": { + "protocol": "HTTP", + "format": "JSON", + "location": "https://www.pegelonline.wsv.de/webservices/rest-api/v2/stations/Konstanz?includeTimeseries=true&includeCurrentMeasurement=true" + }, + "transformations": [ + { + "func": "result = {};result.name = data.shortname;result.timestamp = data.timeseries[0].currentMeasurement.timestamp;result.unit = \"mm\";result.pegel = data.timeseries[0].currentMeasurement.value*1000;return result;" + } + ], + "trigger": { + "firstExecution": "2018-10-15T11:12:00.123", + "periodic": false, + "interval": 60000 + }, + "metadata": { + "author": "Examplicus", + "license": "ExampleLicense" + } +} From 781a0d712343bd6836bcdda162d34b645efd0a4d Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Fri, 26 Jul 2019 07:39:10 +0000 Subject: [PATCH 0038/1168] Resolve "Refactor PipelineConfig" --- .gitlab-ci.yml | 2 +- adapter/.gitignore | 2 + core/.gitignore | 5 + .../resources/PipelineConfig.json | 26 --- core/integration-test/src/core.test.js | 13 +- .../model/DataPersistenceConfig.java | 47 ---- .../ods/coreservice/model/PipelineConfig.java | 38 +--- .../coreservice/model/PipelineMetadata.java | 31 ++- .../repository/PipelineRepository.java | 2 +- .../rest/v1/PipelinesEndpoint.java | 9 +- .../ods/coreservice/model/PipelineConfig.json | 5 +- .../coreservice/model/PipelineConfigTest.java | 19 +- ui/package-lock.json | 9 + ui/package.json | 1 + ui/src/pipeline/PipelineEdit.vue | 210 ++++++++++++++++++ ui/src/pipeline/PipelineOverview.vue | 179 +++------------ ui/src/pipeline/module.ts | 15 +- ui/src/pipeline/pipeline.ts | 12 +- ui/src/pipeline/pipelineRest.ts | 8 +- ui/src/pipeline/router.ts | 13 ++ ui/src/storage/PipelineStorageOverview.vue | 2 +- 21 files changed, 350 insertions(+), 298 deletions(-) delete mode 100644 core/integration-test/resources/PipelineConfig.json delete mode 100644 core/src/main/java/org/jvalue/ods/coreservice/model/DataPersistenceConfig.java create mode 100644 ui/src/pipeline/PipelineEdit.vue diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index dfebfb13a..5082164d9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -145,7 +145,7 @@ integrationtest-storage: - docker load -i ./storage/image/storage_liquibase.tar - docker-compose -f docker-compose.yml -f docker-compose.ci.yml build storage-service-it - docker-compose -f docker-compose.yml -f docker-compose.ci.yml up -d storage-service-db - - docker-compose -f docker-compose.yml -f docker-compose.ci.yml up -d storage-service-db-liquibase + - docker-compose -f docker-compose.yml -f docker-compose.ci.yml up storage-service-db-liquibase - docker-compose -f docker-compose.yml -f docker-compose.ci.yml up -d storage-service - docker-compose -f docker-compose.yml -f docker-compose.ci.yml up --exit-code-from storage-service-it storage-service-it after_script: diff --git a/adapter/.gitignore b/adapter/.gitignore index 9d78bb6df..5e5ef521b 100644 --- a/adapter/.gitignore +++ b/adapter/.gitignore @@ -1,3 +1,5 @@ +bin/ + # Created by https://www.gitignore.io/api/java,gradle,intellij # Edit at https://www.gitignore.io/?templates=java,gradle,intellij diff --git a/core/.gitignore b/core/.gitignore index 2c03ebe34..5e4b6e974 100644 --- a/core/.gitignore +++ b/core/.gitignore @@ -1,3 +1,8 @@ +.project +.classpath +.settings/ +bin/ + # Created by https://www.gitignore.io/api/java,gradle,intellij # Edit at https://www.gitignore.io/?templates=java,gradle,intellij diff --git a/core/integration-test/resources/PipelineConfig.json b/core/integration-test/resources/PipelineConfig.json deleted file mode 100644 index 8ee7b153f..000000000 --- a/core/integration-test/resources/PipelineConfig.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "adapter": { - "protocol": "HTTP", - "format": "XML", - "location": "http://www.nodisrespect.org" - }, - "transformations": [ - { - "func": "return data+data;", - "data": "[1]" - }, - { - "func": "return 1", - "data": "[]" - } - ], - "trigger": { - "firstExecution": "1905-12-01T02:30:00.123", - "periodic": true, - "interval": 50000 - }, - "metadata": { - "author": "icke", - "license": "none" - } -} \ No newline at end of file diff --git a/core/integration-test/src/core.test.js b/core/integration-test/src/core.test.js index 06a7e3753..731993f45 100644 --- a/core/integration-test/src/core.test.js +++ b/core/integration-test/src/core.test.js @@ -39,15 +39,13 @@ describe("Core", () => { .post("/pipelines") .send(pipelineConfig); - const UUIDregEx = '[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}'; - const id = response.body.id; expect(response.status).toEqual(201); expect(response.header.location).toContain(response.body.id) expect(response.body.transformations).toEqual(pipelineConfig.transformations); expect(response.body.adapter).toEqual(pipelineConfig.adapter); expect(response.body.trigger).toEqual(pipelineConfig.trigger); - expect(id).toMatch(new RegExp(UUIDregEx)); - expect(id).toEqual(response.body.persistence.pipelineid); + expect(response.body.id).toBeDefined(); + expect(response.body.id).not.toEqual(pipelineConfig.id) // id not under control of client const delResponse = await request(URL) .delete("/pipelines/" + response.body.id) @@ -82,7 +80,6 @@ describe("Core", () => { expect(originalGetResponse.body.transformations).toEqual(updatedGetResponse.body.transformations); expect(originalGetResponse.body.metadata).toEqual(updatedGetResponse.body.metadata); expect(originalGetResponse.body.id).toEqual(updatedGetResponse.body.id); - expect(originalGetResponse.body.persistence).toEqual(updatedGetResponse.body.persistence); expect(updatedConfig.adapter.location).toEqual(updatedGetResponse.body.adapter.location); expect(originalGetResponse.body.adapter.format).toEqual(updatedGetResponse.body.adapter.format); expect(originalGetResponse.body.adapter.protocol).toEqual(updatedGetResponse.body.adapter.protocol); @@ -97,7 +94,7 @@ describe("Core", () => { }); const pipelineConfig = { - "id": "new", + "id": 12345, "adapter": { "protocol": "HTTP", "format": "XML", @@ -120,6 +117,8 @@ const pipelineConfig = { }, "metadata": { "author": "icke", - "license": "none" + "license": "none", + "displayName": "test pipeline 1", + "description": "integraiton testing pipeline" } }; diff --git a/core/src/main/java/org/jvalue/ods/coreservice/model/DataPersistenceConfig.java b/core/src/main/java/org/jvalue/ods/coreservice/model/DataPersistenceConfig.java deleted file mode 100644 index 8910728b5..000000000 --- a/core/src/main/java/org/jvalue/ods/coreservice/model/DataPersistenceConfig.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.jvalue.ods.coreservice.model; - -import com.fasterxml.jackson.annotation.JsonCreator; - -import javax.persistence.Embeddable; -import javax.validation.constraints.NotNull; -import java.util.Objects; - -@Embeddable -public class DataPersistenceConfig { - @NotNull - private String pipelineId; - - - //Constructor for JPA - private DataPersistenceConfig() { - } - - @JsonCreator - public DataPersistenceConfig(String pipelineId) { - this.pipelineId = pipelineId; - } - - @Override - public String toString() { - return "DataPersistenceConfig{" + - "pipelineid=" + pipelineId + - '}'; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - DataPersistenceConfig that = (DataPersistenceConfig) o; - return pipelineId.equals(that.pipelineId); - } - - @Override - public int hashCode() { - return Objects.hash(pipelineId); - } - - public String getPipelineid() { - return pipelineId; - } -} diff --git a/core/src/main/java/org/jvalue/ods/coreservice/model/PipelineConfig.java b/core/src/main/java/org/jvalue/ods/coreservice/model/PipelineConfig.java index 244a1a604..c921c59a8 100644 --- a/core/src/main/java/org/jvalue/ods/coreservice/model/PipelineConfig.java +++ b/core/src/main/java/org/jvalue/ods/coreservice/model/PipelineConfig.java @@ -8,13 +8,13 @@ import java.io.Serializable; import java.util.List; import java.util.Objects; -import java.util.UUID; @Entity public class PipelineConfig implements Serializable { @Id - private String id; + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; @Embedded @NotNull private AdapterConfig adapter; @@ -22,9 +22,6 @@ public class PipelineConfig implements Serializable { @ElementCollection @NotNull private List transformations; - @Embedded @NotNull - private DataPersistenceConfig persistence; - @Embedded @NotNull private PipelineTriggerConfig trigger; @@ -41,10 +38,8 @@ public PipelineConfig( @JsonProperty("transformations") List transformations, @JsonProperty("trigger") PipelineTriggerConfig trigger, @JsonProperty("metadata") PipelineMetadata metadata) { - this.id = UUID.randomUUID().toString(); this.adapter = adapter; this.transformations = transformations; - this.persistence = new DataPersistenceConfig(this.id); this.trigger = trigger; this.metadata = metadata; } @@ -56,7 +51,6 @@ public String toString() { "id=" + id + ", adapter=" + adapter + ", transformations=" + transformations.toString() + - ", persistence=" + persistence + ", trigger=" + trigger + ", metadata=" + metadata + '}'; @@ -75,11 +69,11 @@ public int hashCode() { return Objects.hash(id); } - public String getId() { + public Long getId() { return id; } - private void setId(String id) { + public void setId(Long id) { this.id = id; } @@ -99,14 +93,6 @@ public void setTransformations(List transformations) { this.transformations = transformations; } - public DataPersistenceConfig getPersistence() { - return persistence; - } - - public void setPersistence(DataPersistenceConfig persistence) { - this.persistence = persistence; - } - public PipelineTriggerConfig getTrigger() { return trigger; } @@ -125,9 +111,12 @@ public PipelineMetadata getMetadata() { * @return an updated PipelineConfig that has the same id and creationTimestamp as the original one. */ public PipelineConfig applyUpdate(PipelineConfig updateConfig) { - PipelineMetadata updatedMetadata = new PipelineMetadata(updateConfig.metadata.getAuthor(), updateConfig.metadata.getLicense()); + PipelineMetadata updatedMetadata = new PipelineMetadata( + updateConfig.metadata.getAuthor(), + updateConfig.metadata.getLicense(), + updateConfig.metadata.getDisplayName(), + updateConfig.metadata.getDescription()); updatedMetadata.setCreationTimestamp(this.getMetadata().getCreationTimestamp()); - DataPersistenceConfig updatedPersistence = new DataPersistenceConfig(this.id); PipelineConfig updated = new PipelineConfig( updateConfig.adapter, @@ -135,16 +124,7 @@ public PipelineConfig applyUpdate(PipelineConfig updateConfig) { updateConfig.trigger, updatedMetadata); updated.setId(this.id); - updated.setPersistence(updatedPersistence); return updated; } - - /** - * Create a new UUID that is be used as id. - */ - public void renewId() { - this.id = UUID.randomUUID().toString(); - this.persistence = new DataPersistenceConfig(this.id); - } } diff --git a/core/src/main/java/org/jvalue/ods/coreservice/model/PipelineMetadata.java b/core/src/main/java/org/jvalue/ods/coreservice/model/PipelineMetadata.java index 98908c269..c92bd6085 100644 --- a/core/src/main/java/org/jvalue/ods/coreservice/model/PipelineMetadata.java +++ b/core/src/main/java/org/jvalue/ods/coreservice/model/PipelineMetadata.java @@ -14,7 +14,11 @@ public class PipelineMetadata { @NotNull private String author; + @NotNull + private String displayName; + private String license; + private String description; @NotNull private LocalDateTime creationTimestamp; @@ -26,9 +30,13 @@ private PipelineMetadata() { @JsonCreator public PipelineMetadata( @JsonProperty("author") String author, - @JsonProperty("license") String license) { + @JsonProperty("license") String license, + @JsonProperty("displayName") String displayName, + @JsonProperty("description") String description) { this.author = author; this.license = license; + this.displayName = displayName; + this.description = description; this.creationTimestamp = LocalDateTime.now(); } @@ -40,6 +48,14 @@ public String getLicense() { return license; } + public String getDescription() { + return description; + } + + public String getDisplayName() { + return displayName; + } + public void setCreationTimestamp(LocalDateTime creationTimestamp) { this.creationTimestamp = creationTimestamp; } @@ -51,9 +67,11 @@ public LocalDateTime getCreationTimestamp() { @Override public String toString() { return "PipelineMetadata{" + - "author='" + author + '\'' + + "displayName='" + displayName + '\'' + + ", author='" + author + '\'' + ", license='" + license + '\'' + ", creationTimestamp=" + creationTimestamp + + ", description='" + description + '\'' + '}'; } @@ -62,13 +80,16 @@ public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; PipelineMetadata that = (PipelineMetadata) o; - return author.equals(that.author) && + return Objects.equals(author, that.author) && Objects.equals(license, that.license) && - creationTimestamp.equals(that.creationTimestamp); + Objects.equals(creationTimestamp, that.creationTimestamp) && + Objects.equals(displayName, that.displayName) && + Objects.equals(description, that.description); } + @Override public int hashCode() { - return Objects.hash(author, license, creationTimestamp); + return Objects.hash(author, license, creationTimestamp, displayName, description); } } diff --git a/core/src/main/java/org/jvalue/ods/coreservice/repository/PipelineRepository.java b/core/src/main/java/org/jvalue/ods/coreservice/repository/PipelineRepository.java index 4666b2b76..e01da195c 100644 --- a/core/src/main/java/org/jvalue/ods/coreservice/repository/PipelineRepository.java +++ b/core/src/main/java/org/jvalue/ods/coreservice/repository/PipelineRepository.java @@ -5,5 +5,5 @@ import org.springframework.stereotype.Repository; @Repository -public interface PipelineRepository extends CrudRepository { +public interface PipelineRepository extends CrudRepository { } diff --git a/core/src/main/java/org/jvalue/ods/coreservice/rest/v1/PipelinesEndpoint.java b/core/src/main/java/org/jvalue/ods/coreservice/rest/v1/PipelinesEndpoint.java index 7ae6be656..89b928b57 100644 --- a/core/src/main/java/org/jvalue/ods/coreservice/rest/v1/PipelinesEndpoint.java +++ b/core/src/main/java/org/jvalue/ods/coreservice/rest/v1/PipelinesEndpoint.java @@ -30,14 +30,14 @@ public Iterable getPipelines() { } @GetMapping("/{id}") - public PipelineConfig getPipeline(@PathVariable String id) { + public PipelineConfig getPipeline(@PathVariable Long id) { return pipelineRepository.findById(id) .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Could not find pipeline with id " + id)); } @PostMapping public ResponseEntity addPipeline(@Valid @RequestBody PipelineConfig config) { - config.renewId(); + config.setId(null); // id not under control of client PipelineConfig savedConfig = pipelineRepository.save(config); URI location = ServletUriComponentsBuilder.fromCurrentRequest() @@ -51,17 +51,16 @@ public ResponseEntity addPipeline(@Valid @RequestBody PipelineCo @PutMapping("/{id}") @ResponseStatus(HttpStatus.NO_CONTENT) public void updatePipeline( - @PathVariable String id, + @PathVariable Long id, @Valid @RequestBody PipelineConfig updateConfig) { PipelineConfig oldConfig = pipelineRepository.findById(id) .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Could not find pipeline with id " + id + ". Can only update existing pipelines.")); - pipelineRepository.deleteById(id); pipelineRepository.save(oldConfig.applyUpdate(updateConfig)); } @DeleteMapping("/{id}") - public ResponseEntity deletePipeline(@PathVariable String id) { + public ResponseEntity deletePipeline(@PathVariable Long id) { pipelineRepository.deleteById(id); return ResponseEntity.ok().build(); diff --git a/core/src/test/java/org/jvalue/ods/coreservice/model/PipelineConfig.json b/core/src/test/java/org/jvalue/ods/coreservice/model/PipelineConfig.json index d053f08b9..2d0d76417 100644 --- a/core/src/test/java/org/jvalue/ods/coreservice/model/PipelineConfig.json +++ b/core/src/test/java/org/jvalue/ods/coreservice/model/PipelineConfig.json @@ -1,4 +1,5 @@ { + "id": 123, "adapter": { "protocol": "HTTP", "format": "XML", @@ -21,6 +22,8 @@ }, "metadata": { "author": "icke", - "license": "none" + "license": "none", + "displayName": "TestName", + "description": "Describing..." } } \ No newline at end of file diff --git a/core/src/test/java/org/jvalue/ods/coreservice/model/PipelineConfigTest.java b/core/src/test/java/org/jvalue/ods/coreservice/model/PipelineConfigTest.java index 3b92be6d6..f024c1c26 100644 --- a/core/src/test/java/org/jvalue/ods/coreservice/model/PipelineConfigTest.java +++ b/core/src/test/java/org/jvalue/ods/coreservice/model/PipelineConfigTest.java @@ -24,12 +24,13 @@ public void testDeserialization() throws IOException { assertEquals(expectedAdapter, result.getAdapter()); assertEquals(2, result.getTransformations().size()); assertNotNull(result.getId()); - assertEquals(result.getId(), result.getPersistence().getPipelineid()); assertTrue(result.getTrigger().isPeriodic()); assertEquals(LocalDateTime.parse("1905-12-01T02:30:00.123"), result.getTrigger().getFirstExecution()); assertEquals(50000, result.getTrigger().getInterval().longValue()); assertEquals("icke", result.getMetadata().getAuthor()); assertEquals("none", result.getMetadata().getLicense()); + assertEquals("TestName", result.getMetadata().getDisplayName()); + assertEquals("Describing...", result.getMetadata().getDescription()); assertEquals(LocalDateTime.now().getDayOfYear(), result.getMetadata().getCreationTimestamp().getDayOfYear()); } @@ -41,13 +42,13 @@ public void testSerialization() { new TransformationConfig("data * 10", "[2]") ); PipelineTriggerConfig trigger = new PipelineTriggerConfig(false, LocalDateTime.now(), 10L); - PipelineMetadata metadata = new PipelineMetadata("icke", "none"); + PipelineMetadata metadata = new PipelineMetadata("icke", "none", "asd", "def"); PipelineConfig config = new PipelineConfig(adapter, transformations, trigger, metadata); JsonNode result = mapper.valueToTree(config); System.out.println(result); - assertEquals(6, result.size()); + assertEquals(5, result.size()); assertEquals("HTTP", result.get("adapter").get("protocol").textValue()); assertEquals("JSON", result.get("adapter").get("format").textValue()); assertEquals("http://www.the-inder.net", result.get("adapter").get("location").textValue()); @@ -56,16 +57,4 @@ public void testSerialization() { assertEquals("[2]", result.get("transformations").get(1).get("data").textValue()); } - - @Test - public void testRenewId() throws IOException { - File pipelineConfig = new File("src/test/java/org/jvalue/ods/coreservice/model/PipelineConfig.json"); - PipelineConfig pipeline = mapper.readValue(pipelineConfig, PipelineConfig.class); - - String oldId = pipeline.getId(); - pipeline.renewId(); - String renewedId = pipeline.getId(); - - assertNotEquals(oldId, renewedId); - } } diff --git a/ui/package-lock.json b/ui/package-lock.json index 2106f4a1d..e2e0f116d 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -13855,6 +13855,15 @@ "vue-style-loader": "^4.1.0" } }, + "vue-property-decorator": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/vue-property-decorator/-/vue-property-decorator-8.2.1.tgz", + "integrity": "sha512-zgtcvzGB2JpDqnIxVhTK+6m+dv3uyhYs+tL8elL+DWiXj9kDonKcPY7f1DHYX1NlnWPCj7ht0nL/i8+S1gg76Q==", + "requires": { + "vue": "^2.6.10", + "vue-class-component": "^7.0.1" + } + }, "vue-router": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.0.7.tgz", diff --git a/ui/package.json b/ui/package.json index a3d73654c..48552116f 100644 --- a/ui/package.json +++ b/ui/package.json @@ -13,6 +13,7 @@ "keycloak-js": "^6.0.1", "vue": "^2.6.10", "vue-class-component": "^7.1.0", + "vue-property-decorator": "^8.2.1", "vue-router": "^3.0.7", "vuetify": "^1.5.16", "vuex": "^3.1.1", diff --git a/ui/src/pipeline/PipelineEdit.vue b/ui/src/pipeline/PipelineEdit.vue new file mode 100644 index 000000000..0c9ed2ab9 --- /dev/null +++ b/ui/src/pipeline/PipelineEdit.vue @@ -0,0 +1,210 @@ + + + + + \ No newline at end of file diff --git a/ui/src/pipeline/PipelineOverview.vue b/ui/src/pipeline/PipelineOverview.vue index 40d40f5cd..63bef46b3 100644 --- a/ui/src/pipeline/PipelineOverview.vue +++ b/ui/src/pipeline/PipelineOverview.vue @@ -3,9 +3,8 @@ Create new pipeline @@ -19,84 +18,6 @@ mdi mdi-sync - - - - Create new pipeline - Update pipeline - - - - Adapter - - - - - - Transformations - - - - Metadata - - - - - Trigger - - - - - - - - - - - Cancel - Save - Update - - - @@ -123,21 +45,21 @@ {{ props.item.id }} - {{ props.item.metadata.author }} + {{ props.item.metadata.displayName }} - {{ props.item.trigger.firstExecution }} + {{ props.item.metadata.author }} - + Data mdi mdi-database - + Edit mdi mdi-pencil - + Delete mdi mdi-delete @@ -156,98 +78,47 @@ import Pipeline from './pipeline'; const namespace = { namespace: 'pipeline' } -@Component +@Component({}) export default class PipelineOverview extends Vue { - @Action('loadPipelines', namespace) private loadPipelinesAction!: () => void; - @Action('deletePipeline', namespace) private deletePipelineAction!: (id: string) => void; - @Action('createPipeline', namespace) private createPipelineAction!: (p: Pipeline) => void; - @Action('updatePipeline', namespace) private updatePipelineAction!: (p: Pipeline) => void; + @Action('loadPipelines', namespace) private loadPipelinesAction!: () => void; + @Action('deletePipeline', namespace) private deletePipelineAction!: (id: number) => void; + @State('isLoadingPipelines', namespace) private isLoadingPipelines!: boolean; - @State('pipelines', namespace) private pipelines!: object[]; - private ID_NEW = 'new' - private headers = [ { text: 'Id', value: 'id' }, - { text: 'Author', value: 'author' }, - { text: 'First Execution', value: 'firstExecution'}, - { text: 'Action', value: 'action' } + { text: 'Pipeline Name', value: 'displayName', sortable: false}, // sorting to be implemented + { text: 'Author', value: 'author', sortable: false }, + { text: 'Action', value: 'action', sortable: false } ]; - private dialog = false; - - private valid: boolean = false; - - private availableAdapterProtocols = ['HTTP'] - private availableAdapterFormats = ['JSON', 'XML'] - private defaultTransformationFunc = 'data.test = \'abc\'; return data;' - private defaultTrigger = {periodic: true, interval: 60000} - - private dialogPipelineDefault: Pipeline = { - id: this.ID_NEW, - adapter: { - protocol: this.availableAdapterProtocols[0], - format: this.availableAdapterFormats[0], - location: 'https://www.pegelonline.wsv.de/webservices/rest-api/v2/stations.json' - }, - transformations: [{func: this.defaultTransformationFunc}], - metadata: { - author: '', - license: '' - }, - trigger: { - periodic: true, - interval: 60000 - } - }; - - private dialogPipeline: Pipeline = JSON.parse(JSON.stringify(this.dialogPipelineDefault)) - private search = ''; - private required (val: string) { - return !!val || 'required.' - } - private mounted () { this.loadPipelinesAction() } - private showPipelineData (pipeline: Pipeline) { - this.$router.push({ name: 'pipeline-storage-overview', params: { storageId: pipeline.id } }) + private onShowPipelineData (pipeline: Pipeline) { + this.$router.push({ name: 'pipeline-storage-overview', params: { storageId: `${pipeline.id}` } }) } - private editPipeline (pipeline: Pipeline) { - this.dialogPipeline = JSON.parse(JSON.stringify(pipeline)) - this.dialog = true + private onCreatePipeline () { + this.$router.push({ name: 'pipeline-new'}) } - private deletePipeline (pipeline: Pipeline) { - this.deletePipelineAction(pipeline.id); + private onEditPipeline (pipeline: Pipeline) { + this.$router.push({ name: 'pipeline-edit', params: { pipelineId: `${pipeline.id}` } }) } - private close () { - this.dialog = false - setTimeout(() => { - this.resetForm() - }, 300) - } - - private save () { - this.createPipelineAction(this.dialogPipeline); - this.dialog = false - } - - private update () { - this.updatePipelineAction(this.dialogPipeline); - this.dialog = false + private onDeletePipeline (pipeline: Pipeline) { + this.deletePipelineAction(pipeline.id); } - private resetForm () { - (this.$refs.form as HTMLFormElement).reset() - this.dialogPipeline = JSON.parse(JSON.stringify(this.dialogPipelineDefault)) + private filterPipelines (items: Pipeline[], search: string | null, filter: any) : Pipeline[] { + const searchTerm = !!search ? search.toLowerCase() : '' + return items.filter(item => filter(item.metadata.displayName, searchTerm)) } } diff --git a/ui/src/pipeline/module.ts b/ui/src/pipeline/module.ts index b76534464..781ebed14 100644 --- a/ui/src/pipeline/module.ts +++ b/ui/src/pipeline/module.ts @@ -6,6 +6,8 @@ import * as RestService from './pipelineRest' export default class PipelineModule extends VuexModule { private pipelines: Pipeline[] = [] + private selectedPipeline: Pipeline = {} as unknown as Pipeline + private isLoadingPipelines: boolean = true @Mutation @@ -14,6 +16,11 @@ export default class PipelineModule extends VuexModule { this.isLoadingPipelines = false } + @Mutation + public setSelectedPipeline (pipeline: Pipeline): void { + this.selectedPipeline = pipeline + } + @Mutation public setIsLoadingPipelines (value: boolean): void { this.isLoadingPipelines = value @@ -26,6 +33,11 @@ export default class PipelineModule extends VuexModule { return RestService.getAllPipelines() } + @Action({ commit: 'setSelectedPipeline' }) + public async loadPipelineById (id: number): Promise { + return RestService.getPipelineById(id) + } + @Action({ commit: 'setPipelines' }) public async createPipeline (pipeline: Pipeline): Promise { await RestService.createPipeline(pipeline) @@ -39,9 +51,8 @@ export default class PipelineModule extends VuexModule { } @Action({ commit: 'setPipelines' }) - public async deletePipeline (pipelineId: string): Promise { + public async deletePipeline (pipelineId: number): Promise { await RestService.deletePipeline(pipelineId) return RestService.getAllPipelines() } - } diff --git a/ui/src/pipeline/pipeline.ts b/ui/src/pipeline/pipeline.ts index 5430a1422..0598ca6dc 100644 --- a/ui/src/pipeline/pipeline.ts +++ b/ui/src/pipeline/pipeline.ts @@ -1,8 +1,14 @@ export default interface Pipeline { - id: string; + id: number; adapter: object; - metadata: object; + metadata: PipelineMetaData; transformations: object[]; trigger: object; - persistence?: object; +} + +export interface PipelineMetaData { + displayName: string; + description: string; + author: string; + license: string; } diff --git a/ui/src/pipeline/pipelineRest.ts b/ui/src/pipeline/pipelineRest.ts index 23b44f512..c95e40812 100644 --- a/ui/src/pipeline/pipelineRest.ts +++ b/ui/src/pipeline/pipelineRest.ts @@ -7,6 +7,12 @@ export async function getAllPipelines (): Promise { return data } +export async function getPipelineById (id: number): Promise { + const response = await fetch(`${CORE_SERVICE_URL}/pipelines/${id}`) + const data = await response.json() + return data +} + export async function createPipeline (pipeline: Pipeline): Promise { const options = { method: 'POST', @@ -31,7 +37,7 @@ export async function updatePipeline (pipeline: Pipeline): Promise { return fetch(`${CORE_SERVICE_URL}/pipelines/${pipeline.id}`, options) } -export async function deletePipeline (pipelineId: string): Promise { +export async function deletePipeline (pipelineId: number): Promise { const options = { method: 'DELETE' } return fetch(`${CORE_SERVICE_URL}/pipelines/${pipelineId}`, options) } diff --git a/ui/src/pipeline/router.ts b/ui/src/pipeline/router.ts index c45b4cca1..edee317f8 100644 --- a/ui/src/pipeline/router.ts +++ b/ui/src/pipeline/router.ts @@ -1,4 +1,5 @@ import PipelineOverview from './PipelineOverview.vue' +import PipelineEdit from './PipelineEdit.vue' export default [ { @@ -6,5 +7,17 @@ export default [ name: 'pipeline-overview', component: PipelineOverview, meta: { title: 'Pipeline Overview', requiresAuth: true } + }, + { + path: '/pipeline/new', + name: 'pipeline-new', + component: PipelineEdit, + meta: { title: 'Create new Pipeline', requiresAuth: true, isEditMode: false } + }, + { + path: '/pipeline/edit', + name: 'pipeline-edit', + component: PipelineEdit, + meta: { title: 'Edit Pipeline', requiresAuth: true, isEditMode: true }, } ] diff --git a/ui/src/storage/PipelineStorageOverview.vue b/ui/src/storage/PipelineStorageOverview.vue index 6419da4e7..983fd798f 100644 --- a/ui/src/storage/PipelineStorageOverview.vue +++ b/ui/src/storage/PipelineStorageOverview.vue @@ -112,7 +112,7 @@ export default class PipelineStorageOverview extends Vue { private storageId: string = ''; - private clipUrl: (string) => Promise = clipboardCopy + private clipUrl: (content: string) => Promise = clipboardCopy private getStorageItemUrl (storageId: string, itemId: string): string { let url = StorageClient.getItemUrl(storageId, itemId) From a4b4ca0d7ff83cf3ac507a83ac482e8892de968a Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Tue, 30 Jul 2019 07:52:23 +0000 Subject: [PATCH 0039/1168] Resolve "ui: Make interval selection during pipeline creation easier to use" --- ui/src/pipeline/PipelineEdit.vue | 124 ++++++++++++++++++++++++++----- ui/src/pipeline/pipeline.ts | 7 +- 2 files changed, 110 insertions(+), 21 deletions(-) diff --git a/ui/src/pipeline/PipelineEdit.vue b/ui/src/pipeline/PipelineEdit.vue index 0c9ed2ab9..6d923e52c 100644 --- a/ui/src/pipeline/PipelineEdit.vue +++ b/ui/src/pipeline/PipelineEdit.vue @@ -90,12 +90,50 @@ - + Interval: {{dialogIntervalHours}}h {{dialogIntervalMinutes}}m + Hours + + + + + + + Minutes + + + + + + Back void; - @Action("createPipeline", namespace) private createPipelineAction!: (p: Pipeline) => void; - @Action("updatePipeline", namespace) private updatePipelineAction!: (p: Pipeline) => void; - - @State('selectedPipeline', namespace) private selectedPipeline!: Pipeline + @Action("loadPipelineById", namespace) private loadPipelineByIdAction!: ( + id: number + ) => void; + @Action("createPipeline", namespace) private createPipelineAction!: ( + p: Pipeline + ) => void; + @Action("updatePipeline", namespace) private updatePipelineAction!: ( + p: Pipeline + ) => void; + + @State("selectedPipeline", namespace) private selectedPipeline!: Pipeline; private isEditMode: boolean = false; @@ -168,29 +212,69 @@ export default class PipelineEdit extends Vue { } }; + private dialogIntervalHours: number = 1 + private dialogIntervalMinutes: number = 0 + + private hoursTickLabels = ['0h','','','','','','6h','','','','','','12h','','','','','','18h','','','','','','24h'] + private minutesTickLabels = () => { + var ticks = new Array(61) + ticks[0] = '0m' + ticks[15] = '15m' + ticks[30] = '30m' + ticks[45] = '45m' + ticks[60] = '60m' + return ticks + } + + created() { - this.isEditMode = this.$route.meta.isEditMode + this.isEditMode = this.$route.meta.isEditMode; - if(this.isEditMode) { - const id = this.$route.params.pipelineId as unknown as number - this.loadPipelineByIdAction(id) + if (this.isEditMode) { + const id = (this.$route.params.pipelineId as unknown) as number; + this.loadPipelineByIdAction(id); } } - @Watch('selectedPipeline') + @Watch("selectedPipeline") onSelectedPipelineChange(value: Pipeline, oldValue: Pipeline) { - if(value != oldValue) { - this.dialogPipeline = value + if (value != oldValue) { + this.dialogPipeline = value; + this.loadDialogIntervalForSlider() } } + private setDialogInterval() { + const hoursInMS = this.dialogIntervalHours * 3600 * 1000 + const minutesInMS = this.dialogIntervalMinutes * 60 * 1000 + this.dialogPipeline.trigger.interval = hoursInMS + minutesInMS + } + + private loadDialogIntervalForSlider() { + if (this.dialogPipeline.trigger.interval <= 1 ) { + this.dialogIntervalHours = 0 + this.dialogIntervalMinutes = 0 + return + } + + var intervalInMS = this.dialogPipeline.trigger.interval + const hours = Math.floor(intervalInMS / (1000 * 60 * 60)) + intervalInMS -= hours * 3600 * 1000 + const minutes = Math.floor(intervalInMS / (1000 * 60)) + + this.dialogIntervalHours = hours + this.dialogIntervalMinutes = minutes + } + private onSave() { - this.createPipelineAction(this.dialogPipeline) + this.setDialogInterval() + this.createPipelineAction(this.dialogPipeline); this.routeToOverview(); } private onUpdate() { - this.updatePipelineAction(this.dialogPipeline) + this.setDialogInterval() + this.updatePipelineAction(this.dialogPipeline); this.routeToOverview(); } diff --git a/ui/src/pipeline/pipeline.ts b/ui/src/pipeline/pipeline.ts index 0598ca6dc..0c68e2d93 100644 --- a/ui/src/pipeline/pipeline.ts +++ b/ui/src/pipeline/pipeline.ts @@ -3,7 +3,7 @@ export default interface Pipeline { adapter: object; metadata: PipelineMetaData; transformations: object[]; - trigger: object; + trigger: Trigger; } export interface PipelineMetaData { @@ -12,3 +12,8 @@ export interface PipelineMetaData { author: string; license: string; } + +export interface Trigger { + periodic: boolean; + interval: number; +} From 0847891aac18975d94fe48723f30de1a5c59a8dd Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Wed, 31 Jul 2019 15:09:48 +0000 Subject: [PATCH 0040/1168] Resolve "PostGrest Failes at startup" --- .gitlab-ci.yml | 15 ++++++++++----- storage/docker/postgrest/Dockerfile | 10 ++-------- storage/docker/postgrest/refresh_schema.sh | 7 ------- 3 files changed, 12 insertions(+), 20 deletions(-) delete mode 100755 storage/docker/postgrest/refresh_schema.sh diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 5082164d9..310b219db 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -15,7 +15,7 @@ variables: # See further: https://docs.docker.com/storage/storagedriver/overlayfs-driver/ # See further: https://docs.gitlab.com/ee/ci/docker/using_docker_build.html DOCKER_DRIVER: "overlay2" - + ADAPTER_DOCKER_IMAGE_NAME: ${CI_REGISTRY_IMAGE}/adapter-service UI_DOCKER_IMAGE_NAME: ${CI_REGISTRY_IMAGE}/ui-service SCHEDULER_DOCKER_IMAGE_NAME: ${CI_REGISTRY_IMAGE}/scheduler-service @@ -55,12 +55,13 @@ integrationtest-adapter: - docker-compose -f docker-compose.yml -f docker-compose.ci.yml up -d adapter-service - docker-compose -f docker-compose.yml -f docker-compose.ci.yml up --exit-code-from adapter-service-it adapter-service-it after_script: + - docker-compose logs - docker-compose -f docker-compose.yml -f docker-compose.ci.yml down # PUBLISH publish-docker-adapter: stage: publish - image: docker:stable + image: docker:stable dependencies: - build-adapter when: manual @@ -97,7 +98,7 @@ build-ui: # PUBLISH publish-docker-ui: stage: publish - image: docker:stable + image: docker:stable dependencies: - build-ui when: manual @@ -149,13 +150,14 @@ integrationtest-storage: - docker-compose -f docker-compose.yml -f docker-compose.ci.yml up -d storage-service - docker-compose -f docker-compose.yml -f docker-compose.ci.yml up --exit-code-from storage-service-it storage-service-it after_script: + - docker-compose logs - docker-compose -f docker-compose.yml -f docker-compose.ci.yml down # PUBLISH publish-docker-storage: stage: publish - image: docker:stable + image: docker:stable dependencies: - build-storage when: manual @@ -206,6 +208,7 @@ integrationtest-core: - docker-compose -f docker-compose.yml -f docker-compose.ci.yml up -d core-service - docker-compose -f docker-compose.yml -f docker-compose.ci.yml up --exit-code-from core-service-it core-service-it after_script: + - docker-compose logs - docker-compose -f docker-compose.yml -f docker-compose.ci.yml down @@ -259,6 +262,7 @@ integrationtest-scheduler: - docker-compose -f docker-compose.yml -f docker-compose.ci.yml up -d scheduler-service - docker-compose -f docker-compose.yml -f docker-compose.ci.yml up --exit-code-from scheduler-service-it scheduler-service-it after_script: + - docker-compose logs - docker-compose -f docker-compose.yml -f docker-compose.ci.yml down @@ -311,13 +315,14 @@ integrationtest-transformation: - docker-compose -f docker-compose.yml -f docker-compose.ci.yml up -d transformation-service - docker-compose -f docker-compose.yml -f docker-compose.ci.yml up --exit-code-from transformation-service-it transformation-service-it after_script: + - docker-compose logs - docker-compose -f docker-compose.yml -f docker-compose.ci.yml down # PUBLISH publish-docker-transformation: stage: publish - image: docker:stable + image: docker:stable dependencies: - build-transformation when: manual diff --git a/storage/docker/postgrest/Dockerfile b/storage/docker/postgrest/Dockerfile index bee9bc00b..a8880197f 100644 --- a/storage/docker/postgrest/Dockerfile +++ b/storage/docker/postgrest/Dockerfile @@ -1,9 +1,3 @@ -FROM postgrest/postgrest +FROM postgrest/postgrest:v6.0.0 -COPY ./refresh_schema.sh refresh_schema.sh - -# Removed the following line because Docker somehow missed the execution rights from one day to another -# RUN chmod +x refresh_schema.sh - -CMD refresh_schema.sh & \ - exec postgrest /etc/postgrest.conf \ No newline at end of file +CMD exec postgrest /etc/postgrest.conf diff --git a/storage/docker/postgrest/refresh_schema.sh b/storage/docker/postgrest/refresh_schema.sh deleted file mode 100755 index edd422ee0..000000000 --- a/storage/docker/postgrest/refresh_schema.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - -while true; do - printf 'Refreshing PostgREST schema...\n' - $(pkill -SIGUSR1 postgrest) - sleep 20 -done From 4f45884b779ff37db0ea991ca4af2fc2957d182e Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Wed, 31 Jul 2019 15:20:43 +0000 Subject: [PATCH 0041/1168] Resolve "Cross-Service Timestamp / Date Strategy" --- core/.gitignore | 1 + core/integration-test/src/core.test.js | 2 +- .../coreservice/model/PipelineMetadata.java | 15 +- .../model/PipelineTriggerConfig.java | 12 +- .../ods/coreservice/model/PipelineConfig.json | 2 +- .../coreservice/model/PipelineConfigTest.java | 17 +- .../model/PipelineMetadataTest.java | 7 +- .../coreservice/model/TriggerConfigTest.java | 14 +- ui/src/components/DateTimePicker.vue | 166 ++++++++++++++++++ ui/src/pipeline/PipelineEdit.vue | 11 +- ui/src/pipeline/pipeline.ts | 3 +- ui/src/pipeline/pipelineRest.ts | 19 +- 12 files changed, 240 insertions(+), 29 deletions(-) create mode 100644 ui/src/components/DateTimePicker.vue diff --git a/core/.gitignore b/core/.gitignore index 5e4b6e974..363e68e28 100644 --- a/core/.gitignore +++ b/core/.gitignore @@ -1,3 +1,4 @@ +.idea .project .classpath .settings/ diff --git a/core/integration-test/src/core.test.js b/core/integration-test/src/core.test.js index 731993f45..f5698c4ae 100644 --- a/core/integration-test/src/core.test.js +++ b/core/integration-test/src/core.test.js @@ -111,7 +111,7 @@ const pipelineConfig = { } ], "trigger": { - "firstExecution": "1905-12-01T02:30:00.123", + "firstExecution": "1905-12-01T02:30:00.123Z", "periodic": true, "interval": 50000 }, diff --git a/core/src/main/java/org/jvalue/ods/coreservice/model/PipelineMetadata.java b/core/src/main/java/org/jvalue/ods/coreservice/model/PipelineMetadata.java index c92bd6085..788ff1a92 100644 --- a/core/src/main/java/org/jvalue/ods/coreservice/model/PipelineMetadata.java +++ b/core/src/main/java/org/jvalue/ods/coreservice/model/PipelineMetadata.java @@ -1,11 +1,13 @@ package org.jvalue.ods.coreservice.model; import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonProperty; import javax.persistence.Embeddable; import javax.validation.constraints.NotNull; import java.time.LocalDateTime; +import java.util.Date; import java.util.Objects; @Embeddable @@ -20,8 +22,9 @@ public class PipelineMetadata { private String license; private String description; - @NotNull - private LocalDateTime creationTimestamp; + @NotNull + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", locale = "UTC") + private Date creationTimestamp; //Constructor for JPA private PipelineMetadata() { @@ -37,7 +40,7 @@ public PipelineMetadata( this.license = license; this.displayName = displayName; this.description = description; - this.creationTimestamp = LocalDateTime.now(); + this.creationTimestamp = new Date(); } public String getAuthor() { @@ -56,11 +59,11 @@ public String getDisplayName() { return displayName; } - public void setCreationTimestamp(LocalDateTime creationTimestamp) { + public void setCreationTimestamp(Date creationTimestamp) { this.creationTimestamp = creationTimestamp; } - public LocalDateTime getCreationTimestamp() { + public Date getCreationTimestamp() { return creationTimestamp; } @@ -70,7 +73,7 @@ public String toString() { "displayName='" + displayName + '\'' + ", author='" + author + '\'' + ", license='" + license + '\'' + - ", creationTimestamp=" + creationTimestamp + + ", creationTimestamp=" + creationTimestamp.toGMTString() + ", description='" + description + '\'' + '}'; } diff --git a/core/src/main/java/org/jvalue/ods/coreservice/model/PipelineTriggerConfig.java b/core/src/main/java/org/jvalue/ods/coreservice/model/PipelineTriggerConfig.java index a7527f2a5..c359fc54e 100644 --- a/core/src/main/java/org/jvalue/ods/coreservice/model/PipelineTriggerConfig.java +++ b/core/src/main/java/org/jvalue/ods/coreservice/model/PipelineTriggerConfig.java @@ -10,8 +10,8 @@ import javax.persistence.Embeddable; import javax.validation.constraints.NotNull; +import java.util.Date; import java.util.Objects; -import java.time.LocalDateTime; @Embeddable public class PipelineTriggerConfig { @@ -20,8 +20,8 @@ public class PipelineTriggerConfig { //time of first execution @NotNull - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS") - private LocalDateTime firstExecution; + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", locale = "UTC") + private Date firstExecution; //execution interval in ms private Long interval; @@ -34,7 +34,7 @@ private PipelineTriggerConfig() { @JsonCreator public PipelineTriggerConfig( @JsonProperty("periodic") boolean periodic, - @JsonProperty("firstExecution") LocalDateTime firstExecution, + @JsonProperty("firstExecution") Date firstExecution, @JsonProperty("interval") Long interval) { this.periodic = periodic; this.firstExecution = firstExecution; @@ -69,9 +69,7 @@ public boolean isPeriodic() { return periodic; } - @JsonDeserialize(using = LocalDateTimeDeserializer.class) - @JsonSerialize(using = LocalDateTimeSerializer.class) - public LocalDateTime getFirstExecution() { + public Date getFirstExecution() { return firstExecution; } diff --git a/core/src/test/java/org/jvalue/ods/coreservice/model/PipelineConfig.json b/core/src/test/java/org/jvalue/ods/coreservice/model/PipelineConfig.json index 2d0d76417..185921f22 100644 --- a/core/src/test/java/org/jvalue/ods/coreservice/model/PipelineConfig.json +++ b/core/src/test/java/org/jvalue/ods/coreservice/model/PipelineConfig.json @@ -16,7 +16,7 @@ } ], "trigger": { - "firstExecution": "1905-12-01T02:30:00.123", + "firstExecution": "1905-12-01T02:30:00.123Z", "periodic": true, "interval": 50000 }, diff --git a/core/src/test/java/org/jvalue/ods/coreservice/model/PipelineConfigTest.java b/core/src/test/java/org/jvalue/ods/coreservice/model/PipelineConfigTest.java index f024c1c26..7f82bee24 100644 --- a/core/src/test/java/org/jvalue/ods/coreservice/model/PipelineConfigTest.java +++ b/core/src/test/java/org/jvalue/ods/coreservice/model/PipelineConfigTest.java @@ -3,11 +3,12 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Test; +import org.springframework.format.datetime.DateFormatter; import java.io.File; import java.io.IOException; import java.time.LocalDateTime; -import java.util.List; +import java.util.*; import static org.junit.Assert.*; @@ -25,13 +26,19 @@ public void testDeserialization() throws IOException { assertEquals(2, result.getTransformations().size()); assertNotNull(result.getId()); assertTrue(result.getTrigger().isPeriodic()); - assertEquals(LocalDateTime.parse("1905-12-01T02:30:00.123"), result.getTrigger().getFirstExecution()); + + DateFormatter dateFormatter = new DateFormatter("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + dateFormatter.setTimeZone(TimeZone.getTimeZone("UTC")); + assertEquals("1905-12-01T02:30:00.123Z", dateFormatter.print(result.getTrigger().getFirstExecution(), Locale.getDefault())); + assertEquals(50000, result.getTrigger().getInterval().longValue()); assertEquals("icke", result.getMetadata().getAuthor()); assertEquals("none", result.getMetadata().getLicense()); assertEquals("TestName", result.getMetadata().getDisplayName()); assertEquals("Describing...", result.getMetadata().getDescription()); - assertEquals(LocalDateTime.now().getDayOfYear(), result.getMetadata().getCreationTimestamp().getDayOfYear()); + Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")); + cal.setTime(result.getMetadata().getCreationTimestamp()); + assertEquals(LocalDateTime.now().getDayOfYear(), cal.get(Calendar.DAY_OF_YEAR)); } @Test @@ -41,8 +48,8 @@ public void testSerialization() { new TransformationConfig("return 1+1", "[1]"), new TransformationConfig("data * 10", "[2]") ); - PipelineTriggerConfig trigger = new PipelineTriggerConfig(false, LocalDateTime.now(), 10L); - PipelineMetadata metadata = new PipelineMetadata("icke", "none", "asd", "def"); + PipelineTriggerConfig trigger = new PipelineTriggerConfig(false, new Date(), 10L); + PipelineMetadata metadata = new PipelineMetadata("icke", "none", "Display", "description"); PipelineConfig config = new PipelineConfig(adapter, transformations, trigger, metadata); JsonNode result = mapper.valueToTree(config); diff --git a/core/src/test/java/org/jvalue/ods/coreservice/model/PipelineMetadataTest.java b/core/src/test/java/org/jvalue/ods/coreservice/model/PipelineMetadataTest.java index 0bd24df33..6ad5df6e6 100644 --- a/core/src/test/java/org/jvalue/ods/coreservice/model/PipelineMetadataTest.java +++ b/core/src/test/java/org/jvalue/ods/coreservice/model/PipelineMetadataTest.java @@ -5,6 +5,8 @@ import java.io.IOException; import java.time.LocalDateTime; +import java.util.Calendar; +import java.util.TimeZone; import static org.junit.Assert.*; @@ -22,6 +24,9 @@ public void testDeserialization() throws IOException { assertEquals("harri", result.getAuthor()); assertEquals("nobodymayuseanything v1.0", result.getLicense()); - assertEquals(LocalDateTime.now().getDayOfYear(), result.getCreationTimestamp().getDayOfYear()); + Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")); + cal.setTime(result.getCreationTimestamp()); + assertEquals(LocalDateTime.now().getYear(), cal.get(Calendar.YEAR)); + assertEquals(LocalDateTime.now().getDayOfYear(), cal.get(Calendar.DAY_OF_YEAR)); } } diff --git a/core/src/test/java/org/jvalue/ods/coreservice/model/TriggerConfigTest.java b/core/src/test/java/org/jvalue/ods/coreservice/model/TriggerConfigTest.java index ce22b682d..a87ce4631 100644 --- a/core/src/test/java/org/jvalue/ods/coreservice/model/TriggerConfigTest.java +++ b/core/src/test/java/org/jvalue/ods/coreservice/model/TriggerConfigTest.java @@ -3,26 +3,34 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Test; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.format.datetime.DateFormatter; import java.io.IOException; +import java.util.Calendar; +import java.util.Locale; +import java.util.TimeZone; import static org.junit.Assert.*; public class TriggerConfigTest { -private ObjectMapper mapper = new ObjectMapper(); + private ObjectMapper mapper = new ObjectMapper() + .findAndRegisterModules(); @Test public void testDeserialization() throws IOException { String triggerConf = "{" + "\"periodic\": false," + - "\"firstExecution\":\"2021-03-03T21:20:19.123\"" + + "\"firstExecution\":\"2021-03-03T21:20:19.123Z\"" + "}"; PipelineTriggerConfig result = mapper.readValue(triggerConf, PipelineTriggerConfig.class); assertFalse(result.isPeriodic()); assertNull(result.getInterval()); - assertEquals("2021-03-03T21:20:19.123", result.getFirstExecution().toString()); + DateFormatter dateFormatter = new DateFormatter("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + dateFormatter.setTimeZone(TimeZone.getTimeZone("UTC")); + assertEquals("2021-03-03T21:20:19.123Z", dateFormatter.print(result.getFirstExecution(), Locale.getDefault())); } } diff --git a/ui/src/components/DateTimePicker.vue b/ui/src/components/DateTimePicker.vue new file mode 100644 index 000000000..218377108 --- /dev/null +++ b/ui/src/components/DateTimePicker.vue @@ -0,0 +1,166 @@ + + + diff --git a/ui/src/pipeline/PipelineEdit.vue b/ui/src/pipeline/PipelineEdit.vue index 6d923e52c..2a310b04b 100644 --- a/ui/src/pipeline/PipelineEdit.vue +++ b/ui/src/pipeline/PipelineEdit.vue @@ -90,6 +90,10 @@ + + Interval: {{dialogIntervalHours}}h {{dialogIntervalMinutes}}m Hours { const response = await fetch(`${CORE_SERVICE_URL}/pipelines`) const data = await response.json() - return data + return parsePipelines(data) } export async function getPipelineById (id: number): Promise { const response = await fetch(`${CORE_SERVICE_URL}/pipelines/${id}`) const data = await response.json() - return data + return parsePipeline(data) } export async function createPipeline (pipeline: Pipeline): Promise { @@ -23,7 +24,7 @@ export async function createPipeline (pipeline: Pipeline): Promise { const response = await fetch(`${CORE_SERVICE_URL}/pipelines`, options) const data = await response.json() - return data + return parsePipeline(data) } export async function updatePipeline (pipeline: Pipeline): Promise { @@ -41,3 +42,15 @@ export async function deletePipeline (pipelineId: number): Promise { const options = { method: 'DELETE' } return fetch(`${CORE_SERVICE_URL}/pipelines/${pipelineId}`, options) } + +function parsePipelines (pipelines: any[]): Pipeline[] { + const parsedPipelines: Pipeline[] = [] + pipelines.forEach(x => parsedPipelines.push(parsePipeline(x))) + return parsedPipelines +} + +function parsePipeline (pipeline: any): Pipeline { + const parsedPipeline = pipeline as Pipeline; + parsedPipeline.trigger.firstExecution = new Date(pipeline.trigger.firstExecution) + return parsedPipeline; +} \ No newline at end of file From cfbbe06ed0736d0d98bed7929df820880eab3821 Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Fri, 2 Aug 2019 13:04:58 +0000 Subject: [PATCH 0042/1168] Resolve "Fix CI Pipeline" --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 310b219db..ae8688be0 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -4,7 +4,7 @@ stages: - publish services: - - docker:dind + - docker:18.09.7-dind # For predefined environment variables see: https://docs.gitlab.com/ee/ci/variables/ variables: From 34b4ebea4399b74c4342861b50b41b8decc03f75 Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Mon, 19 Aug 2019 07:40:28 +0000 Subject: [PATCH 0043/1168] Add AGPL3 license --- LICENSE | 661 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 15 +- 2 files changed, 675 insertions(+), 1 deletion(-) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..0ad25db4b --- /dev/null +++ b/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/README.md b/README.md index 967673969..a98fac6f2 100644 --- a/README.md +++ b/README.md @@ -13,4 +13,17 @@ Use `docker-compose -f docker-compose.yml -f docker-compose.ci.yml up ### Using API -You can finde example requests for the api under [doc/example-requests](./doc/example-requests). \ No newline at end of file +You can finde example requests for the api under [doc/example-requests](./doc/example-requests). + + +# License + +Copyright 2019 Friedrich-Alexander Universität Erlangen-Nürnberg + +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License along with this program. If not, see http://www.gnu.org/licenses/. + +SPDX-License-Identifier: AGPL-3.0-only From 2b4b6603d3377695d88794445bcff9050d859d02 Mon Sep 17 00:00:00 2001 From: Andreas Bauer Date: Mon, 19 Aug 2019 12:34:22 +0000 Subject: [PATCH 0044/1168] Resolve "Extend Readme.md with an overview of the microservice structure and an example using the ui" --- README.md | 65 ++++++++++++++++++ doc/configuration-example/01_overview.jpg | Bin 0 -> 48530 bytes .../02_pipeline_name.jpg | Bin 0 -> 44309 bytes .../03_adapter_config.jpg | Bin 0 -> 34045 bytes .../04_transformation.jpg | Bin 0 -> 27260 bytes doc/configuration-example/05_meta-data.jpg | Bin 0 -> 29105 bytes doc/configuration-example/06_trigger.jpg | Bin 0 -> 49535 bytes .../07_overview_with_data.jpg | Bin 0 -> 51714 bytes doc/configuration-example/08_storage.jpg | Bin 0 -> 119381 bytes doc/service_arch.drawio | 13 +++- doc/service_arch.png | Bin 39585 -> 602913 bytes 11 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 doc/configuration-example/01_overview.jpg create mode 100644 doc/configuration-example/02_pipeline_name.jpg create mode 100644 doc/configuration-example/03_adapter_config.jpg create mode 100644 doc/configuration-example/04_transformation.jpg create mode 100644 doc/configuration-example/05_meta-data.jpg create mode 100644 doc/configuration-example/06_trigger.jpg create mode 100644 doc/configuration-example/07_overview_with_data.jpg create mode 100644 doc/configuration-example/08_storage.jpg diff --git a/README.md b/README.md index a98fac6f2..15b6a388b 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,23 @@ Main project for ODS. All related microservice projects for ODS are located in sub-directories. +## Project Structure + +We use the microservice architectural style in this project. The microservices are located in the sub-directories and communicate at runtime over network with each other. Each Microservice has its own defined interface that has to be used by other services, direct access to the database of other microservices is strictly prohibited. In production, each microservice can be multiplied in order to scale the system (except the scheduler at the moment). + +![Microservice Architecture](./doc/service_arch.png) + +| Microservice | Description | +|----|----| +| Web-Client / UI | easy and seamless configuration of Sources, Pipelines | +| Core-Service | stores and manages configurations for Pipelines | +| Scheduler | orchestrates the executions of Pipelines | +| Adapter-Service | fetches data from Sources and imports them into the system | +| Transformation-Service | execution of data transformations | +| Storage-Service | stores data of Pipelines and offers an API for querying | +| Auth-Service | user authentication and authorization | +| Reverse-Proxy | communication of UI with backend microservices indenepdent from deployment environment | + ## Run @@ -15,6 +32,54 @@ Use `docker-compose -f docker-compose.yml -f docker-compose.ci.yml up You can finde example requests for the api under [doc/example-requests](./doc/example-requests). +### Using the UI + +The easiest way to use the ODS is via the UI. If you started the ODS with docker-compose you can access the UI under `http://localhost:9000/ui/index.html`. If you click on any of the pages you need to authenticate yourself to proceed to the pages. For that, you can use the already existing user `demo` with the password `demo`. + +To demonstrate the ODS we will create a new pipeline to fetch water level data for German rivers and have a look at the collected data. + +First, go to the Pipelines page and click on `Create new Pipeline`. +The configuration workflow for creating a new pipeline is divided into the following five steps. + +![alt](doc/configuration-example/01_overview.jpg) + + +Step 1: Name the pipeline. + +![alt](doc/configuration-example/02_pipeline_name.jpg) + +Step 2: Configure an adapter to crawl the data. You can use the prefilled example settings. + +![alt](doc/configuration-example/03_adapter_config.jpg) + +Step 3: In this step, you can manipulate the raw data to fit your needs by writing JavaScript code. +The `data` object represents the incoming raw data. +In this example, the attribute `test` is added to the `data` object before returning it. + +![alt](doc/configuration-example/04_transformation.jpg) + +Step 4: Describe additional meta-data. + +![alt](doc/configuration-example/05_meta-data.jpg) + +Step 5: Configure the interval of how often the data should be fetched. +If `Periodic execution` is disabled the data will be fetched only once. +With the two sliders, you can choose the interval duration. +The first execution of the pipeline will be after the `Time of First Execution` plus the interval time. +Please choose 1 minute, so that you don't have to wait too long for the first data to arrive. + +![alt](doc/configuration-example/06_trigger.jpg) + +The configuration of the pipeline is now finished. In the overview, you see now the recently created pipeline. + +![alt](doc/configuration-example/07_overview_with_data.jpg) + +By clicking on the `Data` button inside the table you see the collected data by the pipeline. + +![alt](doc/configuration-example/08_storage.jpg) + +In this storage view, you see all data sets for the related pipeline. On top of this list, a static link shows the URL to fetch the data with a REST client. +Each data entry in the list can be expanded to see the fetched data and additional meta-data. # License diff --git a/doc/configuration-example/01_overview.jpg b/doc/configuration-example/01_overview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0e4d8c5b4aaa5ae7ad1b21d9f97a0e0fd68214fa GIT binary patch literal 48530 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 B=K=r# literal 0 HcmV?d00001 diff --git a/doc/configuration-example/02_pipeline_name.jpg b/doc/configuration-example/02_pipeline_name.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e8c455b0a3bd9cc0220b103fa9f8f4ace5fe50aa GIT binary patch literal 44309 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 literal 0 HcmV?d00001 diff --git a/doc/configuration-example/03_adapter_config.jpg b/doc/configuration-example/03_adapter_config.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a3fe9d6c1c970c2c5647b3880fe798e988ef2a60 GIT binary patch literal 34045 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 W0p%Fx0`(VmMbUf%BBdRq|2F}P%p8OO literal 0 HcmV?d00001 diff --git a/doc/configuration-example/04_transformation.jpg b/doc/configuration-example/04_transformation.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9e418168b1ef1a13c727665dbb0bdb430d0ff6fc GIT binary patch literal 27260 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 literal 0 HcmV?d00001 diff --git a/doc/configuration-example/05_meta-data.jpg b/doc/configuration-example/05_meta-data.jpg new file mode 100644 index 0000000000000000000000000000000000000000..80e228fceea35f8f9a62c05f8e1a156e51f2e252 GIT binary patch literal 29105 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 literal 0 HcmV?d00001 diff --git a/doc/configuration-example/06_trigger.jpg b/doc/configuration-example/06_trigger.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4032d18dc44981cdd4ad68d44ae5adb860591386 GIT binary patch literal 49535 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 z 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 literal 0 HcmV?d00001 diff --git a/doc/configuration-example/07_overview_with_data.jpg b/doc/configuration-example/07_overview_with_data.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ad1f50e65f307e55473d89181b6b50759fb45761 GIT binary patch literal 51714 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­b)&+RH(0wq_zsQCQe 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

mq_FY2Bdl<0T|Jfi5bnWHo@~m%U$aua6yS=` zwr)ke4qOG{ptg1KcI1jHq%td{nJoNLbACm<2v?<+6VuH9;Ulmddqbu|yZVP89E!8_ z{Tk5g>?smg-J#|TFHfLZa7MOup49i-V6hD&LrVU8kz8a`IfKEn;CN_5Ni>FLn~e)N zZ%y7XI3c7q&=poTCJ6h`M2EwjK=WcW%h2Ix)P~@@`IcptIZ>p@fEDL77WP%2i_KI! z2(w;B&V+|To#lNK3eERQCzJjt! zq_}cOFsyZojkqU%uC-tcGRfejtP|Di7l?0!_Ak}56;_E#b%|@!bRf7;K!do3B>n}B z^@p_<8kfs90^DEM#pZ)alFmwRG`&Mg59JEXav}2ivdBrdt^wcKSf{`z%sF1d+)*Fe zqB2QLsHBYyNhoitI}ENfn`fVbXuZgu7+z%rIQv#^LBIR;V<@|lk93Y^U%H9brv%uj z$y?wiGI-G@1tJJ6C%wL(bmO6RFqArvH`N;^yd1K$w7-LmewaSXp)9iIx2KXJ5N=_o zl^OMxhLYH%EH@tX4NJNX#jmPnsWVj-Y-}%|CpI`Z6S243$51BahT^`*Tf&E~#i7VC zpXh)Wx~u_52wix0oL42mibg1!vIzC0Zx+@ZS|vGRwE^395>zNJg_F<(K^&iKylyNa zNS<$j1wL89LL<>icuK&U=^(x>xux)iQm#ffIT50(H0OeN#mFun*pl-c_kcH3 z>3a?$gQOa??{vt+MJTsm*-Q@Q%S1&zHhJH3LE*5D zm(}l`jo?oXM2~4tu%{Kg1S)}jZN*oqncMVfO?6}Vh2Lrfzm-17PwFzj3zlZP>EUPm z`e(qcX$9@&gjj2$+qr@C59cKBc*XHrTr%e3ho9;zB&~XcAb$!je?WLExQ)-AV&Oly zNE}+e8Uh}~`Usy(=H1$na~sT4>`GmEUGnoz5^;G&w{yyVN=~t+dw8%+Hy~&#hzrTv ze?`(W2}xMNk|iv8DKN#-MN9pyO>OP&d09$#_Q;C}(p!DZtepVaD&R`O&=^GkKZ*!3 zr8AA?gIJ{!QvY~*;6pQ9I(f3U7sgoRyVmNE{jNw%iqf!fEaUyvJ1bo+kCgIWmf~rwh>9CVP zbJe-MS8=NSusfO9Y%?K~aB6-Rd=7_{r!X6*GjyF-fDyDG9Jwfoia}KOz`}Fjx;HH~ zl{lPcU%E2kr0ox$lTDM6G`Pw@nufn86L@p;lD5BQYbU_k?B*yxTVVgfy`_OVm)h;Z zCylix6*SxqqOPYDmpZMFweGFQtemY8Z?0Xvb^m}^>@XjsR9#gx@0Wu{nVU6EBn!y6 zSHQ#x%{gup!$DbMbT<8Id&*3}rqWcX9W?5Ow??+pn&!kuL!nkNW$r}rdEOlh-l2on zT|`&87-lQ<1Juj>f#oG?lnZ?JP*&n28{Yw^G-XlKlsfbCC{B4{!eJTqi_7#uk+37Q zHA=b~#kOf;skCWQOP9PI<=m-XSJV;%Sx!3hLFP90FQ9ReCGk}a^Uz3a*ajC86kc(_ z(H%(s0D<YrffcNX@;wU7_cOS333pupXp{nOwY$GOmCW?p|~UzshJZhc^89 z#WeagovEoIhA{O96_Lh|*YZgug=OEa(zflhLwJ3RRw_!>A0P?Y7lx!B_Ffy z{M5uwb3e9_l2+xAVMNbFK-fdX6}f7fOx%>K8}>T zavfj4b1Ey794ND-_vOJ7EM~ieP}04bAKI5elqFG0Q>3$96lta(CaO4_{Ns|xHaeb= zs{eZMMz#l+_LubykvvtTaesBh`NFf6II}wqJum@*VY(F#wiuQ;Ilf;M>k?$qlf^`=5?rDFq9! z)HJ4Tz*T4{@A!EC0(>mbMPV_2POEAx+)sW)gQJU~s}93%3wW{KFYNXJDfuxU(x-_O ztQ-2UaFq|&`=-!rfr~-Vjt+QMy1*v4GJ`54N`)%e(>Z5u3!C^XOjcPrufcejX$|5e^1j|sE zwl?AuvZSBk*nEs+Y5Q<~XjMlCI?2`17)P9>WO#3s9VWB(@>5lNAJ)%?)+vYh^!rto zU@PJeCMC5iZ_UCjy`&d(z<#rp623#rD;r7d&T&Ahx zYRaue&d|PQQHz}{iBc<96))QU^ijYaYV{tE3HKx7szpy_wkx%OzSS{S)YMQeFAC%$ zfsH*-Z?JrXISqU)52V$?dFNK>*~;7W=Dg-Pn@8Np25aedD7P1e?y9hn%ni*`=AuLz z$ko$zH*w(o_Fid4{qQKsC;?2U-*$vrgPE59@M$V3O(x*}Jnx8UyX4xw-l5TFVI!Ozq=Jzw8Uf8F<<+voQ5%-r)Awb?KH;N5Gzd&#q& zM@c*v!!^GH`|V?~D`R)K0B;DZ5OdK{Gw8M>O1?gIAYs&>WTuy9j1{Ot1x#Lgd7E4W zl7%kDiw-aL)XSJ}hEF7Zo^7j?wdz21udr04TV zl*f695o!2ZGreefK=*2?rb6;bFVetmL7-?`9h-*H(| zcSW(}if+6Ila5cAQ)(({gT5M?N6Vn9yql?B0bHU+^s_UG_oL+p2t$P~+CqnxY%$}pms;akIQfQ?Us1mf}*~YM7wlGJoD%39@;%cmZkO?ih0Bw&9S9EAY zwgPm9>04bI+*c?aWZ$xgyd}@z-^J}L_ZS{%YmAG&T17J#Cfn>+u8=BjY;dBT)s;Qd zo0vdBu;(=X#u(FjSOoCKWv7*Mw{`U`u>tb;eiymgZT1s_z>~d-y}rA?d^2O(-YAR8 zqqMH&slsGb(30Tqi!-?X5xWslH4wQQFHC<9(IfS~9RR)~FW$#4!V;=E(HQcEY6@3I{ zqO{r2pJ5h9d)2|Upvx#5;H9*sgxGHj3%kfp%y`tAicm)$;L8st?kKVqFL4k)=M2+O z0!Z&|sdrA%f_$ugh;_ADj_Cu%ISx$lS2S^ zENwkG*N!V{uQS^p%12^ky9j&uiX8ny&RiJ#Z>SxHczXnONzn;N$OgRT2TIM@!wlH~ zgPbEsdBY`07d2=}8W54Jyd&N=pY)ij>@tL@dY3z?LVR~ed7&=T*IH)d1Svcy_qFYe z(UCRYI~D7kh7g&khEt1ssX}m90@rgRsRr{D?O9Wh=ESoSmrtxYSs!Q+p2M6sXhwQ$ z4jM3lVUO>OJ%a8HPQQOB1#PT>UdP!}tqo$oQd6porX3j>0j*`{pGP(Nzxdi5RiJZI zpuWJ3q6_E#YTl*7;#0lgH>-517sF&P0t#$ME9G_qguNmm3e-az^pK5Y+SBYt^01Bm z{uF_Ve4Swiy){Mb5%+WWN(pneLNeWhUEEas0e>PJ@KBrkb&|YE-WLOT?vTbP8R3B$ z&*=Hv3reksq#PlfqZ!($4&RgSg>d>>@w$eKRk; zscK-J$|?=X3q_ML5BI*59Lz>$d%cdi$+*x)K^t8`c^*}i4Jr64`fPOqO0Cc8s-xl~ z{l)>p_|g!>)Ez;M);U*31(kKJy!0{GG&nCaIl}9z=MdefPR)0z8W4>fd-NcdZhx~} zZE0xeTNYtQ#@aX*257ejR?N^xV>wBY(LgjK9|X%bJkI`?Bquh&|xA^Jvf*+TpLemQM(fD1u>xV`;%3q(I z?b)LaDW+NhjGTyHc9QQ%H4xK&|JL2 zz*@2DyW4mMzfIIfw}u%xcwif6&!<1k_e8X0k9%`|PjxmSRmwcrRf6MZgC=^fAuk=0 z)z?=&lcpXZ^x@Mer4y$Z*`gYEjQ3mcRo$9(TTF49-4wO9J)Ks3?bqB|IFZHuHs0vQ z8eF{_Z?Sp^&UO71H?lqVE3So5h~G5Lo6lS-ucVTGjA@R(575xWz?&{rwpw-g`8xMG-m)tcu=Vck`u+!L0xgI0s8R;UlJUeRaw-*qlBC7 z-kc(%Ipz>H24@YV7J7mB45?%DSF5Vi`_-y|WW1At!BV3=qeAGiWmswnS;~uPP(;~Y zSr4B`7(DraX5>x9pa?bis<_?4xgtg(L#lC+%Cm|R7FlO^+(il{@Y4|7nNeJal}m<# zQ=cgLc(Jt~MO%wMHZJCo+cgFQM*V;stgCu2YPpkK9}A*97R+ffLe^zP&Y~;MlY(j|{0LmtO!c)^Ez69b6=vE~E@C>9^7@y{xAR=s__4 z!YBF)iALuJ7f71Zw@&sLS)9WSvy*Q%@0R~emS*SK4FD0+Sw2@1GZFt&ce?rK@4S>&3u zYG^HrFiuven;?K2;w59~*uaBu53u57v#t}DX^^kfq6RH@0t{|^e@zb)py?sfCHKrC zDaIQG4B3XyF%uE?1Y)O)oyS-Ia5Ts7=~Mxy`==XxjG$P_$Gqlm>1b0C*BEqy4=3R- zFMTH0Oh#6l?FH)-qREK0A2YfeMF_h?G!4Tiy69UWlB(-R`QDnI_WSL+o~O}4Q_-I7 zvKy`Rl|0#ups%?YaI^mA%&+J5TNfKy@mDwW)=usWI>0MmE3Dw9C&}31WnT(nek?|2 zQmeo+bSFjZ1dFP-FFoj2eBEHyXSp<31iDh&I~Su=NXu5L%vM!XaB5we|le~vFXQ~!$|CIa(EK`14^E=@(bWzw0{G2 zZmMfaNN^_u>h!mxR-e~=i)yA5MLjQY@BKGNr;~q3pQkRD=3-<$z}&yGCPQ3&fT4%D z27@eu?Dn%kOY{AsK<*oF?bC7niI*l!tLAi*Fyev{uXPztMX#k}4biNidN@8RpyGsL zOP%Jhs=>yvl@h$=M4gVeh7(2yuYrEoYy9sW+8s6}l*P!9cKlaL^lu`HPJ)I+gcM9P zTW45=gi8!`E&D*k^d%k}R@tol9V>eMc(SH?EU?uIUJhV%5oX?)uFW3}>;=AIqu(

T$L2bvsze4hxdmZ`jz2bdzjDwa3y=E(azJg-nig3t2!XQEc8h^nvnf;7) z`o|YExR-;uqBc*v1?K&)7hplZ0Di;@eeJ_R>Am&Spk@r3R9@&Jx^dP_KhUk>8(HRI zES^9ZD6bPMVW@-yyvf{t0#CzhDnhNIF|}8pN)h|SE40j(m6?TXL1)13(0H~V-V$#M z57saZnfS-m=wA9a!#*9owvk1H^^Kdi&CgGTLNufzc2Ke1W-nxSKWqw%ao0)#jJtyx zJeiCdY=l+^{U3{?4!WeKGtDoNrxeeTZOH^pNYoh(L$itNm;IY4=U;C`Wbcb-OFVzO zvd++_JFdyk|2{V}+p{`560lEoqrGiuf5tMD7<(BJBt=svgmMr_`wE*~l7%n`SLxku zc5(UY0|_{})s4tyu3bmosLT64LQ8j~-GIX2^=p${67&MZb{%@SXE)T6HoiJ=W>6bn zu|3D1^xqh${j})!WBj6)P>DV450sQqpL3 zVkF?;dt8_S*-T^eVx`MA+6m$F+H~nyYRZXFzHyxB+P!aZ!p9wk&pVjW7Ek-EyiMC< zJu*=u+^8m>n#c54jaieD2vmG+Dxv@5r2qDH(2ho<_X#hSuH^ejdEGQ%rljMiamg`l zbfhsS;WFAA*X_}274y0LF=*3j#XzN=iP>g~%Ch&%7%vY8I)`KQvYZsaNu&F@537}t zuVtI_DDE+hbK~IJ{F{-O))%s8`f6ma1CbiFAxQm`a07R7tBu5TDSLg)dr-h;gn2lY zq*FN?7K_}i9_HxPum9YIBH;r`$|JC{L0|NZfT@7-QM_;6^)VqZ-mV829QCP(LDK03 z3{p-;Y}(Tc59>>Xxl{XZ8>ioFspj8~3Vlx7mg-=v&=4tiO{=IeT`HD9Zkk!Z1w>7a&E@7tfY!g40C+MvvP@i71}exRK)s_HR7a z^^=j5^v&djgCE;LLdy_B~@dM9P1BIS6 zD73md5|CG7>87K;QQ&NYlq^!f*3t@`@EL`-BH*Kg+lxU&L?SDkJ4vTajo^yvWK|A3 z#p8ASR2=2aawROS7AOj*S(=M3KL9lq)}8i~s7}SVoRd!F^}($vG#QqCocVkjX1l23 z)Nt_c)gKjm?pW%{ibzj0^jPwkoTuA7MVF+@OOHYyS70;|crG{>l5`i8kZA3}6@5#f zcX`Ftscmylrmd})cC?-}X|F?4C(Kz$fT}GooH#Qt-;tyEaBwA+_*;l3+DUDHT35Kv z5kkv16!p*OwjXbIa~yti{52O{!!YEDDD_PvG~cM--~*a_hZlt&Tb|*`O#QfA90$LLt#m%CMAbxajf8cbcu0RykIr)ul+3+e<%z{yO9S?VM1q zR%#n&Dq?n$q&Eqx^)f_Uwc&fvdJ!+fhX8@gg`{_3+tXpd@9mEQ!lJ;e>nyw^NAeuX zO&cNs8qf8Fkc6Qv36cvZ1eXRSM8t|M1q@x!^y}d%t17I)=`5-PT;Jmkwy$f4HC+r# z8QU?uvWr*3@21vsI~LN&PJ^qVT3#SxBSDGx09imL>LG506aZI7a+aw>uz0ZKXy!3{ zj_O;&xp}WS(^@TEim^XY=l>CCpnp|s_#I$_|8VWkh?W0a@GArt@PtBYh_^^yVH)v; z^08+HSLGjJ3a z5x%ACuhe#Gk-I1GNyZOto+2b5lQw%TB?BxUTZJv}oxGM@aen)aMY;nf(Mv!Mw^yjq z0wFYhYA|h8Eh-CmB`$9iixmIippgIYIsNpE3Htwn!!Q3CH1?Y?VCQf106t|9{GH;? z;s>`D2(Y-y9ix8};TU8ea+Se%U}PnfTKWsXvL!*h*OF}aUGHAaxs0<8D0N5_-vedG zekf`HyuTdrK)bzSYj02Mt2@TSv$--e$^jA^>yrTpRb~_*QKM?tijlvWH6Yw!1?e30 ziQ=4iu?FkvgIPmpw63aLU2#LrUraXH9SI3MaPv{=)gI!cNsSv+@{m2Q+ zJJE3J`gtParR3e{FQ5@@qYwbREG?b$i;Fg=(&~-Y|NH~_ztIsmxpS_da58;-XdsMh zP-!E2ob=Sj`V`F2`CHD1+wT#yBOSVl3G^cro_rvqT;j6HlIE{WCAavXCDSoFHAI_X zHN+8?xkYx+Wegp;_jCr!TnB=4hT1bwpm_#T7M3B3N2rZ#be+}bh9@6hS|nPbJ_*bj z^t}KvKEu%NTA6|AU?Q2wLvY;Sq~W_|P3`m_Z<||ObL1B(E%OKk(}vF)F@goiql^~q zPp?Sj2Sn%>d?dJ<%Et-rC1P^nMs6{YNwyL>91~%VKSJS_xVXy?-U?6KPwLE4uF%fm zynl;-GQbv^X_Y~pT1op~zW(QJ=_hCXJr4czn!oMbNYe>^P=q%|qaxgimwhBx4C_EP z(^C4K_c`8ValQd@R2q#x4~IO?#Y4{vM80Po^97IT9U9kuuRgcmB&PC+FxS=BE_d(9 zHF+iy)1R7q(AJzY$$zBUpH zdJ1G&{5be=^5wjapBXXkyQFMRB4WGaiMl6P!Au}-Bdd7C!1 z%3A_gf>)nRO#?X_a(k!g_(%u;z@(G*+%JF;75lqg@~7adf}gLx1MV>1&C)_2NGUd-!+a7f~lI9##C8rJyCD5X}luR{h#4$B^6T zqGH~up6OB-4;F7SOU(Y^{-(_wQkt4l68hmeB52*)Kmmwp!I2r$6cob-!cMLJ z^&W>$USD%=P*{HfkQV%#KL)Ne|8K4+t?u3h8UDbysCNEef7*H@%Vejl8upmusM}nK zt?|R`F904l@*;p6kN>gik?Mj&@c`V6+QWTk=ngS;JC#3dq?$7gbzgZ5-!vBPK z|2-p8|K8faL8X@aJs(PqO!2ejR#yFN)c<9w!GDc)K{p^_YO@A!1=|7`)rWL)vAW?v>HXWeitOA5gI=jH#4yP*_D1t}n* zm*OL9{q_0RJPhbQwboo(0~-HypTFJ6DF5s~d^&tz2Cbc`mscP?_^tW3<=k@vbfBFL z*zDT!)vsO(XGLyL`bC)-j-0;$TruU@A3oG%e(ScvAe;naY$HWl%yW4>=~*(#%#f+OjL}A z=|PI6hr4p?D7a3$fmqxN`!FsD$*3JzVO-UFhPtf!hsP9+-|Wpn^>2oe1l``;cH{l#G#)%_2sHm@fAGn5d@e@D3T*TSTKf>1_1=tK{RAbSxd9xo-D>q#Dl_N1|9zmOzDR0!um=^2IQ4)T;8dVWHz{$3831T3W#IRG3E+O z3U$m@@T&R)Y3|>7`XVKD52b=-q8jzFcThF%XzM+jb)>8Cc7g789k-^L2^_H%Yu`z# zPrF0>xRyKo@$#xRj$RddIBloi6YfK<{`p+B-r=_Hi`_<#_pZ-|5vSe4RQgT$Z_E zOs;o`dzKv&(BY!YP!eb#%UN~d>d24KM!~A=nVn0&KYa5XtcA;m!e^QUFkct~*IOwp zil%X_9c8Ml@b0>591Ff)XmwNwX)@a%>cO^X#J_ODNyHarr>kby?FNTY-7r8oFLj$( zy%7eSHUwZNX;z~~)G#03z2iJh&rqMaA`Y^=v#WW`pZ@!pt859-@M1BkzSGc%CJjSkQq3iGVx$xA>}+fVhj#K5xeBH4 z<=IoD7|$Ri64L62dnkn9__T~nIqMI_Y@Y~Yzpbx}f$v-4sjLgok9E?@QIQi>)e^Ap zKWIo9LdlX`KO%CBU(xo2LG@0KxAz_PTX0kEIhm5pMK|pAI?HYAis8v~^oKPNclg1} z+f4lJ{CUjS(k=}}4-*GA1IEUQzFTK?Q|GqL(F1Fx*2pYlgx!uK??+fXLAOl%`<7`q z{zC$$*#{KiV9*-_>*A+=S(PT9gEeZ5_#xD|q>f-?MA)m*(dx*{w~@OF?G53yZPUa< z+AkbiO!#)WV0x`}nxLZyh%8kVdQep7WJKcem7NYY%?{s$^(E}{Lk?c$#O~~OMb09P z;C}U`RP{xZj(NXDgw6rp#MRp}l1gfKDGEHsW}3)zGw|YrfI$MVovl-OpEhHAo>~qNqXdY&ynbdb04A9SfW#!OM4ozi8@ufa{-*L!W2hs zp%Hny);j5{*4X3B19OJ*G=nBllz7s{BPh6ZR-_nZm9MVKa#J=H7G0w%gz=VD+Zu9| zc@gQ}m&U=$vGp2|hJFitgPQGm?jw~eSIHeSSoG!d0+Sg>ub|XH4TE}e5;cSPH}Mf9 zAq^K1jLzE65w?vfQA+o3Q#J9idb=1?lLUh#2^{!VLw7CrF5{nX03ZklRV4^wppZh| zA3Vi(o;;&_)o5mA^Ps|Dd~%iY}sc z8G_c<1|;sE{~E8;k9M2jb7ax!X^e1|{Weh?-nO3vi~+##nr;HC@9JAY2}%Xl+G0|& zs1;eq8z}>M<;houY;c zvam{=Rl9{gp0aQw!~6t_HI%ty|ulzRSjr~OYt;VVYX zXMvo(Pq@>(c7Ej3RZ%I+t|tDRAnr^o-PLfRWOEJHn8{S8aOa*|FDDy$Y4G}b_2;|d zvNDz;FXpFl%*f3V$v6k|TX!DqaJ|gk4*~RWx&O}F=#RX~e*4+-?n_MjyMyjY=qdjT z;8T?UGWQcu4DVO|?7voZ`&;*hewwj&Rr-lo_%~=2!toyrMgKKS{coI^!PUUHd2E4Z zPome>jcOuuDL?A%u}I2y$76DqXGoL~?ifn0KZ>qFSM*pxWy?hy@}BmGpWvX)w1F9f zwm)zFxe0$-!hfqfRQv*9$Ab#T*gSxe?%$A~>G^MQD_<5+9(%v| z7has78>oNp=fB->{f7*|{@iu^-`s;N?}cJvo5{~go+dTQf2!76|D8=q*njl;KeNC; z)Uo`lS>V1usi+k>`~zTK{Xw;C+``}0N_a4&O-pYL8N?={0+Aletcz|{p3dclBt5WPDj1kO&CO8^Rcjt zR7)KE@_<>Q$AGN8vl)DGQ`{R7y2qUV&SE;HUD7U31TxA8mkzkEdAk6-is6}inw@BB zR;B^BsuU#znDJ3y_L96n^V#(U8}29$`V-zv>p_|a6tN!!XTF^qtoG{|26J0N$t9`i zsm}I4@_w3W3R-+W9@$V4z)(BQW|47Kt5#+&4!kS#zyD6n}x~qjtm3 zeI8Mxs@*kr6*Wo5>_$IeRUrWvkSc~QVw*g&^^vaHW}{*sN-E>6yU=j+^zwl(RY_nu z>;Yj1agIx0ZWb=X7JE;S0w$e1Rdoj&#VOHihkRAs96tV`I?JP@BTPj>-dGJqLXb$P3-2G+&!cL}b^O&MR9v z;u+exJ40b~a4>6$mkxN88R=t(tV0SB zQr}h3928It@6g{O)zyN#*X|&%Bqq4RLgam$p@r8g%5f@`w2DeMjpRLam9CD-QL5t{bF(-X}fflI2404VfLzRkR$U-wn{NRdh(NGa6o%d$H2=;tv zR|?OoYpC?{4m6bHH< z2O5c@KR%Mg4F#|$t5vyH2|QhR%iG-BM3ssz_2P_8liR0>k33kfwhcs|^^$$ z{BEp8cSKln3vMYp|+4f6i)A-`v%deTH$>1evI!@js{M zCyxQ><>%e&k=x*Px%gYXI=B@adQ2NS?R3oMly`PU%f#RwD1)cxn3L^QmuZDUkaQTb ziz>A&XPMeUP8*}&uBxAzX)WZ4X~kNDKD(k8awNoyZ$$!h7?MMqORV!v%=~RUCx8EGK_0z5}IcR{Oqg(61d*G=B~}&({D= z0~tng@30ClHUDUXBKa05PyH6GntapA5g5MZgtZl6xa1X#DgzHR<&?I8hf1K$|O z@nX+0r~AtT1Nc0W>HPwCH~w*=o{dgDQ%tesZR31AToe6pDbj)6;WDA{Db8=FkGkP) zc=MyP;Q`dY{!%i|MN#{Mpqk$?!S?sYk^k=c|5i}xUz&?LKQ$fyrPTyQis361Syh;o z9kVq~T+iXwH%H@pnmaZy&_UPqR7*S)FV6 zLsj}ZvXaSraY7`aK+h@9Qdj@yR$j-eQR8mTupeV~({>z6U{amfXx|}<^YIbpqAPAc zwfdWFGo#Pn6J1x4dqgt5Z#wpj`QcE^3B|48Hh}uaSwxjFG2x zP8#<`IKX~|&3Ar91;bc^8J>lboF51&cvB`nj_#S7)(E*S%{|~3ST^UMO^rx#glb(< z*GUrW2V2UiA$83#8XRm0wtK!$b{}NGah>9L)=Q#Y4rD0$ftxc3=KKr=O=ltzpSvnu8=KRbLv3xt7L_hj;H1bT$ zthn2s*?wehjkKapq`t3W*JJJPP)Cwh(ZnCsn-Pl zFhGE0o*PZUaLadcBg=M4ma9oEkRQeK4Ne7u$tVCW=qO0vt$Ev*ci`pAt`FI=K@4&@ zHP|7xcKRdYAO{Z4pvXi~469i#Z)SBBK~?k5fj)W2!=v?r-smgCI4}nr6hm=VWh>TA zJWAYCK@7T+1!oc@;_?r@zzuen3Hr_K7M><#($bvy#&RQagUa2VDU zxV&k|ST~PjGX?#yNQ}{zFSbJD0llrnurvP3zV@DHJ-%o=@o1lupYn%OshmJAc}ANS ztO0q_HDkiAdFlxR_RN=hi8!WPP_-2T1FRCW!QUjX(`RB;^lPrgv;rSp4# z2o8+hpEv*9gg-6ezttUnith_AS-TH6HlLt6SI|1k+Yd!HhnESM9gRIQOzcT(AH;qW zko{XtuD^EwpREC={vOK3xf=IF6*}JX|0Pd)7e12U!feuJ2<%OUG!XH?$R4qjb%&>J z%#{7vlK!f8M~^Dt&|%ns9xg9G^1w$MBG|hDoBhm3VP_Jfzg`cupRB4(!g>yMcOQ#w zTI3_lyt0zE!RoO_{JM^wl&cK~GF3J{dg7}+j?Y^`#|&P7sAKup9_D{^?@yfFf0EMv zFMy(d2WLljui~Q%>F&dTwbq#q6~e@b;2QVkIo|mNpq{E5J8)E_xo3n;%{83pP)Jfr zda{RE`k+4hfN(GHz#xjW6%DnIyVFQ=9PuohZ_3;Y+)~vNcTTGbR-#y`S*%( ziQ+;PoBfEvXAwIKvo4#sCvJX(ZF8}ok}{TC(zFeyn26Y+`f2Ji6CB96hqVtZH~l+t zphlMukn$ypbvfMec%|HUd0?k=5+vb0SlG9uTmQH}&=P8DGN7R?P5$DFEs{45gEkgMbAtxO-4E zP6z3f7s9J|xFKQYTKFZ?AG_Wf$hKCh61u7(gRd0M}eU4xHkqEDhMUBxlK?5vV@AFN1gM z{l=+!yulpwHhT^vC^#v7aX>Aws-0h7X+r3>)&r9QS1l(5Cx&?gC2I*0AzfYT-8MwE z+#n3x51J;6D;cz``%HikYz_B9F#W4_adO$JjgD*QRl#k_e6EY}GrsQ>7tg+mA8COM zV=G;OuTd;d&vrt;jx?nv4#D$EacEJ(X9py-pa#fJ0$e_7@)mfU4eN9^1`67YP<3c} z3zqFF+!`a)Mpd{P!7A3uhqZ@Yl`|v-7I3&rnYSV`qeKZ3518hq6nor+#Z++rhWpE zg(b*Ul(vpMTGi>~`of%UaSn+!3w*-iga&G_rX4?R?MN>_4)oQn=Av)DY4BOM9e7-n z&Ks)^g0$6YNRx(BM2^mNxEob$io=S#qVm3$uyW@zGHOHq(ey&@D>8Aw2z>MmlAM%t zI$f-7Ue#$ObYY zd>{u0qLfQMA6Q#gekeX7K8`@NpC{8>h-m2>0AWc2!@T{ zdEPDO&Hl@{`k$xi-*tli+}`-Br)lC%(5|;V(&~z|X=9Xfms{k@Ik_qO7VHK8({Ugl zNutA-ZsOrE&QK-CbOV@=$&6ozOoOQ+n%~$Cx~>5cYGDt~FD{ zqPakchSK#X@zM%BSXG|pTof#Y<_WMVEW}Oj*+9*aC_~Ut=qZ*l)uc$fTJ}|Zn=ZELcb;KT~mtXVOH1POWAM@ zlP{*gY4H|K8rsP9)B(m)GzvZIWfkpBecd$Xbo>~c2*iB`lEGG8>fEctB`6=BC>X7( zkY{OG;A6J$<5`irYst8fId43hV3y{M1cf;Os(p^DdhfKU2PyvGU9zU9zeX*ObH@ZJ zZ_3WrMU4Lt6W99sVK1oTbXezm8$I0Qx2p=E_i!8Tb(X8}ElMCOVe&lx>e+c;+KO#%67E=-xI)M!+D z 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%0AtYLG4Ks8^=96@0+QIQ&DPxjHrKPol4ek# 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 literal 0 HcmV?d00001 diff --git a/doc/service_arch.drawio b/doc/service_arch.drawio index a9bd68fd6..4d9debe9b 100644 --- a/doc/service_arch.drawio +++ b/doc/service_arch.drawio @@ -1 +1,12 @@ -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 \ No newline at end of file + + + +Draw.io Diagram + + + + +

+ + + diff --git a/doc/service_arch.png b/doc/service_arch.png index 3a14992a58fe004480ff411091eee9e1788cfa4c..3c77bc397bf77492ef809f776041ba36668725c7 100644 GIT binary patch literal 602913 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%0Diu^<%y-|CBFW|GML~*`5A&-?Euj85IjX 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

-E##C&+V2xIXDQ*4Eg=Wz=+X#E(EzA5?1VtWoZu+uOK!b?8dUyb2}@(rEPwZFkYZ)@(Y`s{jf3L%a@0<{ zN6FkD@5bphFWsC~Xqe#7IVFVo!J5hwEK6G|Q)qstv|{t0zTnjWOSIg19drDiy zm5!j{&}Py*{jHp?epgZk%PWA|m;6Jx9E%w$QiEtqXASP5`iuk~mi6In3*jP;B=++z zZ$5L?4Jq$V)Pp|fe8LgJ2mb8s=rUwH5m(#RC7jl5$^>(Tt8c>A(>r55Q2=s{xj9#D zUpQnDd2ha=bk9IK&#vm!l)n4hj?e1-gH-iwuhEtrOtj@5#xOc)f>^D`>2$N0eSol2 zyT*B?Pbo>pbz0?%?hT}T0oa7)+CCovTG2~_R)_YX1nr*JRbQuhDc5Ds0qw(4h5o=j zZYD}p;Ui5+_6swIl1yQ4bfEAy{#@E=|1|t;j(s~EE&R(WNb@?dDVw8P!JFZO9k{sS zWT#H+c^}BeGHVHAL@8tcBuHbg=6IDhY7bZsU_`!B9_{zD4$_$DNyYbf0eyj8f6rl< zM^GIQmx^=DEp|j0+fR_65I_0Gs#nWdTN`oWZ+4wN=O^&-O8!k{FSKtZ4XU>G(q13d z!HBi`2=Xn-{#qw9>SW(4RX5j3Th!kB66amRR%~Pef_T!bbFRO|K*Yh}JFZYHzLto7 zTis)ivCM#JuD=iZpx|I=oUACQZT?QzDU1gD=i}7f%zXe?BmWRf^4lQi&_-#W7!=5P z(X)=G+H~L%ABY$JJJmi8vH0tmt$h^XpYq1Mh45_ATl3uVzr4J>2ZM$2#=R_hQ82F{ zvKqz3iSsYB}#{-aY zd)~bP?R8-DdG8xlMz5dmCr9_6W@!-9x%@wp@>!)i$k95&&MXkG^i4msQS!?H3m|XYW*ck_k z(Zl3yzdfsCHvC>!nNI__<`B<2UebQBatW1Bx}PtNt`0*ZlI>#OTmn{_s{{35@=exFTmIuFI{-d~wFM#S}VC7`$;kV%bJdv~|O2`qTxR&-1 z=<)MCf@6k9J&(2D4E)~efm_k7W96(g>p8yFQYS0N(U^MoQ1GK%30~wTqb_gz z(57JfsQf@n*TTu_sS$udJC!IJlJ&;HawJP;rsH__pklf zF>vB433_w+(;Jzscuu*NYq&z=-rM)vtrLWc|dchxcZh-KgaXX-+n85wew(KCGsvsC!qKf z-BE`{r&j=t+F+8dG`)<9*4#VD$l zKDo}8os|82?dz<=*$Ix+hewaVBQBQ$T|)Km+zH+n-&VesBu?S$Tz!*MDu6+_ zC#U7|IuPc4$!*G#QRzn!2#Vc z@avoQF}f9>m?>r4)lX_49)NX$T)l@KC;q6pD_hqlaaZ3+L2#qHK07q3&O~eiMUQS4 zyt6dFW@;(t;MM#j3kOi!C#26agg%NFriW?9y}gg7>Fbf5oJtCq?@~f?H|!7Acax~E zya+ned1zWO61EfOPCNso`f-%60aQN@pA%1fl%@@FtUH(P9_j<}nD#s8)T#I#s!gaV z=X*mqwQV=D1!vA+Lb*iIQubwe+zUwaTP1C|>dgLlgARRq$QJw(^bhAgb7@iGBB80C zTkNyoDR{?Q?SNXzFQxC0R5WB5Q*#T6gx423Ut+g*fMGO#4ekkG+?#r_k9S3(F*qU; zAm@ta{AJXwkI$uBoJ(8JE_=SGJ(fb)9x%G#$X)!? zH+yjdsHIYsTn~W>`3AGzVGH$>zW0cIpuaMVe`fMGuJw=QnXUI9SG|L$TrITl2+l_& z^_E{Ey{6O8?4@kKDK0tg57|Ab$gbM{+!e$9Vji5gkC38gY^K~tZT#$^LwY(0Vh7g> zQ$^Mw%D3+M=B=}qdfQ{qn|soMrmbTtpwddOm;IgS=*V6?h^>O))n@sy9}^lF-j<_2 z?osL>2jxp3Fg4fcICkZDsw~vHpmR7iia76T7V)TOoaU%vbWlw0;M4IL2|#>DF%>Sk zdmozF(~m}e`!I;S?6`t4>VB~Clik?^lD*bsp>e8GI~J<|abI0naG~$(Pv7RCgt4#p z1FVKTT`VKZ(n{q&WPUtO3DsPJ!_w{JZjWzbm`4~gyQdJ1s+zU(p$;bH=dRS4{6|d3 zu%_P*K#cJtT1>o0#}d(gN7Z)@{@ZAZ7_JXS7rrf74}I}0M8YAiR05XocX77c&^;xE zRp8abaO;+7Po#tP+cQo9MU&TwRZbA({+>XBu@S$PppioIg&cHMf-tdpiV`;m-f-xR zWF9&Z8R@Tu1t3<=k>I0A=T})Ibw(_mqgrtrHXI7%Rp-`?uGH1g9}$uaxIje{^6TT5 zt&t3UE;kD;mV4Ynd{G|q*!2%Na3@}ZX27Vh-YFdu3ZR{FqJkK`Wc@>y?w9HS!}fe) z_80{z1o{~?xYN-PuT-N!6T0U#d zb=4bgooArQzT^+M`(u13CSv(W>kEc%%cjfdy}&(erv~w6I}6s#2Gp|%V~a2@YMo3C^_G~?-d=fI5hzShnd6>r^a)5Dwp2>R)JIo?glIYr>q z-FEv1pg*eIo!x@??33ihy86HPWIn1-6`-yozTfK9QAf0zNrJImPu_6l42F+Iu{v(+ zzWiKDmUG8oRL5jWoX;-}Kwb&r>3KxAL5Pwkk?NMK-L_Bc25}pAcffF!PjI11esJ)a z1)FuJRLpi&lU$yXuW|nN$94QasJ{=z{`jKDT-OE<2_3SlU$Xe~C$qC2)zF?|{mB{2s=JJYE3a}Qt zzcVk2EnY@Ebm#-X`_5VO+u{L4hRl(*>XV$`&QE8?+`?^$;_hFtDs^Iep!RvR*c;qn z_s$wHanai-CBpWta?Irgw`Hh+zV!95Y)|aNT-TP5Z#;#b6|s(Ru$Ot8fNt z_Ak{IXsQ{4&FfFc`BMQ#eCb}g`{B&Ud@KDM4PV@FNBimHZRJ`_%w|rA&lfy$puF6# z6PG%>7FZV2{`TDX;CZd*$MSmG zS~GQDLh|$QspV0bRLV>}8YI-Q`N=;}W@LdClmA*_%+uiGv85Sl%S79oXoe~n0y*0w z9uVJNnOy5n@*q-=BwMV-x!1kBTTXJ3#OCnZ+eotgAmR{oU}it@RZK&E(O3!^FYfDN z?h%cW#qSLK*sGbl$LES{ImS|8P;p4nz&;kp5)ON%1`5SHKgr1hV)-G~e%-z_4Vs_0 zo=U0>vMFBwMoRD3bJySMJaJvBXOie;)<$1{eAVZ7o`BQ$P42(Y3O{y$H8QMdJ2=lO zdXU#5X`^psK91%Kn3nr>O!<9vND zjTgX7j`87*!W(cBeYwFsYu8AOKb3hcPU`H1v%lp`@=b*&=bc}0hDZgaIxinntcCbB z*Jgc8jEJL2n2ujRB%s#tB|1{}f0!{X~} zhqc*V94#zUljFJn0nI7J_Tgg7o^Z~mrnlPs>{x2A(b+yS7hn0hZ@eMWvyB)@go%}+ zoF6S7yYj`JIK1$YXbk_+bY4xWYC#nKO9%+~NJb<{#y61+N)i-*{awtdTQ%p@j0q&{ z-Mf4Bw}P*m=4*9}Y3HyFJwblqr1$$>+u}-YAgPmnJi?%?q^`p}oR-OpgfhD<7$MC! zY=^~CrH4FH9^uzqem~;K3M6i&_va0>WVnFo`(dZcJs<$tE2OWNP&5u4*ViQh}GQ?yN4Izeuv3QU@!UIdf9 z3Kc!_1M+B*o@RL9KK7;Q{HHo`pc;&B_oj6(I+LxjCJ}EwKP0};0N$q)0S3Wimcct} zRx2vePzzNb!%Xj>MURa!_0qVXnPDTihj zyvTF70UAwX9|cr?4`gVqe>#Rrl7@#GlowGZo6}(pG=5K$rgI7)uExv2U0VbCi$o)^ zWpi6)lm4q%aj9S}|JaP`IUPa!*w5*<={r3UJsPqZK>D%W?|qiT^!@4Ik_dkAp2_fu z_i@3DP0`m6=CJtQ=g{zXm-C8fQ$Yy+s)>_bUH`_kl3^_HtlsLlz4%-+n z5T}~$CWY7MJnI-;_g;Ny4$YO4hNE`@Jn(cKf7JUrreoVoITFf$oGX6Y11ya10C=Vbnp`+BO4r$-XO#+w!9_Z411 z>M+DCdbtq|ehnf9#pS|O z5P6DmtqDFH_1HjFnT)MvkHK|yD`yvQj>z1us0HIg#?wBG`-k`>n`s0J>t%7eIjsxXQ0U_@|j5CA{@(>cL?OI^5hqe^u(R zp!10Un~MLvEEGmIy#2vMQjcz_PXUbCQW;t;&jmbH#Z(t%;Yoq^@ESs0H7Sm@!7svF zM8p0a!|+JQ2jG6zMcJ3%rK83T`@Fz@?uq2-+j-8B^vj^?+r-!TZpGq(ey+Fef=Nhv z^)Tn_Bt|NKeyX(>Q=??B_$>USU6VER1o9fPXOQLVFSb_)`-Fy)@jZN(9{ShNNj02R z_pIIyk#=vf(EC)I_cUF;~A#AM1yqMYZU zq5jBm&L?J@YJT8tz?{zgdZ8ZTX)=lVgo-}Qx4RyZ)a@7QZgissgj_l|luzMpkd*oQ z9MGxU6%58uP1n(>!PvZsddfJn*il&Fq24PTNXF0B_r${J!>KD7grh$B*@fx;V!PA&}1>##Zf#)SNa`2#YPlgl*?Mk@na+Kx(T{H zoE?wQmPWvMSU5NPt*SzwqTXN1`&?)t{4zsVS`VcS8}(c9L%!(n+`|@SfWutLd0Ow^ zscc0EP=qrvFl|ZoFe-fYSXM`JD@3}wGJ?Zt#8589q)N=iR0Tv_!r zNt>S`gBJS-T%4|I;IddusPH7kE{a@rd7ZC6+yz4P__kq)U##K7Kgu3Ni!3$qx6Gef z`2fY#l!0Q0KGHHjU*PC<=j+X0Zta8) zPJ%v26J7e=lT~{ku;7ngNhTetQ*jKL(y{jpqOouCYtFBpiyyBC-GGY6)j1oi(nsbt zASaUp{4a;UAOX9p{I!nWzNfBkI{PxgU_gROD81mRL3HoG+0CKy!e0$nL~o$>@ayZb zuk6j(6SA`(J$g6m%QQu2Ahw->wj1_N1t!wr{cX)btqvy*i+pw+OvD=*`FlU_KH%EP zM16HMz)QJDT!2?Vy0kzD^9Ab1xq-xQ9%V~}c!o8OoC~DJk-yz8K_y^vI(Vw0FT+{P z(E4aY>H7SGU>;ADd%Hw>xy*kJOT~iH1PH?>;YFHBHQi-!hT4%GS+b!sG2CL`<9#tt z%O@hB|5m{FR|g?nNxk>Lf{W!jc&=~wshrpL!I;u3}CKJcUOpD(~@LX%>v{?G{C`5kZKe62GPUWd?pY5|`nO3@iXl@_!ZoV+oIcdPV zY{Eu;R~F*6z~7ZTkAbQ3ivKttB1xQ2V$s&p_G@R#+(nXwXoHAIS2adpp%# z+i<`geQbxKl&}1|&}gNXM>F`o3Ap^mQZPBuBeDe+$ZS8&Rz|HM3X>;Cak)Oq+v#|J zf-K?LPD5jSgxGIgVNWJzRknYH&qAF5UD-z46!yT#mgbh5X&5L(CMtA~hOJ(AGLF^D zLu&H2H%&ns(W2LqnZWNihI9ZDhL7608P)YC@#WXZTa@SUSz3L0#LS>GbwP2!pTyCX z@f{RB6TB~OkI{&wz2cod5?d$xR1C$cR}vLqna%0i|33WoRh*Ca3}JGHr_GtVXZsyK zo~9v*sE7G+wJm-jJij1Wh4upGE+{k<2zZea+*TMLrcpH+_dRpr5vA5u%qL<^eK~GO z;s_6Cq+R18D8`Z5zY9~=YJad--jjNRYaDA|uN<&EK0WHJCb;h9LwwXDxK{dPwCUDO zlqOG~{hgEY@FH8s@m;6rW)Q#=yt|ggMa0#GeHx5y&b$A&^2U?ca4l_Ti1tr_-EB_7 z4#BxKlM;r|3iu%s&VvG|Zhd-mtrB^`1P}EhJMh4O;JxA%Pb)`Jttp~S@m{hyf9P4l4XW-*?B8EReX z>h=BkL7CH9%=n~%f;)QP6WtovTq;X`b(GtdaihRH;rNsmh4Y{teho(!415aY=+8&? zr6W8&2>G&~Mmt!o%O6m|jDFOIYYyiO%#PI9kE!?kT&n?>;BKSay`VhDJ0@77Zz0g( z$9i91?$`vSsA+nj%(Y|;Z$F^Bft+%A9!TQyeM#bW5~2U}2k)(x(?FQgLFRY~-V?+1 zN+1(tF_%Dj0_lYd*wcPQLPc0t?w9_%JouN2JYDkgK}ddiSoDiDIV~D_ytTYgv(;F< zmlB~V_2sQX7GC~Tf_>?Y`gq+);`MsPV)W(}bW(0| z;gBPH%}o8*RTwX^`$Eg0lu>@aVle7!OVCEi`kGbiqK`%}LRWEcvk-HR$){wrS_n4WERW#U_k5X`c0bLxObE?%>!a4J+ z@k*KsQmVJa?ZH)Ww|rtX&hkE!DJa{<=i@IgS8rye_q1}U!vWyK3ZRMM`RtGML2zGr zpNX~4lfa___#YP$Ed07cb?)u%U#+1HE*MjulQ|;9f_cyBDlKznlqsL*Y`f%MR9IiJ zzlUFu%WM^`NF>gyU_RyF&5KnZcY)x}i9r`X=;L6a48KQXkv_E-mb&>QuSLSd(`h)p zU>Fm;E>>9x6-gELMhIsG0@U{!GB;|lo?t$6bFszy7vz%*L!aC-wIQ$Mgslr4}M1h*X32bCG89l@5YQsQQdlaROjCIvTq?PVg7w)ZB%! zBVXwr8$4*myOtl+G(G$kGo52ioSDI@7Ot1$_EafuBWzu@y2@(FU~UR#47|gWe7-(w z9^I0Z+C=>f(30$o066*B7^tw^i?#QGEPZ)dYCTRd9v3`Iu)9}?G3$P1r`KUQN$`Jo z;u-w-jCMf#+VqUm@{2wMJcL5%i@)&^ayUdN)r$1KoMSxRY9UQmo$;{qH)tf%05aF^FJ_SJ$B|IkQ>-$-_0 z0zIkUAmniuWxv9@AVfbjMgrTC9-k`hLukwmf*kV@XmJ-%UFyD4UxI z;QFAY6|c-V9)SpUwYnC?D}>EKnw7oa z)TfuPvPROrdOPfkgM+=iFqR2FiLz*2y1VZo?xw|LC;m1 z4C(T;-I&)I&2Wl>@G_sF`SX(ec}KbBo>(`O4q-ikrH;B64)9|fZ@REcBNWXn-bZPg z{``<-*zlCd1g>M+I^=nr_QVC(h==0PSYZ3?UosTWRp5w&GkwFQ^t|io_Qm)rbh*$1 zJn~g!Rn(X&)6r?QpP~CQ5v>4I$5iz53-La_KB?Z{QhNLbJ#$Nld?P~I_pdRGaG}HH zQ}uX}_CZo=A8-RMN7$R0qfv<`@GyA8Xz#*L%nzR#i$3@EejyYKcI<}Y?kleaT;_y2 z=DqiOhU0OrkI6^dCQdCE6SVd0UO0y1fb0t^K|e#xj7rZhTOM(Dm+wGaDLPXwO&OLw zSeiZUkFA zGo<$%$|7h{&QcxVz)lEAk=$egV&gs%l@MIOy%%ynX|Z{A6Exn)#k6QMP?vkEV8%gF19nsNa{Cnr{IxJ>6B%0r_9&+x zd+)$BG;l2=Mn$=je+2Xh-1KW7_;2YB|4>#YtT@jBtFb1R%WGBa)Xl9_a`6&9zkLew ztj-dZCW_b(S6ILx2hq(TFlFJJ!fQIL4C|Hp^Dd=n6~tRpukNl^MBNK%8r>+k_i?^i zFFEk({ir&x3%YFK>Z+LA!;YWd<3`CXg`UQTr46&2OlP$AUg3Iswb5pD{!T;u+TvF!)Y%pzkJ@e=a2`ZzaJ1t1dbJpGXjsFoTGxK4{y+!c`2@TA+6)vyFKVE z(iC{@ZB<4sQ_yol3sAPWgG3Oxo`t(|U>@b6SWmoBVfnX!-0jwHe4_YR@`d2uH(iql zv?rlL)X1>9NIXPerIOVfVhTrnq90@-6z3Qq=dy1X6{G$OuMe|Vi!9*_X zI>oYAdB9`-85OF%;0r1$B>UO@B5SRYZ9p#m$hItt$~e`_(EQ{PUZ%T^titVQ!LuPK z@y<_kt7W+7e(qP9hVmQs;mYlqJ70wCfHK?b=R!X=@zQNJbv(Pb0%_ugN5%Ypedct2AM^wa_yhz0spmRI_3qvYI$2c*Kk`aEKa8Ec z3ycF9<>y0o@mfF=DD;hzCwM}~D`9^xFK^D)?h|c3+RtuJ@5MX~3n*~wkDwTOj}KYB z%%-IUH8%2qnu*EgwFs~h&g;)L^oye|m?v=hZ9QsAo+o{P)Mu7I*ZxlaTZ|oGaq84cI5K;jI{r!Fp8=VuN zZEntN*4_C1doQA)iKcxh+iI}+33>D}yf{CZ?#lE|(vemvh^_^<*U(=?e%#T#y#nbr zz9;T!u}$FnA96kdw<0Eh!ILpSZYbYv0@;c1d1g+UXEByFp%eVk*$`E`A_;H6{Z@`< z^8JL14Q`3~YY!*x4;6EHe9W+T0@8ZQdTV{ZH|5Bgp&Bx6$mOoQH}ESndQvldg7{9$ z@>vJQz6@0Sc3<53yR)!@9s}LfbR+?f*W`|89FR) z2cjbcO^({X;O)n1m6E(@KEa$q< zpz$MouRI;DigB^$S{15XO@())g)vLMHAp9&9#mPkkfXqDo_@DJWcLc?0QL}po^`)r zS*5%XqzTrErqlLI8z7I6LDZMO&dy={+8ol6X}_>ui4KXZ^V*6&qyQ482MF($_r+Tq z6opC-De55s^Iy8HKy+fvty}4B}a)!sfAbct$jlCZQs@LY5 zdbep8cVydkec(xYu1^tyqKM;*-i@etCk8zxW#|A;M~XO|A8kQ*%qR+CRlK44h?16oe*f8@BVGLhr;+`fJF0a|!n}(I?_QPXD@L2Sc>hxGmt>$<*viS+^9KCm(X7nxv4#1&4M0S=G)eH?SPsY8 zbc8H7<>Dis_-`{sf71>0#kn9oQyt>_o>PL7y<1(+D(~&9?n{p`HA($5yrm;yv0M?; z3H8^%5ZlbfFBTu%9`_cdQV~V=3Srh#T~VF&wX#iuux9H5G4*tPr*sS=`XPx%d99Z8 z+=y^pL5?|3MWk`@-4)mzIl1?}(_iEi=>&znop&tE59|8wpmC8~KxW`WaTl3IH8$~d zemd$q7p(FlzRb%HsR1ls@DA)Wggh1I7^n0<(Q(;G+inFiB*UusLD4 zXx5xG>Y;6|0E;vQW@}Dpk^5C+#GVzXGbVZ>D%UaLJ^#u%SavvU* zuwM|?4uOTZyF4Pirtd!P?uCXANE*whH@w?)iqOv-Q-xrGQ!|!6Se{m38h3S(@+Wnk zIwn)M9)7EMs=ms%1ZFztcw)(@uYM@Yl#J*9x^4nQ*5%IQUEK=H+XHDfY1|Fe@0$sn z>t^B+-~ej!G7KJ%{!9KI)RdfRUmDUst7us7SkD_}^TtWPtOT_S4arMunQIQdg= zJdV|@gl86($@oglwH=+=ZBzfilUf+m+5Tt;x+%8QU+zNdbMyOtOJ>CsUXTvp*=U}J z_3Z|d)k;I1iRd7UC3iIjKVt{-N}Yg&rw5ui5Sjg0ie)%OUcv<01rS7JqP7i{Nl><+ z%%|)w_QAvYconC9Z|684f2(b))0a#9@*Ur)w1=ObrJAR&4wtIZgaJ!axWx7=&WGQT z1#@162VmSeHKi3FawCc}OPuD{CZkAvzwYO5pFB1B%8Jl<(5Zb1t`U0*?BDd+uR|J~ z0vLfk8I~qqt~s)D@s_I)UC-Ha&Yt1rYCl?|X1^xkT$TnD8OdQ&`+(W7D6MXjioYv*I z>K2-|^WSg3;hy7C=DO9d-`uu&hJ9RxD~mG}X$*Uu68_yk&$0I8oWL$^X#awe%87>v0wSlhucQQpsNr;Vc=pPtrzR{46_myd#`-Qm5SZmZP23t7Dlw)ds@p0&F}^d0PRa|pGYUZm<9DqNO8h~DLP&VO)B zCV6qAUq{zwWA189r*^JL30$etM2b4{Om6732gv2nWHUI1 zJcW$Wg*YAWA;$*{iCjE)oe(3T!24{Y1Nt+C5MUXHeu9F!c@|kUH_B7rUbqMBLK-ZU z^M?@zu;7mcSfl^<@NM9DKcc?{>xNvM3=~6uMdSJkEhk?$&|yv8F)|In$iq|9npsg0 zJPMst>7!@otx{<>`$TRnryq&z>;T%b2a?&=?HU0=Iw>@ZE_jy-fK+aBa^||(#S=Y! z+s7gh^Y?ktDITwIVg?&SjbNZ0N4NASBOqXGI;1+_nUDpzKJVuN-QDu~`F-{)PK#; zRgc$w9p5DU)VicS(i>C)ez5*rY-N=uaG4;yR)6h*L!sQa-n?mAlYBqce~KDMmb_w!F#!9zJZj~Azr z4YaUu{Dvtt1k+fBMZkHLOwXNQvbyY-Bb9&Q+WW&_EfFc z37pkGFq?zc!vw92jfcD_eLKu&3-g2$2p|sZUlBi{0l>A5#ksGWk|AA68q=7t59)aG z*ul|}z0X1e-AU}AnIaVF7gzqkhHmM7rtAN(NZ(6MvPi5IWe)04bDE`$X{K)=Hpjd;66d8!B~wBO*8TITP-_ zy{{DY>+cGR-7C4T`-#au>>l3WhjQHeR?sAK0`l_lNClH1=TTtCr4et70sUG3+n zU6lgjreYr=9-}>l;XRM`Yx+ApAWEvi`1D}BiH@po&(q2;fdjEJ@Po+@!y8i2a<51z zZLt+5+xl69!7@CM>w_wSwVy)GmD{tpzXa{nYyNiQH5qQ#scCikejB{3=J~u9e{YbK zKA6|lz13Th28LEx@3!3^S@x^5@hd}zdmFcR3(Ga>0k;PxR|nH)r}fHI7xkI^P~ehe zRXcp|3~_~G_WaEPDN*8cw%`*TLk6`g4|fQR(s^oxMJpf|qO<{k_|0MYdF=1oCz(q$ zS0tvDC0-75Gt`eh$7y6DOv0jcJLn&1Mk=H$H^U@&qzEoP?3AT#eAY(#MZ=kVL*?V# z-Ouc8o3Bbxzn!`DzL-g%y~U=Jnh{}6+vV$Y-VgupCMepW!0{%t`h0>7W&e7;ucCE? zG4QoJ4*4jps)im z201_glaXeGVsU7`!(POVvAqtJspS=0ngh$OiifVE5{+#`wGBVWp23lh*?jU(k0pdH z`#HE}WcGyOz886YNUXL<99|nmqdhrkXBlKl121HN%p=! z88lQuPUL^Z3h2Aw1+yDmwG(hz9xQG`?Y*%9iXaro)~{%tpWmyUt@blv!; zvSh&`-i6msx$A^UAv!|x>Z(8^-4oU2OR*%}rZS0E0lGVgqUf-}UHXVCCT|Z?w zexWZ8zGzp24xf4f@M`Mc*`a0tmhh~tjEP7*WKL$0*jiL z;sjV(K03dS{`H4uxr=?B?dkR>%*2Ph0j0gByJNWGNkMvbL1@4P0Dn#E6rku)a!_u5 zhmN>1Q0k8`(DR1Zt%F(hvc|eTY9w^Dc>OR>#S=s&gD|H%fd{PpE()*sj~TNkdf_Pl z1@UqUS*wh8E<=cxf-Lj1zKIe2=93z}a{^vT=l7%x z86}B$v-k1)g&86_Q(b0xPHq7Hj`T`z7!0CgS-$+qd2Pt$9V6`&MmqYf11_)wkZIP` zW*K>TCDcpF?FX^X8`mLfnsJ?1@}TznK7XiM+X!SGFOteSh^kKE_xO!IU%dDS{&S}B z!Pyu4Qqc_MU=imdRyxY~GMd}GH~@xa^V8XCcFkm8{e3QdH=l1tNoc*wSheJS$-kK` zxRvxiVJP&-eAbD-VjhXOk<=0O?YqJ0K(2(3h-wdDFc;_<*ssaYa4mi$CR%~n97!Cu zFq?8Vex37ATRrTr6rwj_mBG~9Gm2t!G3T<8mA`;%)4f$1Ld52R%Y} zC*F%R`!u&_e97%^YF_>PEiPnw443hhBP$kNN3mhF-)gJ|bG&rL zT20LqZJq*_&l_=Um`d5T=&rY zwaR_pF| #n+5huS00a1am__$@+jjX^T3J@Bp4u;ROFBgd}I!B zJIjytCc&cQS!lNC+6F}w9}Qc)DEG#vZj64jt$-;N!MN!l-z4p;_^LXsH||z4oyL9-AjAO*##B{}Ak%sOzQgCYfeaw$ti`3k zxJ=wRO&q<%L?nn8K2lFW;U0w-WW~$7+2d9FH{$ zipJSPGbs6MeJa#`WYOL!|KRWhe15HEem zh80WtDo(GP%)CY5HGyTOG%9<0AM+z+z6W7Pd3ky;ggU3s<9awI)74$+*NBwp#qPRl zb`Iv-;E(#tDPXLt$Y35&r-51zsk%WK>ROzHx0TO@ya{(-EqpfbRfILZ?Vu4G`|Jm&-{oZhgY5-`(3 z^IJ%a$I%Qt)^;RfXI zk;Zx7f+#7pME;iy*{#Egbi@Kp&xFdH>2{XAz8uI9=7V z6#ndms3G~-#pC;=$@6TutxvAw(H{la8lw&Uy@*PIHxT2L-G_vm#qs>0I zeB;~eT!*krr*MW9^23h8E1G)<)(@kWZU(%<@R_8qo>M7XB=nFT5dtI95z6@*NDg&5 z`Nql43?!)^Nw0J1MLErNX@&3U#V?0WRqYG};jF;5az`tfjUh3EsUd|$80uyL%$|s+ zJ2=PVfrkz>LUHeO@VV1a_;Kx5rMMDM|JvZe(76}x(-UxkVdTI^{{B)~gyv{Y%>8ta z*}3?N2G9PLU*g%jLt~;R4IU2lF8YkozUn*ZrCPW+b`<|zmfE)Wn9T`qz%_oGHZ^Eu z&|gn`L!bONcMf|YOU5TG%@O*9X3x|sR7-@Hoyi^0%-O->q))aBwWk@pwmR@PbUEWy zC-0?W5wARUy^f%5>JiM(qY9~Gbd*o+^J0OE?Vm+JrG4(Y=_~h;uELjxM=QJe@h{KIxfX&enD@YT-HF z6pW)B;1MZsn!F@OE7se7V}Bht>-6WS6N}S6egpf3bde{r8x=UE>o&x_9#9U6@myvojgnB%I*C;LR1w+E&nWT8AM5Cabx;v0;_n0yRssUR!o*}v7LWFO*f2T4BvN{R zzG?2!Y{q{f4#LHWkx`L>jhe4)dON7ChV-tx*v0z}#0I}P`4!(&*&5|ZqrJy-ZX09n zV`X%V&r}MANDpn3;ciSGMaBn_F=`M8tVaaco>sKzMZ~J&uua^nQ*USeqC3@oE88#T z0s|c#^#O6gt4|~!$zxW%c?QyAJix$@$(1Qx2upgdo^AETyXfE~?3N0ABl~uHEYof;f2!{=I}V@#&fxY5_RN%pV@HO4QokVd>wVZ zsh6w!*YbAquDV86Kla4QsR)h!^-XowmS5SXPHvA0F0B(5rNZ>PZ(h5xMP|MlJw7at z9}GF%t=8o@S}(G@M`qY}q1L`vJ25u&CZ}MCHT|n6HP{&zu&3LVS_;|}v;$;+$!K^_ z!`Z{3yDc8(AHxKjTi>XC&5DY|{gcm)?XNIi|LO1Wl(Y128ts_VZ2z#7N$^e}`UkI; zOrH59A`K=!#G9V!7v|BcBh+<-+W22fPH*>@lg|@%I`QxqN_>YRZc%o{%%(I};m@pE z9KKUc_~aGXw07>)ixKu_)GUu@W$K7BAfQ8)W6P;QL69i6Pi-`B2dKBG?BKqiBsCvlSS7!`8Gi81r({{@$$giy z3kWnY@%?mJt}tVUGH4GQc;T9O#b64_Qpcz4)XDuDkYqpIhfebSm`2Y#y!?>1`sW_k z`IdR?&_Pq&HY>P^9AxYBeFVLha^an>I-d~Ue%WBiZ`$YWxdltSAUbPh^ zQiq*iD2!j=8gj|AVyjSis$a@+wsoTkZrg%YVf6zUCKmgoP~l@SjG{<4VUY|LmEBdc#SBv+PZw4Ctn`UrZwbECc(C*K)*+>8%CCHHF#`p zP-*?Q_jpx!gSovA+Dhe>Q7Y%&_H*{pYX7ig>HBO$3o?F}-_J;(cO3ejGckYmwieVK zMhZc6{v7_66g9Ln=SH5$R{O!pL>*S^4J$w`9$h~RiK?AM2FZCzy-4s>v!y0c-U*}`!n zv%3g+HTkK?M-CUss%Q1GG78kRXnGxWaX*$2<;=&s^`K#@B*S3tx6fpsE-%aDUqhT5 z$Bla=0%=P&Ro}mBFD556WF8+AOS2nD(siA3-DRI3H1c{FKYBUsufuv+C_m<-@qw~S zcC`b3s^)hN^2TO-->BGY7b}IPXarj!j+2wQo+=loLV3Kp?Pk)Ktl@DN^)S5l_VcO}J zN`AH^)wB|YbZsSg``%tNv%zM%t{|Vg+r*cQ-b1KCksAg}5hUU(hW@w@)r#8($}>Y) zm<)F-&OOJ%KdJos`)VQk-NZxAiTNmJti#Ww1$HO|tqh8y9Z|gtkGbvyhD`km=>EmE zp!~Y@7%y36owM>B?4#=#8R0ciOGgjWI0~eQ$t+Z@6A1V`r^s`7xh>*PjX3>&exBq6 z_D>(|#8I}XmAKRgx6_ISO{=HKp5e5EIPo&Nh`w*)rKn};7U=rvc*!6LiM9uf#m^G~ za$%Itw}K|Rqa#DihuzTo-@(d_a;UO%|7@wg6H@3F`SXD^4d8fsaf_^co&8^|4x~H! zlf)d}mPwlFt-B^^Y6d2~$D-0|SDwYcM$4vL&`deixI|;csu{7!K2##GJ4GYck^>C- z@$@?VO|1S7s!q|K9t-wn7hgQ{t`V|7w2O7Js{+cXw??02{RR>>zWcVX4-1gL=2c>w zU$U>tVY_WOZ=Ou|8{fozp(s*%6r-(0=pkRF^DAll&1pG`V0X5L@OpTebN4w9P{Q$d zc21T%twZo9e15Vo-fyQp*TcJAeZ4|+dO+5eO{1fEGzRXKrOIbOCfY#Yvj;S}+6brl z08R<*KFsei;LeP&E$V`tb!fRI`B@MOQz9nF^ib=s5`qz@7_7LX3Z(|#(fssi*xC{#_e@%z*cLw^bcObYP%`Xc!^?1PlyGTi}$_^(Nd zddNl!|%pRRTlTTee1P1vK@^=L`>5~UYy-N;rv7O!N z`rW@J*Fc1)e4Mt;?m@hWbvZQ?lq965c93nyWHSEt~To`vod;Q2OT-dl_!?X_-z4fq@6FL^(K%EG61B(>hDjOi1oKUQego+~-RyYJ}u|yG9JX-#dPD$%I1khi`KF zlGgJ2OIZvd!IEx%*Fa_$K3v6wiN z=vmnnOM-2V!#*7aZ$(c|gO}iUbTW$jawy7{6JoYx@W*?evvcyawzs|}77PW%v;&v3 zFn`&fr^WU>_|d&XxF)|HU0DIu>1_KGz>)n8zu&65KWD5N`}izk1L-5`jn}@eKEF`7 zOA`3D>X*Y7o#89`YW9I`H1`~at3}8xERijWk-wP^Q}@~J_OXwLeK@w`?IpG1gPk?- z`+5V*J4ZZuU}qVaZUnkl~wY*4>dYovP`yG&$m-A@&BIxhUTEhGaD zyV#`FQ^y-lozQ>1_fmatk?4Ky!*w1P5=R&dctY(QmHtVowdg+qUB9abFL4=6tSbcn zUOXKc#;a9-Fz&hMyx-@229aOreN}zv(n8}@-5oo03xP{*-ix7H&<<>XdqF82XvoSt@lb321}w#seOL&Qn5RyA$`p?Yi&Zkxy-K4A-0ZbP@{vCJHgYgybw%H%DTM>>AuV z?HztRzUtr@9vM|oWYR;=9!46#bZOgD3CefB@zCJ6e|z1x#@arH^vP&hmI-*T&~+)^ zC>R1CYvz8!L}{%}=uuJDj0wMem3?fCJQdsPTDjkiYmhKfXf#WH zQw~D<@=#9O$vsmS%`-OU6cre`pOYFL0p^a>3MS>*V4-VO5NnNxymPr|IxwW5{tgG( ze_);Xb_B)>2t>ew^1{0CBm<1SYzxx_0-?1(WTv6!!_a~a8!Q|z=I*Ca$XcC~LtQ#d zJR>559`>`^fT%97(Y0n<^~mq=3vkEq#paIp&GK#0FV~TMUr3ThnDP3wU)y?}%ZMvN zcve$%I1tnHz=g|FTjH5l7&l#7QM}#c36qr)zXe3L=cy7N9)eMnfYHwI&6xmbfevV0 zAD&CBMW}7t#Wt%0jgMxrCpw&whb2RTw`UVn?HFQ^r~O*=Ody1KWI95oKja}_#U@e;&|?hyPg{DS?ejs>aNoGb^)JzO zm!B@Rg7OG6aP)oZwVh>P$3Lbm5SrR0A?7HfKrN2Kdi_4`H~U?G4*alCea<7m6E^x0 z7Y&!(wbnE)cdKc*_o~^F4fCPzQH^g4g9EbF%`ErG!WHMRvi(oLcX-Hbrz^J~n#~fo z`2DyOba?wEE*Koms^WJ)a`NayivaKo;PsVS&?x_=>vu5gvgxKzh+d(l&n~z4&C?>! z2jqoDvlFUMtQ&kn+UYYJL|tmJcnr+%OnWZ@n3t+6fe40CSaIjodr|1;j}dxsr|Uky zVk8y}SX_U$$9^4Y`w3m9BsWp9rHwtPJtV0HH<)gU!(>|c^bD#cjPO*E`_d_+^7Ir= z5jju&cC*0dQ~45xse^FUB(MffK-1^Yh@E`5#roTYujRW%vRP3OpWO_%s%9W#Uj9Wc zG*ysmvt+U^w1g05rSKp*a1VfYO)o0N+Xu);)5uQ%YP?jbeL_Gx@eVvRiQLpcI{RMQ z?3n0VxYs^GlKSt~4(_0mdhxah>ig}oge$djMOD9&Bmo1Mr+g8i#jxj>e z1_9l^>_t-x80UoL=UtuQ_&2Wl6BjtpC{){jsXI4z@+qKB-}D@9o;Piu>uGyD=9K22 z+2u3#2bNjWnXHJ%5%U!Fi4Ug2$ynxB0r8z(m4RjSo@5q<%FpdpVy5yOw;ZS~A4D)$_!IbKW^a2Yq~axX4qxqR)NZ)*;>ib2=jtws>yCswW=;HyTTG93&l(H#h2!bPTU|PO-F1F}HJ$D9`<}(epIz%? zdcs8lW>0C*J)|+UX^r|G4fJyv6teM#GnSAVAP)HRG#&^4^GV9*XJ2=Y<6A!-(Orn9 zATu|9Cjy^(L7#h#Vf0m2tWLOeY5csCDUKFBdk#%p(G1+B`e#o%1d?9yTH9VXo1m^A zdMI5HEA*NJyg_OkEVOdcgg?~%`g84zDF69jedXv>U~D4NtcmwIwMK_sOdT1C{dxS@ zJ(H(NA`F4A33DO!{&BA-$Y1;4O?ydf<+UXPzW~;=zbS!kx!Z!3_zP%F&BbSNP)khE zNq3K1c?5Fc;VTta2o#=TjL3a^KV2<0U^wT~P`B;nIvg^)>$L~)W!bydakuu>$>jj+ zcxn3R-Z!q6d0;Uz#RqxZZgt5i(6A{p1hp<@(WvRq&t+ zDsKA)`!FhphEHWk<*qb+N4%!*ZqHJrjz`J;q!6hT*?u}=b4#bw^2q!I@Oy8C;uvo? zR`Qb&XxhW?+?v?x`D|gOYh2*_h(Tv^qZ7Kz{v+v1+Z6-D@Lxife6)rT%K9y&Y*DiQ z`njFCu9-P=N+sUqS?=ZMLUpdY?n_1pw5R!sNvLT0zbolR@ZQziy+(;AhcEWV)hAV( zgz&?``OMPk@hjj$eaZ%U;6_Sei}g~vrIhW`zqRh8G5QN(0|+4}Z}d(MmA!=`R=kB* z!lxH<-*NaQ(2-cEK4aqXy?a<^iS+i|cX^HddM%DpOxrn|-dvs4^=Lw(=#tP+ zUu{lqOCm~96A8v{pXjtmZO(PaHc9#+;pdS%58xM@GS3nA{ODH6TuF}Et~1lG<1 zut}x%CQ6rEVf{K?xtdSyj2w5LyQ2J!ZmVkS(Z^%?vheOTxAi_N2m1!(-O;|2f(G>w zJ54U9{re`PEM6F-m*vO%t{P}b2cG_#E^ulm%`PV*T$B+ZkqtSH_RNC@8lrvaCVh53 z^=Db>5Qyy`29qV}-Pr{QI!}efriI6{dVL5sP!C?pm;#X;4%X>Ho-=!YlE0r6LLv|W z3|^9|ThLNr^yAXq?n zf~W3SKg3au{#Lr(Lh<}GD2QlxRrI3*rB*(OP@I*7>$J?2!VVu2^%88kV_Cw1$o%TX z+0Lsa@`a`KbzOneY($eZ$si34fm%61Jbkv$#fk@z7j`xqvE~!3w5l!0^|qO=Z1S>by;6Tc z9Q%QfTHiVA_H0UtNX5_DCO!%Ap&U+YGkSCGnhU9A){uwf%N_(Qdm>fUZGBCECUmgs zLZJLEp*KcNH*%4h)6L_am%(QZDVX=AR28}takj_7XCx{z?tou>g#8XDlwNbR^=7sM zSW+>h)6ULB+aB}MfeLNzmlU4`4G}$QV;Ck zZ)N%V5sz{48)1^z7ED+dXPQ%1l=hlh4y8e@3ZQxKo-K13AA!#WfNY8KccQLwdxb-q@)L{ zj2H9z+%K~=Fbi69%Uw8G&(+_<62m<)Y#bsB(NC{sZTEm@=70S;q;g&$vrgQsoNmX; zgx*zrGWh{onRQD!;t>jFD@t^D0fD7#@}9C-6EpjC-~4;Ft*id2-i#Ld?X@|*L;IWp zu^NA>9(*;ba*69q!Jp6x0kuCj)&Yb+oVw~z*CQ`k@1Uq^ZkB%>JgRd4${vj4tGW5h zvvS=#b`Kji1cQ5Cp^tD0RLSAQ56Ov^15&boG;vOQu)@+2H-tmLj`pSIi`!K+2P17A z?lVjweOK5HZ1#h5v4>+N1W54218p_I;UtHyGTG%gUjUMXk=A|sIO9C#-vuJH5J(;z zYrJ;yMS|9Qxsl8}Aozkk3@^;}WWV(&bww1ZSEyLB9+PGJT~S)S{_Y>Lp!xy0`0r8J zYW^aNk5DyME(zZa!a`Cvz2a4e9$P7}@u*VKsKMk^=E9Es(Ql&`=KG%oF%R`_$kN8H z@L|MKI;WoAo9d=k6hv?m2xH_#CS;fCHeH^dcP1EcSQa<_6&@0pKlk)i`-MaV5ObW=b-(I>(f6sugSkmPSZ*7AA7#o%A(A>^_}(d0j;q+F|orm&G6a7bqV8F z8oTEB0I?L!8jObbPE6swpa}Qiy2{ODp?KcO*{=}YUWnE4XynnG?nP@xUgCS}ePGU4 zM2a;N+g{A!X5!}9n(KPq_i5|f$DBJt5b zEu^}Ids#L#Ob_}HmKB=_Oq#uV$&e&SrtER>nqkRip;HjdiHRxBPKy?~vr>O=ggVNX(5t?89(tv)j>bR@i{ur|X}E z7Bm+1CS8)%<7j^n^(ux4p3ciVLQDMgi=P*!26d3Hb&J8b@yUR`|eRKbOY|@7E!mW` zx)I`|vf_}9K0N6+#1> zO!wKimx9F0&^d<}(kgQ@z)p&aJ1a5HO^dxW53_R+AzPEFRac)4(|mH?w6xu*Mt#5= zfgck|SJi#G+RcIesn;QE#VNR-Vd+<#PEchU`o|#P-=a`k7+s2sC>)L~4Srbd6sW|i z;Ws$alImYjr_R`D_OsPKzyKo<4(QoRoBBF6<-LVG4uPddE#DSriQ7`VLT8Y8O*?5| zj)!r_6|)Xa;0NU4DnQt&eO|Ayf8+4ed6wXnb~Y3zwGPlu6Q%wN+D;5*DyzB0_E+dN zUSO*b%$Zmn+6YD7F3})^)6_uOCpT>e=&JkY<8Py99ZZ0~4-vApVlvb0ovJI&@_x(x zMgwrm#;xp#`*5B21=nQs0y=PeF-?>SL|?rPwCz2BY^!H)6l;NzSE$5DdsIl)jDsXl zywS`Hh9U!We0OIYn7`PKP1WpopD}Jfvs9?5pH+plzPvqDU=>Pjh=-U6@;ww}gQL7z z`$&$29~mAToCXKQGoLs}>w6#Vm~Q-Lh}}>P{`9_?Pyfz3@8Uf8j>yQvo-99lZ(l&~ z(Zxz-=X15g*PQ11aRL1z#-Y=y&-@ckat<7%uc?&oT;;hW&qh?Z`m_t z3_J06^NTx5!LW!azFIsUr4z!)J;;GRPz||N*l!1wIsP6XiSo@%a(T6ZfNN6;Nma?7 zus8;B$*Men9e9C=RQ)8*FPAn08lV=7i>EfXZi1??_IlZh>0;f6(nsj(09 z!60kSuD#Lm^gTGxuk%p%d!TZ<-@k|5B~@&jJ%|-P9~H(>h@Eh9m-5wc>4I>NXruca zgOR8n@&oLzwj<5-R@{i|EyxFU&-o)btHQ1BR}lRd zNbg2Oz_&+u&-+-|xi3U*dTm-VdD@?=4BbW;6yU>CRXppWRG;%ed82uEC5p27>nhRo?H| zaeX|-`}5B;x34?8VvXWSB^3WD8K!gTL`cN;?lmFjZG3%y&kwLXSL$vjsr~&{u5oRt zuh0B7ILccfe2E#+mU{Z78NpHrR<17ex=RoVmIoFJ@p?}rHnQMU)Vq9Ty)MljNHELq zZfc6f)G1dw@%4(~pfU>!GUqa%!$-ktv5-0p9^EWE{2Si8UbMP!6)Amm%J~h|asS#6 z_#JxP7Nl33Q!nxN9E@+u*hfOc!o(6km-3r(TJKMQHIb!+KQdfq9#CjL$D-v;Zf(Qv7~g^Tzk zg6e3l0;w|$Ts?i6F1Jk36iXm3YNT0izO-TuwsZd}-beESe+ z^EhJ6+8v-#bR5cI3yWB<_t^8dHJ_NT40Rdy!~z?=NanX;R<06(--lHeh;Q6oXzOlP z>*x;>4ug=pv5}!h&bll4x0&%M;7fDc(CzzQx9fQ+voWs;MJf2JdGd&_c3Ci()Oe7u zo=YyWUUI6JA zYoR#0A-B~q@zlsuNs1#Z4q6eP%aB2wH8DBcr-;+MZ5vBLh!=-x=}Bo5+~{w83M~+h zs`-5Y z7-)f)(7bPjfN%BlvIjM0G{%?AZc`9wLk17%W)uh|EcZPA1XMU0$)HJ@?z%PX!5a49xO$r?f!Oi^>+G%H6D zCDl4AN=%Kn>d+f%D(_=E;eODmvx*7-mz{g!HJ}dO#5c(w4)7nnvm?X7z2o>2^g!Ad zKv|g>IHC*pxG}E$HpSCh6h)PK?Iu6ZoVar}`| znCIj|_G8s`AJv`uG2XA1BW&xw4;)L>w(jzEc>FP)>p@etKlMnVFQE;0hl^;2>}PFT z$2Lvb*#s#{WpshUX+#N#t3K=tiA0uoL2M^yevUI~Q%=+YBC{8U>8H*>$NQb1WCk!V}Etz(Zpp zn(WarSW_C#LfnHSOV?1*+r2Dd6Qb{ty0wQf4)+eWhSyf{5k1)>o}~a!y^-XQ^SAxC zs~EuTbT@P+XbyDB`5KaHiDjpCJ24GCo$x<>x-SJbpCwF%Cd{V|Ac*+W%U$1Bbj(9_ zZGIOBh=2Y}W_G)i&IHlVq@BgaFRkG_`c*rAJsl75kB{~{ zs6jqxue9vxm`NX>*X=QrlaWH?dWF%^3x1-VNpEMu2z!nlB^N>)NeTZVhLr&8x-?G| zB}up1KUidCb}Z9oe!U>jpfq7ZnDs0z)+iC9~q$m)A^V@t#QIcQOyQeX=j7BYE3rqH15yUdevI>0EOB{wT}@(q+&CsudH+%i#I$f`Im6dg{Wjo%7{SM&;xt z9MOncp>7&MDL8o3C!l7|M{jx>;X2&(4vs9&6&OYb-X4#f)jSW#0VzJDP(iS61Ki`E z^I;FDe$BVEzWFzAaP12khLZXP7C_@ceYKY*gGd?9TDn7WFz8IU<9dcyUGy%KuXA)ymOAtNe&y~%Eepr#XZ?A-zvJ%v8ChpO-IzTB zbrO6a{!H~$Y~-zeM$Fjlu}pP1bFW@8rEly4oQ3+Xf9r1K7f&fxeClc1F!z)7;ch&j z+Ir1BgFFv*47m!Gl>P)K1D>jSqEqw52^U8n^<$@5u&O<*)fK|IlXJqmy^Va2dssJE z@(I50meH1Pk~zO(D|JCDu2b03eAOjg3SWI_zecZrhp0Ro%U+J)E{_oAn?;LjBpNxa z8kNi6UZxDcqK9e7R0m)k!>B>yoQf4;83>EkB@RAcjTw-?sEKM9SduspS7-PQK;Ice znbV27KAzrbsaWIcg?kPFv9Y_5tsfcRS~War+&^C3&JKONJyqdmTqo_0@L0MGk%m}T zrR$@sYmT>h-Nd62$mKWx_qu}Zy*@EJAdREE&ba)D%HnyhDHCF;C--G`TTjU1YQMRc zE}hTejZMbum{k~1A^>Qv1X07dGVX8-1z8=hFEyMe4Bzh~*~ZY>#X}6VD(b|(kHLfE zp9Gv5%R!9wOXmC}E=99%UpsH=#@JrxfGAjGAOBMLPx-GWLIK6@Lv|}hzjF<7Wb~uC zq@jvEd}nQTf=Kck8efEy*PVo}0pSZjoq8scuPY2G z^WjQ-8PssImz~qHrcKs`d&;hs^ji@2buU;tCEhm|n?2lZ;L*8{U+p^|EVWt^pl-(| z7feh`Lq%tQp#zt_SS~Z;G?&SR9Hrc!YyG!xIuLzt^0f-+uP0s*L~?V#SXgU%h_UI$ z2P_j1?k*_&jRSDv{5qC_otgQ*?#$1OzlX$qzf`2)qurL<{GMIM@TuylV_UDPPAOQu z)H)k)&Av*ma}Qnd-D+XpCsAnbfl9@6sOV>}dx;xKA3FML>=XEa3$#x?SN%*!(!5>K zL1>T3AyCMDXf5XfWM2Fy>j$f--QxS%ztC9RzeF6?PXd5OhfzD?07k{h1&rv(jAQ|I#x-QG9qY zK71!Q`1k3Au20C(dcod~`1lWiJiea3HEesl7#bQ3m&O~|BxE)@A6y-@>c?-sle7Wq zM9_W7($TsfE$E5j^`gD*dHc>W0yDz!%1VXvhhEzz+hsFo-2W_5m6w~?2e zd|A?$>Sh;jBzejys;c?Zj=nC2TX5zv55WNV0XcnTG0KQWQX)8x`HdKZ*0C06r9GsB|g7z&5cyqynGV@YitMv zD(|{LW#AML25ldb11H434UH-;Yq-H=Ik1XIa2kUfMI!T4?DDZIw!+6sUhK66HlcjH=$l zZ~V#L=Y(TV=seJ!>0~bxTjU{?_$o1!d|yj`uLme7&+dvKm!5zc=rpvGciuV5Qqe(3 zr%U^mFZrqY?(y9C3jH6JN~e83n3{gQ;XTH)(RNaWmCv*EgpO{1XiXpl&R`2Vy-^M? z>%nX-;7T```t@B%kL|ny7r&-DYrdQLR9qLxHo1~1Ze1YLU`$?5-fMiQ?y)^q>Xx6# zDC64$NnWm3uWhI+&g7_z+xMz|!%A)$nR{lKP})Jhr1$AeL$TWJ7S$X+6evX>Cjlmy zU#va$Bxh?p0N$@*w+}mVgUryih4rM&ox!=H;2#Riq+s1&&BFu85ilM8HJ?I5&%0j& zCmsPcNwVKJ)(NBSWxUK9$gFk@aK*(#-P#|)^*`119q;qy8%FHu(@3`>7MWMFt5AYM z^Y!GBhOXf^;Dyw7bFV_9`F6{iu{t_&d#3v4yN?vuGsrza?WuJ?@3;N7`w~2!>NheG z=EMzqUb0%qOF9OogS?@su(^jk^}mJxvoB^x9IqF{mG9vKD^8>7_QVEy6e%)m(RZ3F z%uC-*5$rEPMhum_WSFK8E_XRnz_T% zX;B#^|0X>DGN$R9A>a0iODUp7ZxAGcY$*JQwrL_Tw@U&+M2@U4IV zr46xFBvfIW1UUKcq2^Eyx{I0Q-;IuFK}Pw$wBP3uQILNiDKa`d+TT%hSa(xuDWb!D zMEn$O3NEWoqjr9)IR5-luv3eLs%+Vd&=Lrp63(B|YNR{gB(YhIIDFp5dp#U01D0m3 zJ1KRRk#~fEDx3cB;>T||dD`@V(XH}K<_{j~YE)jt)U{xx<`7p6HRI5=PXfdVgsi)l zKl|#5cKi!Y&wSi62I&m{{sx=Nk?!{^49UbpaJl54${5Mj_>^8X+ynpGUT1Q;Pmtrp z$8VIdD`blf#(}6#65t(pw7j7$1Z`LZ_wC*4OjE1QUA`ZWKfvZJ!iiYsv`0^>BUdLo;hpx!d^!JtLZ@lU9;TZ`usZn-9C!0h?wl@Cl4o6+)0ncD4=XdO z^@=8dDmoosHBFeZFgrLLG6{l-S*Lx$`ZLwvyFB)=vOD;O3p-1wdjXAGw)>J1$Jw^u zo&b4*YF_vJ?d#hz3JKyuI6Oyi~7u>$aWh^mR}@9Oh4Sd!Nq zJ;9kQaY0n0E`yYneJ6a+>lLD!_iorytLZ;*c*F`BIBc9k!drOf^(X+;J6_Psd270P z;kT|_K)w|JbbTITkU)yL+y`LKYMGpOb8@_mpTQMdV-kSh>8DqX1>Xka#35#;RQt!XiZ6^8f=< zm|DYS4&p&>x>A)9%k5k;L(wmhk!zc9_EAETbU zpy_#Sli_`g;^p|+H-mG~oiDGaP(sZZhBK~5(K2L0KgFr+A9LhQw)IJq!Z*}XfF5BF zU1WA+f)8tGS+)n@RSP1hcLQ8Fi}EF#L$fMP@E#dY$-3$)f#GIYw+pA_$87%&Z~0H9 z^yI5ggZ&ygjJC;;501w@XSz+=o-jt|2TD@uTil8oD*N+ePp+c#=_kinibS0oucxMd zVrf-hQu0EobGjd#M`8G;GBSgCa!301v749&hhTaO)lPz8KKZkhCHA??UVPYBR`cc^AX5tC^yWO1AnAi@Z>Ud}ID;j6 z*>YGu%!g}H7IUa9jgsbPr!qayRYYOlggU;o4*|nW2^(X_*PjjE9_#D9hWyC6j%aV< z(W#tj&eMi+Q;p#(LgS~aYhn7x$;&M;@t=0 z63DL>ftk>U*cGY52Xs@`;Jesed{dt3){XiIUYa~+hj^*9uiKm){=j;qG(e)1WXY+h z)%pDTsXiE`ZMqmd4B<|nC;xlq#^}Yca5L`9E*U5PO9}O4P^jhqxkZSXQ>`1a&p#eGa*9 z>fw04s{x2wKwb=jRuMf|HAz&z;+g$DA6Lc{dkHeEy!V5JvC)5NDbdgSHe73YeSFLP zE!{Wcy;_-Q+WX}vXZ3opQ}-@k-ag~V=U)$MQ7mt!@?vX1q;Pci^1ZY?g)muxCSZD& zg!&p6>XSSR`6lrBK`NYPxXkutzwE`n43GIFlf_JUun)vzX`|7#zxe@`X9=H+XDz}( zk{RkJ?ww6qPVXaMzEv#xKFZvOl&84(72($};BH(5M1$&+92~fPjnaJYfqx8W0s~6f_zkuS_2I zmB|c2B~a5PkZf=!1Yjb{(}(*|q404&4Ntyb6B$0u4-oOCLcHNs$;@x{8}D_SS?S$} zzRY!?!BYr+&W(U<8@?-YoPYs_pUV zttR?jh`2XJ*#J{1sG^Z^_23ul$UiXAX1Sj~#`S)BNO~CBJy%%C8WhF%zE0xuCe!UR z`9VLZ??l#wBXK)$n?a|%wmgIv6AKGO`Eu|YOW28Rr>o&H1{Z@E+-mP>K4t3l-4<*e zCd)jYCI#rpyI@3ZoP1x!J_cDJG5So`Aj61^K%AknhAYj!ejr;q!3&h%o_Dp}`DFeFr4_gcY&9*i?M z-M9dId%Vw|!vX)eh4mHXB70>;{OiTpJaUw&UGCP8JooRVDFnyVC{zk=M)fSX@Ni7o z?cM~Lf_@A0a@+s3xIq~HEYazV8(~xC4=3_{m#rtx81>}c5UV_JiK&&BNs8U&O9$O)J^6dMyyKARw z296!>yxY)JA`yevEjgpF=`>1DAIg}A*XA8mT8yj1%H+Tw5KXYJrvR**)YRYQ?!m&s zcCHVxo+kM(EF@T{`{tOvx(kN`K{GlVgIW=vVB(LC9d1$g-A7%T{n|`V#RCiOe{yUm z4;Tppx!Jx~FYbX$qOTnMD5g~c?a-A0RWO&nd2*39t5pnh<&~S3Zx5yEvsUx^S|ba$ zTYtak!}2_Q`;aKs&-r|TCh&yr6|TVTB3kPAMcjXPSMBN>vp(m%qJoZP_w3~YO^7yX zj6}A>yIsy%`&6pCC-=0P^mF34eZ`ggR0i1axv=;TuD_TJPlw^QTYp(Ur-!X&D=Qi5 zI_8xdOZ9C!P6;m-w?1Y$M`Pvh{U(&OE?pJQ*_c{CLQ}Vu&&pw|8w65vI-UBx=)H0_ zdU3v1G-NsYkUaQ9dzaLeotRYotYEpjIe7IzP zY6r?Cfp+1U^0_R$|G?Sp=jdbg_r4 z$(Gsj8xg_Y)t7wZqNECFspR&o*PWcvQR_=0n5tbmXu=%N<;q7Ah8&ph!ST{14B*pw z@B=L`?O&k{k@~Bk&ZqvMo^gLiC_97cSS%myO8GK*R+RiBmXxJAB;amQe-~~C%FPH! zQ zZu6AfDxH|$r+LhT_RjnM+X&aA&AVVrn#Aw^oN@uVA>PPR)%y-_gK#9|v{h3C-G^GP zr{Z_&@H9lj!8^6*CO`kBenoqj&tu)}3)?W%I|WK**2Y6W4{J)!9wnvQ=j?p?#k1?X zlko<9F?t(;L@ebKcFni-oJU}Y4>JVz8~Cos{*<6U3EGaj*#PkBb-fJwXvhE* zYRpyZ^*c|ZbXuJAp}&{V=Y^on&#}|*yQ)E)3o5%}pN50izT4v)Mc}uoG0p>bV*CNT zAm6?Qk(4xshGzY`O9E{X!di zk&W!%wPE+ts!baB@<##hosP=%=$7p%yhesph@uUT_6$n!VPEWCBoIk>rTmNOy0R7v z>_rCpOn>^=MaSb1kA$UNnLOZk1}n+Q^eue5$EO~kfcXoynL=Snj-iddFD)4%3g zVg1;BUUuBkytKOdfwb{wmZc3U+CTkHFe1YDj*b*trL*!3W0tY#`=1FO+6j)l=rCu~ z1HB65o8t8ceGJHln_ErJ+5>#o%saL@jRjHM=!3vDQelkK$*lQHr!4!`HXs1hvZvEb z#bRR$k2QO|;Y&&TuK#{2Nr}WWn6ueobBoV@69NH#*v$R)*rz6hE1l&fCMROJ zQt*vh^Y$8AAi9Qv9TXmd%vEu`#nK^A{eoBGXMWr;yA7KU_BnC)t7eNwMN33@+hmPS zaQDK7vFZ8t`Z(OMi}*)u@)AMXigE(RTK8)vis#sy7tgL+H4Y@91?dRyl?niG%is^% zef+}jN7>&;vv^t{Ty*cdL4NZVEY|T>;9 zRPl!H=+_0EZNx^88_ORDSrp@UU`1Q?b;?Rv2tM4u@1}P@2BE3?V{Y5y1#}^QK^J~6 zn*!7S9)omAi`{%w^wu@0zy!NdWT!V7Ovi2o%qO5OZl^g6+@O(sTC4bE1OLbC=UaFs zeSvdA$iR=+*tk8Q#+`fnbWl=f>XR4Pz*?n+o=Brd@za`0Dq)tYR6r9%k1Gj}~4c6FlpDbN}1q0IJEWz9^R!PlN)D2Cr(xu|S=Vm~E~Zw*^w)2Dd| zTUl@=9cLu9zu(8H8~!P1;4pYHf0Oo|FC<<(1gfd`^!{p+&mEiD1e>*P0_AojTxVwG zJ%%KmrU(ejV}JH4X}v-UKymWfg?MT<#J(?3;-H81Rl#ZHQX63wm>o0y2pG}PZy5P3 zT{i9JF5=tnsy$^rY)Mu|YNd#A_Iv_t^z5ajb;tBWfCe*1s5y9ZE$TmScpE}Q@*yE~ z2oMKj-pj{{<^gF?Ly=^CFg^4g&eVMAnl>9>!MAQfN%@`kbF=8{QOYPOHur_f(2GUV_x_vuuAeb05B(3)pI*6rTXK_$ zp@?R|Jb}(F5(lVqyE`JZFMj(X#Fmkzl$zciMeVVu``kE#4nkI8D_?%kQIy8gVZhn|7U z2jfqtgx%gzN2{T%;P{4UUYV;|$#eijQohL_-e&IPt3j|WLLCTx4fqd*`iTSY?QyQ4 z$I>s2gxb^up8u{P|A}BHm}((lRyM2{$WIa8-BlTHLE`$jUt{+^-8HKO_(&>bDonIf zzTY{pXO#H9UrU+IQ9ZZ|Y3y4RpoJ}iaM>Ld2Ktox9?7iOcDEbQ)vN4CIe&M7a4uYb zVwc7_NYOE9`P)~l2)IdY-unfqOYz-E`CP^^b@d+KT0Nawhbl`h8jG;j;O#xbu+bj` zAP;?H7T)ErYqLjL>TO6xD^ZDPRf*?5pQ=o+-%&p6r1O;b+XMB0U^~0ql)$g+00kaQ z8?jPZ?Mbww7X4-%C+DQD>-l;{0}~_eo2o996=!M`_?w1O@R7RN>}SQQ7R@S?rw=*C zXG>9+eqT5Ei{TwF=ilT~GwqyuJpWPk41R#X^GB*pO)dcgZm*Kq9i zlJNjSaOz7N^te*}Q)IGHdk)C;yyhyWAG1fBurIw?Ben{3>~d%Y)c#vr_girQVN3lX zYKA0AC9>q|0HMxaZ}dTWblV#YL9JHvAdHXla@RbVeY@j>yZ)jluvNI6D5Huaqq28` zBZxtKU-wJ%$ft<>z~Bo7AgqhnMc{L;?BO$iPnP9j>-F$Ka`~{jaY$Z9+<7#?t*5YF z?vLQ|)Qk__ z+Y1D=GnI9E^|`|imwM<8;5bf*)O)o)4-J}bB>g2jI4)jQy{sDb$qV=J=jr!7g7rMr zg!|{sAx-zA#&!@Z(n*yHD%0dssXoZG;Gy^*vIc*vOR2vgy%FP}9UR+pj!*gg_9v?U z9O?T}?i!@!Lmk|b>KgRAW+S**2dfFXWtpz zn^Kp)ImvF1@Kv3w#N|UlIm6BCYVF%%{(7ulJ~}L#T+fm@M~4;Cu)e^na7EfadWRZX zr>ynX@}C3Gc1|^isqnHv^{da*Dw}Nnz1@bZ#!mdjJHg6m&}0#E5GSKp`KNhiiv0eB z&Pv+90TadPfg`t@xuBDK0TvNyKWGxd?u;mA#?h;@^w+g3LmHVB$zvkwE=SO@7#`zM zgHgz>s(&m-!WKCh|9KS^A-OMN8}trt!;nS!&XM>O)mn?*b(C{W`>Mg3-0!m-K*5GG z2}La3>`b)R<9-&$b3#60PE1GneNscX=^#xC)(CtO1|?aD*M&Ihs@>ozPj*m!r`9lL zbC)di^P3{ypVxYVW$;b#p8Fl?PjHsx2~E`OtMO5s1#Y`+Mzez)<>#AsHkvkQr0ODn z;E`6Q_nS|m$itx;&_S-?n~|KdknN;wq{K4L6(%xZgn2Gd2-}}npEf@ri*fXvUUt!S z6Zj9#uJCFU-9)bHM3CadjeLe9&bE@l%L*?S5=qj<&=tk zJZdTwK=D4I@j6lMu2bOj4__OGWzC(s4NxIIuz_>QerBM{lIv5aSoBB&a;*mgyph%j4gKRXK18=H?f6-w7X|V-fgZ|zA8vHvvEb`U$P|;uV;%?V>E1s+)4ZoK z?Fze)>hy|s4&F%qoz=7P;(Ot91SuSkXmfSo-U`UEC-wC4U(6KC`++D`Yd-boOKcfu z=NPuFTYX83t}nx(+jnU1OQg zVbw3Es{Q=@(@$`dGr4046#dge*}!!ea>H;{@3tK++V4#>XVmQu-;(s1-(ML=FMsL} z+|kLe7g<{O^nOiSaG=`wulo*Dco%69m-r<4y3NpJ?EdNzLE>D3&Q&_8<@d zg^1VS+d&9ve;xkr-`l^W(~XxH`lSrt$w-K;eg@b1G{8EWMd&FXuL9yJsIHirZSl_L zWcmL3J$%NGDU0ti|F{RwPkDRKroyOvlOuOanRW5l@I@aQ&}-;{B*6Aw+P6(20PTAi2m_ULLK|35?L%8x1lh0|`z6u@cUjaQZGrrv zA!r$TUOxA=!6rj(MrFV8`x+l@c${@069iHpEi#987sHja(Qc+bEZ~H%j%5A54m^K6 z)Xn(G`OcTkQlT1aZWenMbH*7Q?et>y+~?rWuW;DH#hN)+i`J(#0aAI|Fsj+H#@3ly z@=vx3MgE=w)W#Xbah*}>znHB}6C=Dz*a~#7<12=I(I1H`dbaK>egtpfgA8k7v!xQW zbbj2Ob>CVBw~`NaTF$ca;iLHwM=llFyZfPNDCDOUI+KD4Hdzkab2-kp7tEH?yU4XawK=`4 zZk_kaO%EZ+d+%2ORf-a?|8e1|dstDGem4plddlO4^fON_vV~;h=CRfz*f$z=nD*7afR-HeX;ACj z1g3oG_07;VR@_&cG7PriK`ikpUg*sG{gEd0M$N=ne4H6_GHY}_7{$nd;j^!`aX^{B z>NaN>fqC5ns8D&_2sp^302rT!dS4|#_OBOOU6@1Lco??gkCHoLzhTjHY?(SKAL~zR zH+aQ_XEQG?JfhHXN+>1=A*H`Ill3w@C<5$@#8J$Yzk26(dAuIPVNYg!FX8>FzSI5d z89;RhX{E_Yd6vENj(5d?O(qKqtO&amXdQut>ce(Sh$;V%YrYRuMf!e~q;^51!HI>z zo&Q>ML^+KKWgt4V*^+q5)Zm`n2=yV?z(JoF67W<7gF@}(q3e6)B_x&V_>mPjj)m@& z&H*(oGj-bb95Q}X@l3z(kPAw61&|--nJv%sb~dm6_IN)(etvUGKooz(D>isz-(A?` z>C%9A??oq7e|ql$Dm$nx2Y!iS&|Qf}RyH+hU_9>STx`{^&$4cM3%|hV`{jurLhV=UL^SGT`}&eXQ1x&T_@3SN$@E#E zRmaDCc=~+JD}Z=*UmcFGlimfxe%)c&Neq_NS7r&XxQpE`jd2W6{32udP44f&I2}{Y z(fRABu-K#hFZ;R)+}aPH@&hr$zR9L7igVJ(v55A5_(4A;Q~HHxsY~8uN7ci9yKf&X zbK)6TzbU1YoP)xAO@sk`)l)J`E)qp?n84VngkyF_k9yZKP*paIf~^x!;Sj|?ji=j5 zjt5FF&{89~rnw9E;~NKl1_xTmJX{Y&?>g)D`Gktm4%638Tv0y2pRG6`>>Od|8BUthtkwYs~i?^PUt%#$Z0 zcC4n1Xh)2dCiT0{zZ>En0k3w4n+4)1Tqw%pe+hn5Cr-NMX>HE6R3V z251o{P1xqCDz2r|IKv~0V9;=0E+4qQ55WH6uV=2St=17HhGse8wsd5W|xUPc*Q&dOx(+a}v)eV0cJ zCMZ59bgoydJmmZI)LdPLxb0Cd>b*6%FgZVmWg)BOxsM_+pe1qL%UWDath2hFKUW-;%c8(4b{$^e%MzNEz(+>%B1fAjU!41$T3>u_!#5cWy-g`Lv zP1yu=LmwJ((;idp=;up5^0)nz_bYcP+VmV0F*|K!gZsNbF}CE)5?Ni(?bln8o%ixs z$$BF(VIL;KtF=n_GcJ?m;Jv~RATz&rOgmMdZCFRjhF_gSE2*NR?-*$>&dirJvh9K0 z;kBk4~EMJOhE-fL&xBNL{Ge6Hlk+r7FrEpf;`4QFr2EV@b$Y}Ay?<>Bm zfZ$*Bl26_xTbKB(C+6?2AclwRuiyP7>;2Qjr6TWLDPiE6@0V_4JEml$NE4oS*|Wmr z=Q69&o00Ym5QNPB#W}Xl>v_k4!isch83D|+1hcKEYn5`VA|P16TAjdIsh*$P&*uw2 zk>di@J=}fFL3Kbq2eF?plAj`s!57vyP$2U!un7d91U%Yfu78Vq@OrQhWJ{h2T{(%s8MO(!d} zP8@xG_g=_u+dYx0ioAN^FMIm0Gg-PBclAZ}j!g{lu3swkzRV|3^bcw6%VVs1sGtPb z7#NV9Xn&peyI~{o_nQ!HURFMMYBd1Twfj zu^Ru7RZ--)eQJDf%tiT3f|mlYx$cXJrX1ZxDok))7RCg{=X<0*6Oj%;c%|Io2^8c< zT9uS*&t=0}`^iI)@O~&4Q8ua;?{)6qCo$MBug~?UH4{3u3jpNd{g0cy!0IAc*fblQ_Su=T;HZ1>cP*8@AcV$~~LEEJ|QM`a%)qp6cy#*}v199C=$^ zOMV#9nf!nivwKLo_P#=3au5j~~f;bvYhg3xSzP{`>%8XBEr*7Wj<_8|@b zY__${Sosi~uDb5T;PTz>4&?c%K}9_Dwu1?l$;K0Fhowjd^jllNP<;0bVCfd;5+)@I zE5WihFLfTugWM;pIei(~W8oca*gTfxci5L8!}~c{Z^U}!BqK3{YtHlI)7LNG?@y~m zk|#RDZrf;%$?)7tO!dS7c!#}4r`-EI3%ybA!y3_*K899Q*%Ip@lD^t{i`G7G6GuQh|qT=EeACxB*L4=g5<4T z>gSO_dZ$B%gA;#7VfHI7BIKeVAB316sZ!G{Gp#*LILiI9-7`Nv^2eiic>jpg)riEf z6SRGu6wCW?dl;{W^fu<+>c&Y3jK5FNd{%Jkuw_gQ#rRQ6rvaq|8N&*yWYnY!J%!ZG*wZgRdojgOofDJAn(77)GzNMSkqGGo{S8q zq|TQ6CDmcM64&22z~3Pu17KsW+P~$8m@?UYB2ZHc{QXVO@~S_^i4)Q}itw|u`siog zdXIJto-nQ$Oy1J1yF#}1J6;!+hnL`+1%}*fVsR>1ES0Bv)uz@IG7)!fS}An4ygVByBO~Q$2(3C;Blq1 z-!ic7&0WnxC$Fyj%9T>4bW@}QWO=PP?S^UuDj%uT)jJ7Y{(b+jq7jkrFMSRuUktU( zvRttm4|j*VBW4w6N{Bu&c%s*$-ri>r6!eaGI%R~78aFwL`B_B~vCmc%<LIH8!X>QW1fk{BV8vq?zU(X2M!UGDR@Hrfjj)T4(B!ldkxrt-) zopBq;RtohtOZ7i1Y949<;K~=BA&x35VQo0z`X7 z{Wb^7Lngl@Sb-N;N~p}@Q2x}X1DPo=l?5er?|TK79Bc7T-LJ>Tt8z<~{pd3iBih?q zyg4K)VBQt_zjVxYRJSKiwn_HXuTZhaHNc(dex zE0e;-RKDp|bb0h#rXzMloB2wmc7A!pZ8X%#%oWQhBK4WN#u(yc=CBWR^BEh>`<2Jo z6Z+;2Y*IY?d;i5`?IJQ+F>UCCPdOw#h1;mn_)v+8S$Rmt4CQ^)1Rr&r?<&?C*yR!I`z3kq zH^ilo)XQxO9rbnWstb@hb$rp!b`k%SrvZ949-RLIJI5D$G+%6RErViv?dlF8?C)Gx zWZWS>5ON#8n|quzO}m`L1^I12i@n6>`}SdkCO#7T`-)g%wCOb3|DF;rM7hqXe-kKpS6r<=Ey& z|L|@WrkaqHEL<fT%plltUz~V4&TnjL68YcHB7VMU$dQ-c^fDmPjWM+M%?ob` z!cshTJQ61BsCSr{2z{el_RMjeG&O*rAaand2XdvBLk4|5mGAZ5-a9-qTGK((iiXUx zU^|vRZXfgSuz?{0e-SqZS!MEIn;#vr@)6?T za=QVeoCv;^p;;Y_BOxu&)u`r1af+q=-=~IFiYcg@M{Hd+x>W7>%wd&<9pB~ z=2BHGI+M-uIH+#*ONOtuJ-*3?z$W6ctv@K%9H(9OB2>yE2C4uG2w#;W@Th52;f|pY zsk2;Z_x@|c^WoUOv*B^s;8S2<04u?{^4xw%dD)8Vg*iVy-H&mL)omzg%NY2;aNwMK zDzGyJWg3+C$Ml+5>pBl&7G)x%xl2^clcrYR{&PoBFwpeORW-^i-zszFBhh!}KF{~& zsQDL(@x9Z<9?`18m*#$cE9*#qqX4(tI-Qjy;a6}R4J5E<}(>OlUMP__^H_t1*Rk58sME*S*qpn9ICj=dw? zWs=yZ$G?pEaY7RG`}5=jX`Kv%%K1@^=+DUl6Nx>uE1fyi)2osJN8stGetx=rA#q^` zL~MFb0Tl^W{OMpR@w%Dsbx==w_~coMXnx1^$t9;0=04B`p0Xui*RI-&8oV9(6kdfx z)&(>jN9Lk^syBN!pb?ZnbW>WxmvVaV59AyqWCYX$^_e%oHb*q`-`!`41pCZ672dsQ zCHGh0+>-+a+r5mTv!maaPl3Y%W6a6rp1RIZhb1c&4c!Iy()@<^rKQ6E95o8Sh%n)jCNaX3}H`Drxfm{PT zJ5N3#DlGRul4TX68`q zsRSonM%tlrH}7@ZbVv~(9vX5w?{&KL(u~|ErNdE4iz}`vACazrt0+vkdCCi%>!DK} zziaO}PBD~>dbB{U$>QhZ$ExLN-e-;1Qp@(;Y^0t#%@cjQsqT2g;|+vq=qV-)Ykr#H z^2**YJk^YSv&-POt!O9~E}Q*Ese@kI@qcgm=+>T(;I#a^;#O{Ox5&hljp3E8q8C<` zLIT#%l-^sLvJ!Q8K zb9zg^7Z??%4=n^+NSLED@ZKvo>MvM}Utr{5!&%;MXk_@@r5oSF4Eq=8r}>|e)y`$D z((U5*3;1R6KE}A$02xr9r|gvtY67{C#`(SOt<^u}x&qSQ9b`ZMh&U&^B!hyw2>ka4 zdKR{MpW`?#n_*Wy`2(BX+|;w}koS$g4e0rfJ=u51d3jhy&Tq@PJuK-YSSC+BLQ2gb zz`ee}pTLVAOX8hYd@^WQnw;-P$t+*{ZFomm&8ne|JogsG+foX^&QJb2FM5|p08u8o zOt1g0V2hmc=q}n+W6_s=&EcK>{nP#CBo^Ifv|KrTm$rpvLv3>8D)D#4>Vspde?#j2 zenF8t%-MRNf&Mo3YNqgS-sz_C#4n4mfA#xGW-oGIT{Bv{h)#ERKX_?4FCPq$#rJ_? z76FSA4tQ%)c`1;#CmzG5 z+#)D(wz=Guj|aB;&dU_*(8|cou(5m4q0F_@%Ml<46<*=}Y+qrF{%JvWfE&dcU@3wr5rJY-U>hEIvRYew(j6c(K)T48>CQ};PD2w=Pz=by9iXS_ci{->LQh*- z--{YC)I%T>nlQV=yJndX7C`rKYP845c4ywrzZ}>P$g8-~2vdG>=3<=MoPr=Q#t!=P zm24gIV)M&EqJt@+AN&oe0p(Tx8>-Hi>ov13@yBBb<6*Q;3j`-F6}~PX^x?_=jN84N z|I`4@yE!kVjs(Hzeng;NicTQ)t;B58oEz*!#eF^^#U#hqbq+*RC}dr4?}*hxDJ2+= z?s}{vZUECY)Mw)n`@)dCwcpq_{ylReb+GQ@$t2DBpxp^puW*|Pp}5RJ z`oIO-$ufK)%WZG|!hv#~S34k=6CbDFeVvN$Q3#wDud(0vT-eFlrv(#zoqgVSufQd< zpu?SgFYSZ{+2+iL7xX7@U`m^Z0kB;yB_W}_ zLIVMF-}8(4&1Zq0h8ZCtcrH)O*J0bd(9IJrK3;xEW_{?=(%gFja56EJm*e3$TMY#Y z10tdpM6xNhEe=MxM)#eo5_ zj>r5jsML09q)-3p)1N!O&}R0$+jD_IayvGJ{SIz$Hsca_Z3pX(C6C0S9;Fk#mT0}H z^V17E*ai_ z8P4UBn{CNh_hs2mdMs%!A!mP0E>u>@K*2viT2Y2X?mL2eT8)^J~6T~*L#vE*9(SCH1~@*CLf)* z*gCh}_seC%mebdKV&+An$l-;IIFZB)Io2!(6cfG(_7=<9J(g0?UH5T_x+Vc~i(=LT zFHrG*GXGepdqRE=G12(wDAoS;`#!(XMc$X>xe8o)e1C;M3mCV7Q@fqk4PM-FzwJ!V zxQy|ZL?+zU7kNlbeb{AP*jZy9j5v&uzeTs~CjC^5SGfqo%o+f2ay)mhD>{n`Q?d@9 zSl_RYyyLS(J})V4qDI`uv;YcxBK!#i7`?<#qP^;M%?JMv0V*lXs|*hka?v{gbTWQb z`Lk6VZ{rCyiswBULoQF`165pOMSmqB-X@kfPSO2Hy zZyKxH=U`kTB!A-feqz%D)C8?@`7CMiOxa(yZ~SowRM=#Ey;8j%6xcp*cf}Zskx!O9 z#nNv}_hO3rBX1cYZp+qhPkvfvlRqr6>Smv5I^7zmgSt;>WdytyaC~`aT&|-&UkDjk zjr>x|8(lqRerL+a1v1Z?YkNN!pz9+WY$i`Q#Q33Rj&jT%EqGx>a8K5#KKZ^-)#`n| zH*tIV*0>LG6)C>n5`v_kMaoOl!)06ILPRVi8lF;^K=sGb;W(wKu+Z)8**V9za%FC< zIXmN9zsh`=dg&ix_N{r0e{zMiJ>AaE-fL8-&nt7@jxsCFEGij2c|7Clse_={TOTG88vDZz_4l?jf#dtniGg_%_53yY?XTpG zX7e+h6gBVlvaN8Cr~F~9*X}Rq{u5lTI{ArLgFQ%&r@uzMaQSCa^c+&kb*Zgcz^LT!<2XwlTw12PS93(I!=xwCr{rHaLJdjT1pM8P81}Q9<_&bA|Y%bKOGUHT)mGA4T*mM?ZH`)FV=(a$(Vf$Yyec<0gwc48h$_^xHT z6Fx5vc!VH8xgn<&B<9EFW#l~}eKtZoCFSAB_hHvySCtF~V+xsWJ>fDxnW~ z^6onB>4T5|8MXxLRhKM)jr0ull>`x+2t;U}hw$RP zp1U+@xvMl|7tIIu9h#cUwS9UuY*207g2-3Z<&3P&J&eJ*JlvHySH1|bhSU5<@BV8+%U&Pqj*o^7WgRRPM3?m@R}T*p7~wq0cvZO#05 zsZbn4%;YPp3(GqDTPV>ZO|kB1!g%*bG4+@_#l~>>rt=`r3-BYX%W^(+)L@&FBb6=W zj3&5Qe*DbdzvFPw#FM1u%~``O`ek3odwH8)$IErBmh%w3GT&0pd*}r=keqx)&!Q*} z8&12R1Q*AS=LO7;{_N6ORlH^LRS=K#qxrGPp!G6X{MDu~_9 z*9~o8Lqv)5lE*n=o*J|9WeO}oXpe|cztqKZ-)@$X8&eILGOtx~0CRXRzBK3(nNY=e}E&#mYz3ugvT&`(Wo zUG~A|9*(*4`4t_kE`10SDooJZC}Ynh%HI!0KI4Lglvtk$>jWY^fO0G8co-GsPIpe_ z#NltqxMxW&x3C&QNSn<>QYNS&aRL8xVl;J(@Ou}%iLK~hH zFDsKRVBJXb<{;tLYQ>m`Ltc*F(dl&DKN|jh!Z?yXE4ag##OEeGF5B`tFB`O-V9nqh z?5CIxugB%Ih|sO(N_R5nNxAk_E$}edq{}1GjH$ckOmNYY+YuSNc>!Sl;)hXt(N1a< zhfZ~TxL6R)i9Lqz(?NM(m{qPh=}Jg@P?cckxEy8p`={rAX4;NytAp2Ieu`YQyTH}> z8?!G1qgF)vOnrk*s`^;%6EcH!9%G%YL5;P7^LVV}n#5W8^Nsx&Qk3VD5{~pq1GY;J z(6W}f%gY|=VycDHcSwV~S+CORq-uVo6)ITs-{|)`Ce|yvx-$aUUlu7|s|;sJmcFcW z#7G4b8+LN~dH)t!?#fG8@HCk7@kzpS;Yf7WTessg#%@!s9Qot{y41zIy^Fg=+!sFr zz{NAZsY*AGQx=xOm3LbcglSqQ%I6E6VwJ;irc%(e+cXiF@uSVCj

C>JvG| zOMg86cO-4C-_r-+fLd>5yUj~|$@phHg;R2a!dUp0LHQHj!vm~9B(p2OkKcXqab=Br z1jjFS-u>vMEwm0-d`Ewz(*4e7V(ap!e&X~AO-Ks^u zOk!W53M^F>ix=X!4!d6#`zC31tYC{%kVf?5RriPF$Nhccr+z}aNOz;b^z&C+e| z4j{(?-TnmeB`N*M)V*k!;=gbJIx@cE8-#ECh}|UqhPCjsS&E8Qwb76?1ae2OA%j~< zcQDil5=3JNt9^8%jSLLit8X)X&d$#slo8_B*uMjGP#W+E{lt#N&Ci9w{jN}Yd~3(n zUsU_M{_3JYD_vQ=ny@#sR+8~V)-pgLL3;TzTbnson`UKy_fjZ20+6Wpgm^duoc-p6&S*@@G#8x#T}qDf@RpsNX0 z4}L}&G%0YWk^UfPxDw@7_+x4m&D)bKWTtfDh>&^1{O)sJ-|sWrnFwnOe?DM_l=Uaw z5|+_|r9*VzlE=@JkAuwDEpqJhxcvob?q6-uekTi6hODL^KQasFr}vF(ibFUu4vDqM zSx~Or%|M;Is=&8Rv3k?MhCV+~0SI7T(wE{;qTBr1xtM`XSgFmB(FR6Cq&eI~T%q-}ZR|2e{+`Hb}?c z1{1qFgUx+a>C1!G`l9lTr)MSPsQuLDdOTH_wz#s$y}wHSyYLoL4?+i;nL9M<`-C)G z!L)w%ulwk&39;E%FDcCHxLuJ3(qkeLS}BSqjK+d!pNNm4BXL0(4_=fUrEfNW2r6gP z=KYF@&z6Bf(I*G1V*^<^Fq`SktJg|1Nu_TkJBuAYzHo6~3cH`@QEZTZxDUJRN2nyJ zpnT5D+0QN$k;O{+t^SJ{4r4i;J(B_g=y1L}r&rU+>37xC=D>y~`vL&-(%$xw$tg?q zBg89#o$qWD_%hyZM%Fd7^n@n1s7%-X48dn`?oyL`{aLR{A~?F&{j(kJpG3} z6a>!>0V{5R%(#Zl$i*NP`!y1wD*n0lwikW|iT)uxrRo{xN&j%oRVR-!1;Hc`Nc~-c z!&~FLy9HmgiT%s7EW$$aS?Mk?d9iT`ksTl7b7p^3vo8)g_50Gn>$m}l)Rp$W$^n-8 zASqjZ1GKtuE1 z3v9>!!+!X!WKivsbZzA%Z@@h#!Sh6~PWOpR1x{fO^A}{Www1i+Z`j>0ekU{4&$}I0 z?8)6qspHYJb*D|`$MBcK;O{kIb;@mR zFYOya+H;p>3nMq(n8WPw7e#o}RTBP%fP{Q>+(uB-2iv!wIb|2e;|2R2(&V48>FId; zP%-UeLUKXR;2vAPU4>^-2QaID;CH#NtlhgrIDP2c-LCHNGfGe9+a-M?|2qmVDQ;(( zE0U|Jvff1%fotrw+5!TW-Xh(9chUDU-EF@V<7p(}Giou}7j)sFKXC}=^Ssh-NX2e& zr|8os?b*l=KIPUBDQ+`4#GQ^mhL$5mv<#UMgeIJhgL!u9uw6)`Q0Em-)aqYRN#@U^ zoC8*ZQ!T)pYdqunGwGOeo%(h}BYL)^mk&C$4B)*@xRkz|peQZ#&4z z_?3i0w=Ff2361ap&gc6HnfV2r%xJwJ=e#9sUJ5D&TT|>n9^-m(PP|4U%RFcMM!{~8 z)NId=AFA`oc@laSaTx7{sF~b5BC*uZKFbrQgnrN7N8G2lUi|Z3>?;MS4WGB~@7CW3iAadP zm9sNsXm|zu(jGqb>2gBPQS=jS4 ziUYNVa8Up>)0V8(&Ps~bDH7q7>h&Ru?8|+w(%W48yDslbv+%V~ricjB9{%!6R3C1Z z8H5jG?gVaTU+X@o+ltU=w%ti5^paMM2?X`(<7t?$1uj6)_8FMQckrp~slD=v2VK`Dx?Whi~WDhE(Gkosg&($ee%=<0(*}OkR@5ncq zQ=)s}O~0l0Ka>-PnH!CS~hD>B+CFEIY z>oyDCJxiA_2Ei(gy1#tjC)v9n3H8WS>9VjTzt48{?bGlS>bVpT0gP@xRruS|L>d0r za^~UeZ^x>14gY`Jho9)1c~=E(*x0$q@OD{N)7-Vcx;6}27)_(7czpI}sXsn}to1P$ z#BFrD#lH4|hr^r`cPduu(alN19rX0jA@R8Fxvb*`F>s*W%=5+*u{i&kS!pa+v>k*i zlfS!cZ$Hv}v1o>QKzWOzIw45O#(gM5xslnkQ-$Bdt?La9J6u`)T12ZD>dTUb*Q>H< z;i2lGJ5}eE1CpuocD+A>j=(^)0%Y8q=l%MYxS2d_y6?E=C_wo_lBHmph|0byU&n zhF@Pa;-@eIW*9~Cfm3*3U6G+Y%6dHa7r;O2eN_GIK&K9HmJe*$CBCRXBXegtBV{)1 z(Hgt}+Mu~^N2MM#!_Ems4AzXv(F^tm;SLhq_xYSlcoTcz_Vc9cML;MJVEc5+23eAM zwCxxt;z~?>p;>51yN)oP>R3Q8bPCYX`u6r>!idrlC@M|$ zFUS=Mze$`T3<`0Fgs0rWRo;!{yo-SXZJ}y?p#Fgt3H+si2Blf^foejo%iLD{>1_1O zXW5im$9twIR-?T1_e$8vXg^}W+|Jtd`uJ|I=Yib6bS3`_UURJJ3$%Xsj(Iy=FGs2F zZz)$c4E9@!mbSp2{8ZA|pJqde`$CH7%LU)iZD%0LS~n69arpLy%cwvWb-pOw z0~;!3DZFl_0vUyOBc0FX7KM0$Pv7NL;2+H^d3l!0ECshZMzmZd*O0HK@U!Ucd!n5} zi}){_aQF9qf@82vgrCGAvCmGQ&pbpDm}pT1j^r6h&JMTKzrtfa+nw>=HX*XH3_T$M zLc3MN>3-IBKji8N?f!Eic+berKSl7{>NMZD2lsh+)IipkbaSO9ff2%TZ z`&41wH74HM+7AE9B^WvJ*O9d%eT^5weROhhS+ckBx2@Z#V6ZIZb=7pqjeidU`PYDX zoxca0!H^-e&d8IkU77kJ3de8OFvLEM(;G#@D~MEx&nCVeEIN#>U?XF66OKmD4YzP&Q@7mLpN`PBPRCsHC5OZs~~>+#xWH2+76fomc(*Z!%9<*&U1a(m`a z{_62>PpO~fXy)_jR;l{OoLp&v_um`A!${mE*ox))y6hek`9XGif)(OGQ`$`NenD!`*Xa1bbdZLlf#LR`$g%>tQBlbnIUjwORvKx>tsK6b|N zU}IW0T**DDE>n5LzH<6<%X8J`wm@e;Chs30BYa+Jz?BgXP9ZQfWi(*{GCU$jBZw@itt$Y=#)c!*jsM}T zMB?SFh-o(v<>6v!Gz>>p7oDS5=Ps@3PfCAdR6sREB$?K?HKY4GzsSuA**>iJmx?&@ zIKF%K~!bp<|TbhW!!fQF$-dzwXyynY8vybAm2vHvQ$uc&S z{xC2lKr`Y%elv}>T#MVyYQJ{M7a2r04eJ&E*3uDDB zfcjaqynO7{K6`$v^ZiuUT8j+CxqO_N=}DZzi`(>&C|xQ&$*AiZ%z1N*lINYW_OY1H zbLBMr=;t?Y%@@>wB^8!TO%xF_SwIV6m~lTSB-n^?z2ruIbC_aA)r^(3pvSiUW{2op zz-D*7ZbaEExm~dG_%>T)aXcD0SJeUjrTQ#A1nz9J9D60@^PPJ=)ei)~^q;L&Ourwe z-%Hnw4D=)r;jh8}K-bRg<1VW3EALR!kdXE{g8EY!`}Uj1?e(C&60Kr#{TlGDo}UkJ zifZ7k)UKWB?v@aJk42izQ?Q3As1btF;AHFd2oG#?FB6u2`7Nauek~N z91e8o;tBYN0dbN0`S^f?QqrLs?93jg%>f@ z23aPB`FRv1$Gh6KOBHPA+5PooFAn+EU%%l^XE~pA9KV;IQdqp{ZHlE2XXVH%+Jx_U z{e{TzJc8`fM~+oAoec?fbY)jPyL?{Hg;JJB*lx9>z^7M0C4=ajH$e=$8>EvTpF;tS zjNmfw_vH>&!tocr_iMWVe%=_JD-mQ3&C~Qt)yQ{XGdhsbPX@ceT@d@wa zKtY0k`Pt9CbWM)$f&*)53 zN4&p?Hqjzkyd|7aKGzwxuYe@@A!v2o`!jstUWs`u$4{NaP49-%MLiit+Z_^83b&(CU`**Y#=lIT8)$MS@$VGbxrDBA@@WU9&oST+ZSf<=1dkBZr63(Vx&XK=kbKRDTZho z&E?DHMu1iY0sQ`6pw3&0Z8r@^JfhI^AArSSs!|^DM}4 z1mVsI$J?a{kaR^*;U)hKiu=grK3WKd`qk1C6{V}Vkf_$|evj9A(S7`Urw|Wqk!pM{ z#K*hi+7M5t7H5PS)-NRUU9a(ZGU{};C%D-s2%@jg&}h4yHG*ekU#9f}%+)<~Rpb0B zff3ut?RIZO@+CyP#^f7~+@)lDhDQs#3wD;hg+;ZNi|Wm2g^E!E7usHgSM4E2H0T9$ z0e7D`>%LzOc%LgxZf2iSy!RO;#r{e!8c1q%d{-B8>i3qGqlZdVK2vAsM-9J@%?z#B z{&+fL-?zFFp!KSo#=iT$F$8JBfnZfvysqG1q|00BLTM(0d6IUvvi*>g$fTov3G z6IOO@5JC%oq2`>vjOo9RwMV#^7vV|YenYemjF?XS$|DXJd~PItV2|u{ro3rCTXg!- z&q^})Ptxm_8ZoxZeA5N?`qPjq_Z0TI$ucW!zE1h?eEe9Jz8{4D)LJdaZ{dS2uD$bT zXxC3bX{C^P4H6mvN2!|4ViMd0b%XdkX)I*@82F>#3H94`85k# z+74}i+@&I$8tnKob9LNn4f*%?DH4+KP(d8rtUMkVy{K!(OmW>Jqa4Jhrpc?8fZliD zD(gM{&=;<_AeEq`FKPSoWD(Cc38!A)S1|kecc3)JA64`5AE*89SJR8mR89%w@d2va zO${ESe>`t>B|__A(Pmf#5*lxj&k$+k&@OaJDV!yS%I2bmuG z3VAnEV$+eRf6AlCLUq2wN^(VRikl7j=uJe82Z;gtED@P{P~KCwFe4jf+w1wKsehY? z(=8L-K1&l5$?^Hy2cE?ohqrUpUSk2Ty7q%AhPi2Je1wPMs~}5qy4dKzjEjjnP++0S z#o5#?K|Qv`>14`Xw7A*65<5_tV=jCSo(4Y3u+2(G`v>l1B>UMGox3TbFOiG8Lmt=or+Pl6dLNFCHP+za_@|cKTWU z{dj;p>z3x?O@)|CJ=bc5y^8&=T!*K2IFJvd!dX>tC_CBdpHdmSD$yYl(aR@pY7dKx1 zM)w89QhW%Nb9SFI=Vy5!Y1rp_$yh0vxGQTPlYJJrstQjOAgoocwwX-SsyAi3|6u!m zDnCkHPHhyzdxfJ5m(RDKln8Od1xpGkw?-E}2=Iv#%O;T#@Kmx7q8BotCw`n?&c~lv zdOa_mOApWHs(ygF&(x%9HXv`(-9F=wpUz2Wg81drd0V0MmXXFpn9%*nZsPhi#ms~A z$*Y@ykq+}HL&CldR1RDtN{$zq?AY@^Dy(pC9Pr-U} z86)P%hgZa$*X7;~yHg>M?%K#6vfGCa+x3L{g1U@1#ANZ0L^lSEK>`R%v5%JuU?1P2 z>*ADFKMw4NW2nx)J`C*jK}jY9559jgk~#~kam#h^|j; z#>vsA?$<(o>&zN`O!k5JYxE zWK;TsR37gTD>?j^xCdh2z~#~nQuGyIcigv>Z;GHrp@ojW$T&`Dhg?vzt-6@_VO5{s% zt!)<$f3;^2Nb(_2zle0PRODIz^w;4}JY#)-tLH?O#`9Le)!EZT@Yo}K_~K(kiH}l8 zI29OjVEh^{E?v9K3u*K!s9Un!i&Pxw(ts|E8d(h_3#Me)_G6^#JitsQ93N4WP|~!RdPeWwEJ&qsMtGM>tq@%<3{LM&WthEPyv)^yOBkhN{+Sj`@adzLK zN{+`nVp;~m2utjSSWJkrd!KUU6rD!|RT|p;6_BKpI~6RzNziS%`~yzBf!^zSxoT%* z6}tyf+dlO7X>nhWxfWyw*>kB{`J1K9IfV<{s<&+tPo32KzyiA+fR=+h_li83)AcJ; zH_`RUKd>Whn9J7-q#rR)E%?*z;c4x&5RbwOr{)Q_vsEE`7*zJ_qs$N+C$*Uf^g~cY$@?m*{){6u9MM2DE- zqx7q|8=;hTMyqS=8dJhibxhx{Cw?v#>Y&cstyF7k?R?jcNEq*&?>csChPU7c#bn-y z`&;pf55;_o!w0Z>U2o{$rcHq=zD8KGdvS{50sD5`{aEJhD?zlJ`4)Xhw&_7eilzB zjy#l=UYE_`XWNkx>G5^CFnZAD^3(pY zbY0tuVq5f=5F|Z{fS_bhz&FW3B#OY-_vBQMQTMjTfCxLRFoW*RXQYQ)XgG3iOp398 z4eLbQuQ83kOFCQTOO1YCfj{Wct=)$EesydffM|6R4BX{?uIj;Q&aFc>Y`+%5PY0&j z?<-!&=miop&?Q!bE4_OJ3!bcrV`6Z$-fR0Z^s7$R`sA$=aB6(!-cxCuAt05A zjga2sKH}(>iVnA@1>LQH?h3>26`8hQhCG7h&0QX@Y5pt3S62rYdpvj<-0kp=ugwXU z9T8SccRjU>TF*Bs7E^_JsOcrO%FE~cf1Z#%T+VtDLsXvzlxPL<%>Y8Vp86xqD4Hb6 zucEVr<$HXcEU^a%&!a}HNhOWsfyq(4SO^q!@|zWWsr7w2VVcSe5XxzCk~=Q=`bQ!% zuSnSB$VT=vtnZ>S8<>HP=3(Y}1Z%edoth60h4*zH@CT`ZC3OgT7{tzs&^!uVdP)LlPfkeMHQ4CMZI^ROdLvEZDrC}9!spLz9Ny? zDT+cF#mSL(?i9~K-rda%DZHGGkT&*qu>92CfHSNIvl5fqC@b+u@Z@V+l%=7Nq4#q* zn@~FG`m|3dp^y?QN!Z9 zEgw$mt&ga_b}WgkTPopXA|yIzPD0!WHp;IqV@N=EX-Bh51tI)SUrhN=W`tw9?Vuy0 z`>`+fB6M?R&THYYv-BGtXSQ<)pw^xGxjG%v_7HVl9C?6>HgjCcf9 z!#AA6y2DdFEgyf&eG#S%EUbxMi4fkLw27lFdp!y9WOnR5)`?G)K3|mG7vyS0HW)5V zM_tJlMt9OV%d}FQr|-L-gRJ^2KEc)4sD|Dd=@0h@_tj>~clLB8RKjQP1PH_AY-}r$ zCHMfI^WPqX?NNs|%jsap&VFTBF(Iq!ussdL2!MciGy8xM(KMZ-cf;>jYLGMkID>2V zq&6XjqQpl#HQV$sX%H!k77)pP-EL-XpL8(Y9@pNTglhkw)(<*M895~^dp2;Ox#V*@ zdZo=K&_#5xkSXYMz*yjV=F9>*1*#kR7S>gL#mnLow!314$Mu&dH&$UYCbwq9>2Z;%r9|%MH0>$l_#rmO)=i^i!NELrQ z${tc40FNgvY^YT_KATe7l=a*^)Oj7Q*XKmBYN~)*(m`k9d9}~=LGZS(eYcA1<5tyB zK@wDH9Wz48YX7oYYKYN-%G;!zig@-*y631mAYa3&`Br+TJHy-C#2&iu0iW{^=9})9 z1^n2(uw9x>%TU2S015RzfWoWYp8k>(vA2>BL3Bd(xnyW~fmayZp4^7}u&gXi`@b6c z@{c?4jv<(9!p3~ZrYTQxJhjFR`rmzF(1DfpII_7f*M9r)Iqg}ecml|Ef~#)w#5#FB z@+wSY0E59RLRR{huM^L5tsU*e-8Z<+606x9g1O0Wa28|?uatB8NEPXW`FOwelr0G} zIU`{_F-c`qKVK)X&A}Y)m?t@XY<)nmj8`b;l6s%XJpS_JSHa2b&1x}fT7Wx4Ppe7_ z^7yXY?fb}RC==Lxhz4(Cj|l7FQTLpDCncGRW|zLemp+MyQUzACK$D z(w;w=2aNoC%A>VE;pnMDN95uU1ljJ{f2`rM7Hr!Nm;r7q)E3MAJPV*_KK`zJX?u{sYIF>bI@ zh~VwJ*I@^|%7b1fxDi69pSv5nZcYYKAz@CHLlE(btm>cVG2IUN1>{R26V$lMInrdy z9K>8Dxd-+Hox#s}$KVJp5lzE_q74}W1a~NHd-&-Z$f9`_pMper*LnF%&b0H0Eg-hz zrclH!iV=1wAuw9?eoMu++AQV*^U#hke%>Lgl>_S6y77Uq>|MYaSM?vN0gsxbDM7vu zJ~Fa7Ln&1FG?HkK{vETx0{gr8A9s>K9GdifBX;C9r4=bcaA-($f8T)6RpGq?Pm{DcuID_ z*J82f3A_@6;)o|-1p^~wQG6UGE~E(lViv`wa@9vixgV`JXhJ-<`w&3;HiF(0?) zH`vkT+uvSX@@JSPmrb0jFv)%qi+=6cXQv%RgZoT|-uI_0d-g)XgKj~8P-yBlvi0JvAm$HLy-PQ{U2v0$mnuN&%0ds~kr+TuAjz^jcp9z8!>g{;} zua%MZ+qhcWD=dBz@Rm%)xXz)pP`LV>+eMN2!Ox^48I@SMWQ3UlnsAE9;lWE?xnEln zmoH4Tdzxy=<$V*2M$Gm-`*b^%dJ5^@fIOdl@6C$zNV8?dztgvIfl~UWMWrQaB{u+h9(ChPiMSiW4dUfcVYu%R-_Jen>n-Tg5y|om zSMW#DIzfojhmuo5yyNz8e!geZSiwo`167&p#(MDW_JBV%^o7CUNQy7vKHd2&B1S&E z&%v#H&1d4U&)tg|N1R1ulg;H9mK!_>q0t**ev7q7h2^%Vy7eQVGgJ96UAZs!WPX@) zXd6JfPRmo<1&sGFPb5r~G)c}xDHz{23Go^A+q;WR?!nJ_fUkOaceulPz+~Ik(OdC> z;LDL_yS8TbIR&@35@Tz;)InJL`5Llrhf zIt`Q)Xdv;O8@;nNQR30LB#3~q2V_K%mEN){(pb&tm*DL|mE2Sh0j!LdTL=OMbD5wi_TvfzQeSwK}m@7V3`?G!JWLSmKWhewB(CwNKo zEL_Is3?-5Z?p%-Je0@KFskT}alM;40GUS;LLSF;(j{`~4q2xqg_O%j%Lv;QnKuXII z;*sUIj=M9Ic7eZLt6!|S=S%*CMT|XmmZER^@U+cN+b94nTuWqoEhu5USsZ*Asaps8 zh`Plp{t;54iFI$Z@dmKiNNA`26W4R!N>7h$j{7a1rgZH7^rBV>tT8GLZTVZzjUNSm z4<}1PLJ&=yRo$b9F(l;iNBjV7@7UIZ!Cdfav@nZ2d1ipoeblcPP%ykvGLguJ`KELE ztuV{u1G0(xfUCD58?|rzQSN6&2%9c=2F)|32@h}`?qp2jEWugiU^~7t3;nl(UlD1B zHc#}A8RA)204*7yD?%ika1OYs7#k)uxSmPyu3P#a+Z4$nI%RTwujXJ)D{whX*jU!& z<*i;)C)VfY1E;V9?I;~IgmMddcI~USpVJdF<-K*>dUi!_dN&uEkyTrre?jv;*cFhY zast;a)r7YICw#X2cHhk)1g2nb>z&N^Z5tY!XpKf*a{WuuFMB-hfi5=gyInrSr-(hy zc~gL;?i+HL19ia{Wn7EVHFl2d!TxfOi9KS|ku{B|N|tZCXiSI%8W3izCJqrFtJEO! zOH01*Y68d8mDVkYE(g#EtwcUEf<2Vw+2YSK|{xBi!2_dE}1IIjJU z%O$i${7K~{TV2w27j_h6bFI0%B6la3R6Y?v4InWlo!vh2XreChcAICCm1y`)(k-mt z%z?GJP-X61Fx`AWSAAkuf7j@I5p7t@+jL03rJ=R2jsik`BIb^|)vANER_kAM8Ci|S zQ!u}yp1f_jENHRxH9n!1crg2Nk`BHq+R5z?9!o6YiJ%S(K z3ZJ@fj!)cq93#tD)XcffHmd=}+;rT-@m&vjhuOXD{B=-V;TH-;E@wYGc^-U}V?nQI)#tt==EDfzO; z4$5Pxh*NBn`|JAM^W*CN{@Hwi^rRTV_Pct?mQ^olJ7cdsmC!B18y}oFlZhI>AQVt4 z`|8P&djOscll%JF)8+k6Q>nxaNP>nj&dqvt3QU&$oe)xWhAp5)=^%k+{nIiYDts6C z)C)utC3~)aCQbfk9@PMFjzkLi=9#uwh{5kZ_VxRHp#e?^G1MF;qRJO54UI!3Z^HHH z`1>&trvc$?LW}zAoHJmwVa8@JhsYM@BF%HQt^CtIv9mLOT+4f>$dR;jn;5U#Pw}f* zk8!lhleg5b&CSF6UWrAJ~6FV;^&*>~%YV)u&3etfU*-mL};H%S5N5CW(; z*~%M+T;%hLJ7)XN{EQzwqP>GrU1O1&&!FFX=N?Ys-xaKIx%h1Nuf3pM#tvC>i%0h8 zuhLpf!42*M7Mv7E@DXGeI8a$Zs{y#pREbril=P1N;xfuZjZmB5i&k#Q3R~bUS4#1!#C&+?CnA7E8rnK3w|Bm z=Hsh181tP?+%I6RuH-M=ADg>gy}l@u_k~FAU=WH58Nh$?!q=umGo`c$!mFK5z0^nq zdVdfC$rC#qKJ5E&0(Yo6N6<9XQCY^8BV4Td6}^$d$Rxl(DaAE-NN3U9VIe-s5aQ9a z1tilwIz@(A*9&9(g5<8GT_S($J)kqmJ#f!`iRX`_x4*F+g_+t$@-yUvGGTWb>Ul=0d{2Ar}qGGGT)3D-Vi)ZI2i1N04J&ND4R2wD#TNQ@*p{=*L_` zopdptkhmJ~l#&NK5zQ>{%Ijgzm)(l$=i^C!U&qMRpaQ$ci~c1YDkZ8>?lMIm&a|`% ze#WDZ(m{Hcy2D=58BDbVWgv0nwuaQYj@b)>3Dky(IHH=f z*yj8J-&vu!dHYEN9-@`*OQ`ol@OlQhkrggccB=Tc|9#UCq+iuo@20W|*=Ytn-XYJX zzk(yWb|Q1wMkCx3z&%k+I)&{{ZP~Ndqa9o4??<%eJVy#xz=p%=@?qmbQMjWxDsOFB z4U@IJNtgbEd{R2R$!{V(kMlW=vO9J7? zNEq@f0q22@2b{^Q;!Y(rSngcPmt1_G4Q~w3+f_ftUy7lp@4!(AjpR0*pi)qg`5B@N z>#gIbBVoO;A;{$3WA41S=D5%?N(pIZuEVvPlh=jH&i8%c`(5gji#sGw`zfFRMq{7%qa3RZ&2bxq>l&-Io+@Hi(+CgvQwusSm`Sg6i7&+MkPn2|MW}fj6H!ov(=0 zAUX!<`_<}e3j#oQv>c>Q}CD71N5l*rBj@GJ^DAop*!XGYwsN0+BAvJ_ZsMv09m>Ltf8~A=m)3;}c z@=87j&|y&dkLh#~fJM76grn~}oKW6={!|}T_9!I#WLJfk&u#`8OyF)N>LXIG&Jn=M z?n1N>51eMW(P-tYeP`QSjM}skNJwDG7x+Sa!2fQ)tGxZVZV+#KQ08^vR<7b6{;|<0 zZvRF0^}FW)cqmJW->6UYQ}FcVsXoiyXjSI$zxP!T?U03-ch(QWbWi*!+qaSZ)`chg zdWJ69^~p^}-h_edrLewofQfj0B&>(RMcR_|tyNnGcem)8=ol!8%Y!E|15;;=(BQm% z0i8?1f}EJs^A6JnJ7$g20UG5*o*oA#cx}?DE5W1g-aJ%}r(igJ9nQQ@#k1Dgy{h+g z$wj``BFRa5ap*KC@_Z$}%_GKxj0b=f7|OCfbL)7j#d!RpacG{t02br31l7cZ1+d~&lK%FP?RhEJ15~YJ zc2jXv?TO)jBFt!u_yBL-0_74N1PC0;+kdj0LCEV$jm%{`jK9P6Gasux)?XS27>2jE0wdCi|B$ zarVwrC%eVC*MbrU#ob230*pe4H@TX$ zwGo}^`;S)Yw*22O>f&&r0@tIjl^aS4lkMS>y@)d5u z^8qgMP-L_#&Jb#fvUujW9E}sTGdl%{VUW*MXa|uOFK@2Ld6oCaAS6#4NTc7cv;<9r z_es^9m)Ag+%cOGBVN?P)GR=tS`21dUcgny0?#Hk5xEFAg#U|DKX{=;C(uFPDD<}dF zn!Du?V_2-Nt=}vsvlnMXMl4Sr?Gh2a)Z~|=?p=~-<-v|xa-v!hL3{reZUwZ<3yBfm z?{Yk&-N(@{Rc9NDmtL#VUqE661siCDXYE<=CQ!fdqSUyAj!IcA1MUDX+Ppen&^?+L z*niHC{=LnBTYuh9hwfom{cBN`Jf-w{QQ(EN*Cn}EoIsWlb>c;eNnlg&wpMYVv9uf! zxIpju&qU|9=6dgFt=oUc$L6*ptE5G+0L+h~788?2Gv2LLZfy2+T9^qmI=dEZ4aPIY zfv(HT%hti;bk(l6hDCBBIHFB1Z&~>I?Q9 z^ecV;LE1PPLOA>cXn{ZHL+pUM^q}t#C#vq|u|05>==9Gk(m=tf#>>i9KX~^xbPov* z|MP&})xJwSGv{o|@HS1a-PO?!%|!c0=^07d`MjOGdAR}zh3H%_6s560lDrV8aHjD)~Vsfg3KYo3lBmKkY#Hf6eaq7r|4CPxMbtUhkNaXOZPQ4iwIPrPCxn= zvZumwoeBa28g(xBqC@e%)lQc+vH@)=dP%_<=h(ZL-CY0OFJ>=P?E@Yba86@j5CU&A zxSIU-O11EXG?XvCHQ_|D%~AL$j?WnNsq)XR0W+pfee3Ub+Sz7@V~}shL(bmLfTc@5 z^cS{yrNMH+O~X0lDXbnEH_?K|c(x+ocE`7?OVQT&%wAOxzEr|g1#FK)l`f1E#NqGj z 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%0A7Q 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%0DJ%bjmpTJ*Me?abEZI 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 DV>QA* From e1a35e82e8e158d936287141e09a0f9e699a5d0f Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Tue, 20 Aug 2019 12:16:53 +0000 Subject: [PATCH 0045/1168] Resolve "Extend Readme.md with an overview of the microservice structure and an example using the ui" --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 15b6a388b..dc091e867 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ -# ODS-Main +# Open Data Service (ODS) -Main project for ODS. All related microservice projects for ODS are located in sub-directories. +The Open Data Service (ODS) is an application which can collect data from multiple sources simulataneously, process that data and then offer an improved (or "cleaned") version to its clients. +*We aim to establish the ODS as **the** go-to place for using Open Data!* ## Project Structure From 460be9f06d8405c0d6df4bcb096a672d51b2fcd3 Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Mon, 26 Aug 2019 12:20:15 +0000 Subject: [PATCH 0046/1168] Resolve "ui: Add interval column in pipeline overview" --- ui/src/pipeline/PipelineEdit.vue | 117 ++++++++++++++------------- ui/src/pipeline/PipelineOverview.vue | 20 ++++- 2 files changed, 80 insertions(+), 57 deletions(-) diff --git a/ui/src/pipeline/PipelineEdit.vue b/ui/src/pipeline/PipelineEdit.vue index 2a310b04b..eaa7f51fb 100644 --- a/ui/src/pipeline/PipelineEdit.vue +++ b/ui/src/pipeline/PipelineEdit.vue @@ -90,10 +90,10 @@ - - + Interval: {{dialogIntervalHours}}h {{dialogIntervalMinutes}}m Hours - - + + - \ No newline at end of file diff --git a/ui/src/pipeline/PipelineOverview.vue b/ui/src/pipeline/PipelineOverview.vue index 63bef46b3..c2d4e7570 100644 --- a/ui/src/pipeline/PipelineOverview.vue +++ b/ui/src/pipeline/PipelineOverview.vue @@ -50,6 +50,9 @@ {{ props.item.metadata.author }} + + {{ getHoursFromMS(props.item.trigger.interval) }}h:{{ getMinutesFromMS(props.item.trigger.interval) }}m + Data @@ -78,19 +81,24 @@ import Pipeline from './pipeline'; const namespace = { namespace: 'pipeline' } +const ONE_HOUR_IN_MS = 3600 * 1000 + +const ONE_MINUTE_IN_MS = 60 * 1000 + @Component({}) export default class PipelineOverview extends Vue { @Action('loadPipelines', namespace) private loadPipelinesAction!: () => void; @Action('deletePipeline', namespace) private deletePipelineAction!: (id: number) => void; - + @State('isLoadingPipelines', namespace) private isLoadingPipelines!: boolean; @State('pipelines', namespace) private pipelines!: object[]; - + private headers = [ { text: 'Id', value: 'id' }, { text: 'Pipeline Name', value: 'displayName', sortable: false}, // sorting to be implemented { text: 'Author', value: 'author', sortable: false }, + { text: 'Interval', value: 'interval', sortable: false}, { text: 'Action', value: 'action', sortable: false } ]; @@ -120,5 +128,13 @@ export default class PipelineOverview extends Vue { const searchTerm = !!search ? search.toLowerCase() : '' return items.filter(item => filter(item.metadata.displayName, searchTerm)) } + + private getHoursFromMS (intervalInMS: number): number { + return Math.floor(intervalInMS / ONE_HOUR_IN_MS) + } + + private getMinutesFromMS (intervalInMS: number): number { + return Math.floor((intervalInMS % ONE_HOUR_IN_MS ) / ONE_MINUTE_IN_MS ) + } } From 5cc58fc0b3a17b3f49d186aabe2e99804071d41c Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Mon, 26 Aug 2019 12:25:44 +0000 Subject: [PATCH 0047/1168] Resolve "Use axios as default HTTP/REST client" --- ui/.eslintrc | 3 +- ui/package-lock.json | 37 ++++++++++ ui/package.json | 1 + ui/src/components/auth/module.ts | 1 + ui/src/pipeline/pipelineRest.ts | 74 +++++++++----------- ui/src/pipeline/router.ts | 2 +- ui/src/storage/PipelineStorageOverview.vue | 31 ++++---- ui/src/storage/module.ts | 10 +-- ui/src/storage/storage-item.ts | 14 ++-- ui/src/storage/storageRest.ts | 32 ++++----- ui/src/transformation/TransformationMain.vue | 7 +- ui/src/transformation/module.ts | 8 +-- ui/src/transformation/transformationRest.ts | 21 +++--- 13 files changed, 132 insertions(+), 109 deletions(-) diff --git a/ui/.eslintrc b/ui/.eslintrc index 2e0375815..aa571b0df 100644 --- a/ui/.eslintrc +++ b/ui/.eslintrc @@ -3,7 +3,7 @@ "browser": true, "es6": true }, - + "extends": [ "standard", "plugin:@typescript-eslint/recommended", @@ -26,6 +26,7 @@ ], "rules": { "@typescript-eslint/indent": [2, 2], + "@typescript-eslint/no-use-before-define": ["warn", { "functions": false, "classes": true }], "max-len": [2, 120, 4, { "ignoreUrls": true }], "@typescript-eslint/explicit-function-return-type": [1, {"allowExpressions": true}] } diff --git a/ui/package-lock.json b/ui/package-lock.json index e2e0f116d..ce6fb43db 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -2065,6 +2065,43 @@ "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", "dev": true }, + "axios": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz", + "integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==", + "requires": { + "follow-redirects": "1.5.10", + "is-buffer": "^2.0.2" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "requires": { + "debug": "=3.1.0" + } + }, + "is-buffer": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", + "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", diff --git a/ui/package.json b/ui/package.json index 48552116f..30bbab84f 100644 --- a/ui/package.json +++ b/ui/package.json @@ -9,6 +9,7 @@ }, "dependencies": { "@types/node": "^12.6.2", + "axios": "^0.19.0", "clipboard-copy": "^3.0.0", "keycloak-js": "^6.0.1", "vue": "^2.6.10", diff --git a/ui/src/components/auth/module.ts b/ui/src/components/auth/module.ts index aefd326b8..2d2f8cad0 100644 --- a/ui/src/components/auth/module.ts +++ b/ui/src/components/auth/module.ts @@ -14,6 +14,7 @@ const AUTH_SERVICE_URL: string = process.env.VUE_APP_AUTH_SERVICE_URL as string @Module({ namespaced: true }) export default class AuthModule extends VuexModule { private isAuth: boolean = false + private userProfile: KeycloakProfile = {} @Action({ commit: 'setAuth' }) diff --git a/ui/src/pipeline/pipelineRest.ts b/ui/src/pipeline/pipelineRest.ts index 38b20680b..7a6fc4857 100644 --- a/ui/src/pipeline/pipelineRest.ts +++ b/ui/src/pipeline/pipelineRest.ts @@ -1,56 +1,50 @@ +import axios, { AxiosResponse } from 'axios' import Pipeline from './pipeline' const CORE_SERVICE_URL = process.env.VUE_APP_CORE_SERVICE_URL as string +/** + * Axios instance with default headers and base url. + * The option transformResponse is set to an empty array + * because of explicit JSON.parser call with custom reviver. + */ +const http = axios.create({ + baseURL: `${CORE_SERVICE_URL}/pipelines`, + headers: { 'Content-Type': 'application/json' }, + transformResponse: [] +}) + +/** + * This reviver function replaces firstExecution attribute with a date object + * if the current type is string. + */ +const reviver = (key: string, value: object): object => { + if (key === 'firstExecution' && typeof value === 'string') { + return new Date(value) + } + + return value +} + export async function getAllPipelines (): Promise { - const response = await fetch(`${CORE_SERVICE_URL}/pipelines`) - const data = await response.json() - return parsePipelines(data) + const response = await http.get('/') + return JSON.parse(response.data, reviver) } export async function getPipelineById (id: number): Promise { - const response = await fetch(`${CORE_SERVICE_URL}/pipelines/${id}`) - const data = await response.json() - return parsePipeline(data) + const response = await http.get(`/${id}`) + return JSON.parse(response.data, reviver) } export async function createPipeline (pipeline: Pipeline): Promise { - const options = { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify(pipeline) } - - const response = await fetch(`${CORE_SERVICE_URL}/pipelines`, options) - const data = await response.json() - return parsePipeline(data) -} - -export async function updatePipeline (pipeline: Pipeline): Promise { - const options = { - method: 'PUT', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify(pipeline) } - - return fetch(`${CORE_SERVICE_URL}/pipelines/${pipeline.id}`, options) + const response = await http.post('/', JSON.stringify(pipeline)) + return JSON.parse(response.data, reviver) } -export async function deletePipeline (pipelineId: number): Promise { - const options = { method: 'DELETE' } - return fetch(`${CORE_SERVICE_URL}/pipelines/${pipelineId}`, options) +export async function updatePipeline (pipeline: Pipeline): Promise { + return http.put(`/${pipeline.id}`, JSON.stringify(pipeline)) } -function parsePipelines (pipelines: any[]): Pipeline[] { - const parsedPipelines: Pipeline[] = [] - pipelines.forEach(x => parsedPipelines.push(parsePipeline(x))) - return parsedPipelines +export async function deletePipeline (id: number): Promise { + return http.delete(`/${id}`) } - -function parsePipeline (pipeline: any): Pipeline { - const parsedPipeline = pipeline as Pipeline; - parsedPipeline.trigger.firstExecution = new Date(pipeline.trigger.firstExecution) - return parsedPipeline; -} \ No newline at end of file diff --git a/ui/src/pipeline/router.ts b/ui/src/pipeline/router.ts index edee317f8..80ddf4faf 100644 --- a/ui/src/pipeline/router.ts +++ b/ui/src/pipeline/router.ts @@ -18,6 +18,6 @@ export default [ path: '/pipeline/edit', name: 'pipeline-edit', component: PipelineEdit, - meta: { title: 'Edit Pipeline', requiresAuth: true, isEditMode: true }, + meta: { title: 'Edit Pipeline', requiresAuth: true, isEditMode: true } } ] diff --git a/ui/src/storage/PipelineStorageOverview.vue b/ui/src/storage/PipelineStorageOverview.vue index 983fd798f..71b266eb1 100644 --- a/ui/src/storage/PipelineStorageOverview.vue +++ b/ui/src/storage/PipelineStorageOverview.vue @@ -107,35 +107,36 @@ const namespace = { namespace: 'storage' } @Component export default class PipelineStorageOverview extends Vue { + @State('data', namespace) - private data!: StorageItem[]; + private data!: StorageItem[] + + @Action('fetchData', namespace) + private fetchData!: (pipelineId: string) => void - private storageId: string = ''; + private pipelineId: string = '' private clipUrl: (content: string) => Promise = clipboardCopy - private getStorageItemUrl (storageId: string, itemId: string): string { - let url = StorageClient.getItemUrl(storageId, itemId) + private getStorageItemUrl (pipelineId: string, itemId: string): string { + let url = StorageClient.createUrlForItem(pipelineId, itemId) if(url.startsWith("/")) { url = window.location.origin + url } - return url; + return url }; - private getLatestStorageItemUrl (storageId: string): string { - let url = StorageClient.getLatestItemUrl(storageId) + private getLatestStorageItemUrl (pipelineId: string): string { + let url = StorageClient.createUrlForLatestItem(pipelineId) if(url.startsWith("/")) { url = window.location.origin + url } - return url; - } - - created() { - this.storageId = this.$route.params.storageId; - this.fetchData(this.storageId); + return url } - @Action('fetchData', namespace) - private fetchData!: (storageId: string) => void; + private created () { + this.pipelineId = this.$route.params.storageId + this.fetchData(this.pipelineId) + } } diff --git a/ui/src/storage/module.ts b/ui/src/storage/module.ts index 4eb0e64f6..9ff47f557 100644 --- a/ui/src/storage/module.ts +++ b/ui/src/storage/module.ts @@ -1,20 +1,20 @@ import { Module, VuexModule, Mutation, Action } from 'vuex-module-decorators' -import * as StorageRestService from './storageRest' -import { StorageItem } from '@/storage/storage-item'; +import * as StorageRest from './storageRest' +import { StorageItem } from '@/storage/storage-item' @Module({ namespaced: true }) export default class StorageModule extends VuexModule { private data: StorageItem[] = [] @Action({ commit: 'setData' }) - public async fetchData (storageId: string): Promise { + public async fetchData (pipelineId: string): Promise { try { - return await StorageRestService.getData(storageId) + return await StorageRest.getStoredItems(pipelineId) } catch (e) { return Promise.resolve([]) } } - + @Mutation private setData (data: StorageItem[]): void { this.data = data.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()) } diff --git a/ui/src/storage/storage-item.ts b/ui/src/storage/storage-item.ts index c6733433f..1166f11a2 100644 --- a/ui/src/storage/storage-item.ts +++ b/ui/src/storage/storage-item.ts @@ -1,8 +1,8 @@ export interface StorageItem { - id: number, - data: object, - timestamp: string, - origin: string, - license: string, - pipelineId: string -} \ No newline at end of file + id: number; + data: object; + timestamp: string; + origin: string; + license: string; + pipelineId: string; +} diff --git a/ui/src/storage/storageRest.ts b/ui/src/storage/storageRest.ts index 6c8da1f2c..448d82773 100644 --- a/ui/src/storage/storageRest.ts +++ b/ui/src/storage/storageRest.ts @@ -1,28 +1,22 @@ -import {StorageItem} from '@/storage/storage-item' +import axios from 'axios' +import { StorageItem } from '@/storage/storage-item' const STORAGE_SERVICE_URL = process.env.VUE_APP_STORAGE_SERVICE_URL as string -export async function getData (storageId: string): Promise { - const requestUrl = getUrl(storageId) - return fetch(requestUrl, { - method: 'GET', - mode: 'cors', - headers: { - 'Content-Type': 'application/json' - } - }).then(response => { - return response.json() - }) -} +const http = axios.create({ + baseURL: STORAGE_SERVICE_URL, + headers: { 'Content-Type': 'application/json' } +}) -export function getUrl(storageId: string): string { - return `${STORAGE_SERVICE_URL}/${storageId}` +export async function getStoredItems (pipelineId: string): Promise { + const response = await http.get(`/${pipelineId}`) + return response.data } -export function getItemUrl(storageId: string, itemId: string): string { - return `${getUrl(storageId)}?id=eq.${itemId}` +export function createUrlForItem (pipelineId: string, itemId: string): string { + return `${STORAGE_SERVICE_URL}/${pipelineId}?id=eq.${itemId}` } -export function getLatestItemUrl(storageId: string): string { - return `${getUrl(storageId)}?order=id.desc&limit=1` +export function createUrlForLatestItem (pipelineId: string): string { + return `${STORAGE_SERVICE_URL}/${pipelineId}?order=id.desc&limit=1` } diff --git a/ui/src/transformation/TransformationMain.vue b/ui/src/transformation/TransformationMain.vue index fae455cfd..7d88ef3de 100644 --- a/ui/src/transformation/TransformationMain.vue +++ b/ui/src/transformation/TransformationMain.vue @@ -29,14 +29,13 @@ const namespace = { namespace: 'transformation' } @Component export default class TransformationMain extends Vue { @State('transformationResult', namespace) - // TODO: remove if possible - // eslint-disable-next-line @typescript-eslint/no-explicit-any - private transformationResult!: any; + + private transformationResult!: object; @Action('transformData', namespace) private transformData!: (functionInput: string) => void; - private functionInput: string = '{"func":"return 1", "data":null}'; + private functionInput: string = '{"func":"return 42", "data":null}'; private submit () { this.transformData(this.functionInput) diff --git a/ui/src/transformation/module.ts b/ui/src/transformation/module.ts index a4281fb39..0fbd5f915 100644 --- a/ui/src/transformation/module.ts +++ b/ui/src/transformation/module.ts @@ -1,15 +1,13 @@ import { Module, VuexModule, Mutation, Action } from 'vuex-module-decorators' -import * as TransformationRestService from './transformationRest' +import * as TransformationRest from './transformationRest' @Module({ namespaced: true }) export default class TransformationModule extends VuexModule { private transformationResult: object = {} @Action({ commit: 'setTransformationResult' }) - // TODO: remove if possible - // eslint-disable-next-line @typescript-eslint/no-explicit-any - public async transformData (inputFunc: string): Promise { - return TransformationRestService.transformData(inputFunc) + public async transformData (inputFunc: string): Promise { + return TransformationRest.transformData(inputFunc) } @Mutation private setTransformationResult (value: object): void { diff --git a/ui/src/transformation/transformationRest.ts b/ui/src/transformation/transformationRest.ts index c16b8320a..9466cc1d6 100644 --- a/ui/src/transformation/transformationRest.ts +++ b/ui/src/transformation/transformationRest.ts @@ -1,28 +1,25 @@ +import axios from 'axios' import { useBearer } from '@/keycloak' -const TRANSFORMATION_SERVICE_URL = process.env.TRANSFORMATION_SERVICE_URL as string +const TRANSFORMATION_SERVICE_URL = process.env.VUE_APP_TRANSFORMATION_SERVICE_URL as string -// TODO: remove if possible -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export async function transformData (inputFunc: string): Promise { - console.log(process.env.VUE_APP_TRANSFORMATION_SERVICE_URL) +export async function transformData (inputFunc: string): Promise { const token = await useBearer().catch(error => { console.error('Unable to get keycloak token. Error: ' + error) }) if (token === undefined) { - return + return {} } - return fetch(TRANSFORMATION_SERVICE_URL, { - method: 'POST', - mode: 'cors', - body: inputFunc, + const http = axios.create({ + baseURL: TRANSFORMATION_SERVICE_URL, headers: { 'Content-Type': 'application/json', Authorization: 'Bearer ' + token } - }).then(response => { - return response.json() }) + + const response = await http.post('/', inputFunc) + return response.data } From dbe22288010b9e67d29e3c650b1267806351a318 Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Tue, 27 Aug 2019 09:31:43 +0000 Subject: [PATCH 0048/1168] Resolve "Pipeline-Scheduling Optimization: Snapshots and Deltas" --- core/integration-test/src/core.test.js | 114 +++++++++++++-- .../ods/coreservice/model/EventType.java | 5 + .../ods/coreservice/model/PipelineConfig.java | 22 --- .../ods/coreservice/model/PipelineEvent.java | 61 ++++++++ .../coreservice/pipeline/PipelineManager.java | 116 ++++++++++++++++ .../repository/EventRepository.java | 17 +++ .../coreservice/rest/v1/EventsEndpoint.java | 44 ++++++ .../rest/v1/PipelinesEndpoint.java | 49 ++++--- .../coreservice/model/PipelineEventTest.java | 24 ++++ .../pipeline/PipelineManagerTest.java | 130 ++++++++++++++++++ scheduler/integration-test/src/mock.core.js | 84 ++++++++++- .../integration-test/src/mock.storage.js | 4 + .../integration-test/src/scheduler.test.js | 35 ++++- scheduler/src/adapter-client.ts | 20 ++- scheduler/src/core-client.ts | 36 +++++ scheduler/src/index.ts | 55 ++++---- scheduler/src/pipeline-event.ts | 11 ++ scheduler/src/pipeline-scheduling.test.ts | 108 +++++++++++++-- scheduler/src/pipeline-scheduling.ts | 130 ++++++++++++++---- scheduler/src/storage-client.ts | 3 +- scheduler/src/transformation-client.ts | 20 ++- 21 files changed, 936 insertions(+), 152 deletions(-) create mode 100644 core/src/main/java/org/jvalue/ods/coreservice/model/EventType.java create mode 100644 core/src/main/java/org/jvalue/ods/coreservice/model/PipelineEvent.java create mode 100644 core/src/main/java/org/jvalue/ods/coreservice/pipeline/PipelineManager.java create mode 100644 core/src/main/java/org/jvalue/ods/coreservice/repository/EventRepository.java create mode 100644 core/src/main/java/org/jvalue/ods/coreservice/rest/v1/EventsEndpoint.java create mode 100644 core/src/test/java/org/jvalue/ods/coreservice/model/PipelineEventTest.java create mode 100644 core/src/test/java/org/jvalue/ods/coreservice/pipeline/PipelineManagerTest.java create mode 100644 scheduler/src/core-client.ts create mode 100644 scheduler/src/pipeline-event.ts diff --git a/core/integration-test/src/core.test.js b/core/integration-test/src/core.test.js index f5698c4ae..859995e7d 100644 --- a/core/integration-test/src/core.test.js +++ b/core/integration-test/src/core.test.js @@ -1,7 +1,7 @@ const request = require("supertest"); const waitOn = require("wait-on"); -const URL = process.env.CORE_API || "http://localhost:9000/core"; +const URL = process.env.CORE_API || "http://localhost:8080"; describe("Core", () => { console.log("Core-Service URL= " + URL); @@ -40,19 +40,19 @@ describe("Core", () => { .send(pipelineConfig); expect(response.status).toEqual(201); - expect(response.header.location).toContain(response.body.id) + expect(response.header.location).toContain(response.body.id); expect(response.body.transformations).toEqual(pipelineConfig.transformations); expect(response.body.adapter).toEqual(pipelineConfig.adapter); expect(response.body.trigger).toEqual(pipelineConfig.trigger); expect(response.body.id).toBeDefined(); - expect(response.body.id).not.toEqual(pipelineConfig.id) // id not under control of client + expect(response.body.id).not.toEqual(pipelineConfig.id); // id not under control of client const delResponse = await request(URL) .delete("/pipelines/" + response.body.id) - .send() + .send(); - expect(delResponse.status).toEqual(200); - }) + expect(delResponse.status).toEqual(204); + }); test("PUT & DELETE /pipelines/{id}", async () => { @@ -86,11 +86,105 @@ describe("Core", () => { const delResponse = await request(URL) .delete("/pipelines/" + pipelineId) - .send() + .send(); - expect(delResponse.status).toEqual(200); - } - ) + expect(delResponse.status).toEqual(204); + }); + + test("DELETE /pipelines/", async () => { + + await request(URL) + .post("/pipelines") + .send(pipelineConfig); + await request(URL) + .post("/pipelines") + .send(pipelineConfig); + + const delResponse = await request(URL) + .delete("/pipelines/") + .send(); + + expect(delResponse.status).toEqual(204) + }); + + test("GET /events", async () => { + const response = await request(URL) + .get("/events") + .send(); + + expect(response.status).toEqual(200); + expect(response.type).toEqual("application/json"); + }); + + test("GET /events/pipeline/{id}", async () => { + const pipelinesResponse = await request(URL) + .post("/pipelines") + .send(pipelineConfig); + const pipelineId = pipelinesResponse.body.id; + + await request(URL) + .delete("/pipelines/" + pipelineId); + + const eventsResponse = await request(URL) + .get("/events/pipeline/"+pipelineId) + .send(); + + expect(eventsResponse.status).toEqual(200); + expect(eventsResponse.type).toEqual("application/json"); + expect(eventsResponse.body.length).toBe(2); + expect(eventsResponse.body[0].pipelineConfig).toBe(pipelineId); + expect(eventsResponse.body[0].eventType).toEqual("PIPELINE_CREATE"); + expect(eventsResponse.body[1].pipelineConfig).toBe(pipelineId); + expect(eventsResponse.body[1].eventType).toEqual("PIPELINE_DELETE"); + }); + + test("GET /events [with offset]", async () => { + const pipelinesResponse = await request(URL) + .post("/pipelines") + .send(pipelineConfig); + const pipelineId = pipelinesResponse.body.id; + + await request(URL) + .delete("/pipelines/" + pipelineId); + + const eventsResponse = await request(URL) + .get("/events/pipeline/"+pipelineId) + .send(); + const eventId = eventsResponse.body[0].eventId; + + const eventsAfter = await request(URL) + .get("/events?after="+eventId) + .send(); + + expect(eventsAfter.status).toEqual(200); + expect(eventsAfter.type).toEqual("application/json"); + expect(eventsAfter.body.length).toBe(1); + expect(eventsAfter.body[0].eventId).toBe(eventId+1); + expect(eventsAfter.body[0].pipelineConfig).toBe(pipelineId); + expect(eventsAfter.body[0].eventType).toEqual("PIPELINE_DELETE"); + }); + + test("GET /events/latest", async () => { + const postResponse = await request(URL) + .post("/pipelines") + .send(pipelineConfig); + const pipelineId = postResponse.body.id; + + await request(URL) + .delete("/pipelines/" + pipelineId) + .send(); + + const response = await request(URL) + .get("/events/latest") + .send(); + + expect(response.status).toEqual(200); + expect(response.type).toEqual("application/json"); + expect(Object.keys(response.body)).toHaveLength(3); + expect(response.body.eventId).toBeTruthy(); + expect(response.body.pipelineConfig).toBe(pipelineId); + expect(response.body.eventType).toEqual("PIPELINE_DELETE"); + }) }); const pipelineConfig = { diff --git a/core/src/main/java/org/jvalue/ods/coreservice/model/EventType.java b/core/src/main/java/org/jvalue/ods/coreservice/model/EventType.java new file mode 100644 index 000000000..63183f7af --- /dev/null +++ b/core/src/main/java/org/jvalue/ods/coreservice/model/EventType.java @@ -0,0 +1,5 @@ +package org.jvalue.ods.coreservice.model; + +public enum EventType { + PIPELINE_UPDATE, PIPELINE_CREATE, PIPELINE_DELETE +} diff --git a/core/src/main/java/org/jvalue/ods/coreservice/model/PipelineConfig.java b/core/src/main/java/org/jvalue/ods/coreservice/model/PipelineConfig.java index c921c59a8..a02c030e5 100644 --- a/core/src/main/java/org/jvalue/ods/coreservice/model/PipelineConfig.java +++ b/core/src/main/java/org/jvalue/ods/coreservice/model/PipelineConfig.java @@ -105,26 +105,4 @@ public PipelineMetadata getMetadata() { return metadata; } - /** - * Create an updated PipelineConfig using the full representation of an update. This method ensures that id and creation time remain stable. - * @param updateConfig the representation of the updated config - * @return an updated PipelineConfig that has the same id and creationTimestamp as the original one. - */ - public PipelineConfig applyUpdate(PipelineConfig updateConfig) { - PipelineMetadata updatedMetadata = new PipelineMetadata( - updateConfig.metadata.getAuthor(), - updateConfig.metadata.getLicense(), - updateConfig.metadata.getDisplayName(), - updateConfig.metadata.getDescription()); - updatedMetadata.setCreationTimestamp(this.getMetadata().getCreationTimestamp()); - - PipelineConfig updated = new PipelineConfig( - updateConfig.adapter, - updateConfig.transformations, - updateConfig.trigger, - updatedMetadata); - updated.setId(this.id); - - return updated; - } } diff --git a/core/src/main/java/org/jvalue/ods/coreservice/model/PipelineEvent.java b/core/src/main/java/org/jvalue/ods/coreservice/model/PipelineEvent.java new file mode 100644 index 000000000..57af8a3f7 --- /dev/null +++ b/core/src/main/java/org/jvalue/ods/coreservice/model/PipelineEvent.java @@ -0,0 +1,61 @@ +package org.jvalue.ods.coreservice.model; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; +import java.util.Objects; + +@Entity +public class PipelineEvent { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long eventId; + + @NotNull + private EventType eventType; + + @NotNull + private Long pipelineId; + + + //Constructor for JPA + private PipelineEvent() {} + + @JsonCreator + public PipelineEvent( + @JsonProperty("eventType") @NotNull EventType eventType, + @JsonProperty("pipelineConfig")@NotNull Long pipelineId) { + this.eventType = eventType; + this.pipelineId = pipelineId; + } + + public Long getEventId() { + return eventId; + } + + public String getEventType() { + return eventType.name(); + } + + public Long getPipelineId() { + return pipelineId; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + PipelineEvent that = (PipelineEvent) o; + return eventId.equals(that.eventId) && + eventType.equals(that.eventType) && + pipelineId.equals(that.pipelineId); + } + + @Override + public int hashCode() { + return Objects.hash(eventId, eventType, pipelineId); + } +} diff --git a/core/src/main/java/org/jvalue/ods/coreservice/pipeline/PipelineManager.java b/core/src/main/java/org/jvalue/ods/coreservice/pipeline/PipelineManager.java new file mode 100644 index 000000000..66412410d --- /dev/null +++ b/core/src/main/java/org/jvalue/ods/coreservice/pipeline/PipelineManager.java @@ -0,0 +1,116 @@ +package org.jvalue.ods.coreservice.pipeline; + +import org.jvalue.ods.coreservice.model.EventType; +import org.jvalue.ods.coreservice.model.PipelineConfig; +import org.jvalue.ods.coreservice.model.PipelineEvent; +import org.jvalue.ods.coreservice.model.PipelineMetadata; +import org.jvalue.ods.coreservice.repository.EventRepository; +import org.jvalue.ods.coreservice.repository.PipelineRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; + +@Service +public class PipelineManager { + + private final PipelineRepository pipelineRepository; + private final EventRepository eventRepository; + + + @Autowired + public PipelineManager(PipelineRepository pipelineRepository, EventRepository eventRepository) { + this.pipelineRepository = pipelineRepository; + this.eventRepository = eventRepository; + } + + + @Transactional + public PipelineConfig createPipeline(PipelineConfig config) { + PipelineConfig savedConfig = pipelineRepository.save(config); + eventRepository.save(new PipelineEvent(EventType.PIPELINE_CREATE, savedConfig.getId())); + return savedConfig; + } + + + public Optional getPipeline(Long id) { + return pipelineRepository.findById(id); + } + + + public Iterable getAllPipelines() { + return pipelineRepository.findAll(); + } + + + @Transactional + public void updatePipeline(Long id, PipelineConfig updated) throws IllegalArgumentException { + PipelineConfig old = pipelineRepository.findById(id) + .orElseThrow(() -> new IllegalArgumentException("Pipeline with id " + id + " not found.")); + + pipelineRepository.save(applyUpdate(old, updated)); + eventRepository.save(new PipelineEvent(EventType.PIPELINE_UPDATE, id)); + } + + + @Transactional + public void deletePipeline(Long id) { + pipelineRepository.deleteById(id); + eventRepository.save(new PipelineEvent(EventType.PIPELINE_DELETE, id)); + } + + + @Transactional + public void deleteAllPipelines() { + Iterable allPipelines = getAllPipelines(); + pipelineRepository.deleteAll(); + + allPipelines.forEach( + pl -> eventRepository.save(new PipelineEvent(EventType.PIPELINE_DELETE, pl.getId())) + ); + } + + /** + * Create an updated PipelineConfig using the full representation of an update. This method ensures that id and creation time remain stable. + * @param updateConfig the representation of the updated config + * @return an updated PipelineConfig that has the same id and creationTimestamp as the original one. + */ + private PipelineConfig applyUpdate(PipelineConfig existing, PipelineConfig updateConfig) { + PipelineMetadata updatedMetadata = new PipelineMetadata( + updateConfig.getMetadata().getAuthor(), + updateConfig.getMetadata().getLicense(), + updateConfig.getMetadata().getDisplayName(), + updateConfig.getMetadata().getDescription()); + updatedMetadata.setCreationTimestamp(existing.getMetadata().getCreationTimestamp()); + + PipelineConfig updated = new PipelineConfig( + updateConfig.getAdapter(), + updateConfig.getTransformations(), + updateConfig.getTrigger(), + updatedMetadata); + updated.setId(existing.getId()); + + return updated; + } + + public Optional getEvent(Long id) { + return eventRepository.findById(id); + } + + public Iterable getEventsAfter(Long id) { + return eventRepository.getAllByEventIdAfter(id); + } + + public Iterable getEventsByPipeline(Long pipelineId) { + return eventRepository.getAllByPipelineId(pipelineId); + } + + public PipelineEvent getLatestEvent() { + return eventRepository.findFirstByOrderByEventIdDesc(); + } + +} diff --git a/core/src/main/java/org/jvalue/ods/coreservice/repository/EventRepository.java b/core/src/main/java/org/jvalue/ods/coreservice/repository/EventRepository.java new file mode 100644 index 000000000..ad51b4cb5 --- /dev/null +++ b/core/src/main/java/org/jvalue/ods/coreservice/repository/EventRepository.java @@ -0,0 +1,17 @@ +package org.jvalue.ods.coreservice.repository; + +import org.jvalue.ods.coreservice.model.PipelineEvent; +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + +import javax.validation.constraints.NotNull; + +@Repository +public interface EventRepository extends CrudRepository { + + Iterable getAllByPipelineId(@NotNull Long pipelineId); + + Iterable getAllByEventIdAfter(@NotNull Long eventId); + + PipelineEvent findFirstByOrderByEventIdDesc(); +} diff --git a/core/src/main/java/org/jvalue/ods/coreservice/rest/v1/EventsEndpoint.java b/core/src/main/java/org/jvalue/ods/coreservice/rest/v1/EventsEndpoint.java new file mode 100644 index 000000000..f8af6dbda --- /dev/null +++ b/core/src/main/java/org/jvalue/ods/coreservice/rest/v1/EventsEndpoint.java @@ -0,0 +1,44 @@ +package org.jvalue.ods.coreservice.rest.v1; + +import org.jvalue.ods.coreservice.model.PipelineEvent; +import org.jvalue.ods.coreservice.pipeline.PipelineManager; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.server.ResponseStatusException; + +import javax.validation.constraints.NotNull; +import java.util.List; + +@RestController +@RequestMapping("/events") +public class EventsEndpoint { + + private final PipelineManager pipelineManager; + + @Autowired + public EventsEndpoint(PipelineManager pipelineManager) { + this.pipelineManager = pipelineManager; + } + + @GetMapping("/{id}") + public PipelineEvent getEvent(@NotNull @PathVariable Long id) { + return pipelineManager.getEvent(id) + .orElseThrow( () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Could not find event with id " + id)); + } + + @GetMapping + public Iterable getEvents(@RequestParam(value = "after", defaultValue = "0") Long after) { + return pipelineManager.getEventsAfter(after); + } + + @GetMapping("/pipeline/{id}") + public Iterable getEventsByPipeline(@NotNull @PathVariable Long id) { + return pipelineManager.getEventsByPipeline(id); + } + + @GetMapping("/latest") + public PipelineEvent getLatestEvent() { + return pipelineManager.getLatestEvent(); + } +} diff --git a/core/src/main/java/org/jvalue/ods/coreservice/rest/v1/PipelinesEndpoint.java b/core/src/main/java/org/jvalue/ods/coreservice/rest/v1/PipelinesEndpoint.java index 89b928b57..ae45ee24f 100644 --- a/core/src/main/java/org/jvalue/ods/coreservice/rest/v1/PipelinesEndpoint.java +++ b/core/src/main/java/org/jvalue/ods/coreservice/rest/v1/PipelinesEndpoint.java @@ -1,7 +1,7 @@ package org.jvalue.ods.coreservice.rest.v1; import org.jvalue.ods.coreservice.model.PipelineConfig; -import org.jvalue.ods.coreservice.repository.PipelineRepository; +import org.jvalue.ods.coreservice.pipeline.PipelineManager; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -17,35 +17,36 @@ @RequestMapping("/pipelines") public class PipelinesEndpoint { - private final PipelineRepository pipelineRepository; + private final PipelineManager pipelineManager; @Autowired - public PipelinesEndpoint(PipelineRepository pipelineRepository) { - this.pipelineRepository = pipelineRepository; + public PipelinesEndpoint(PipelineManager pipelineManager) { + this.pipelineManager = pipelineManager; } @GetMapping public Iterable getPipelines() { - return pipelineRepository.findAll(); + return pipelineManager.getAllPipelines(); } @GetMapping("/{id}") public PipelineConfig getPipeline(@PathVariable Long id) { - return pipelineRepository.findById(id) + return pipelineManager.getPipeline(id) .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Could not find pipeline with id " + id)); } @PostMapping - public ResponseEntity addPipeline(@Valid @RequestBody PipelineConfig config) { - config.setId(null); // id not under control of client - PipelineConfig savedConfig = pipelineRepository.save(config); + public ResponseEntity addPipeline(@Valid @RequestBody PipelineConfig config) { + config.setId(null); // id not under control of client - URI location = ServletUriComponentsBuilder.fromCurrentRequest() - .path("/{id}") - .buildAndExpand(savedConfig.getId()) - .toUri(); + PipelineConfig savedConfig = pipelineManager.createPipeline(config); - return ResponseEntity.created(location).body(savedConfig); + URI location = ServletUriComponentsBuilder.fromCurrentRequest() + .path("/{id}") + .buildAndExpand(savedConfig.getId()) + .toUri(); + + return ResponseEntity.created(location).body(savedConfig); } @PutMapping("/{id}") @@ -53,16 +54,22 @@ public ResponseEntity addPipeline(@Valid @RequestBody PipelineCo public void updatePipeline( @PathVariable Long id, @Valid @RequestBody PipelineConfig updateConfig) { - PipelineConfig oldConfig = pipelineRepository.findById(id) - .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Could not find pipeline with id " + id + ". Can only update existing pipelines.")); - - pipelineRepository.save(oldConfig.applyUpdate(updateConfig)); + try { + pipelineManager.updatePipeline(id, updateConfig); + } catch (IllegalArgumentException e) { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Pipeline needs to exist before updating", e); + } } @DeleteMapping("/{id}") - public ResponseEntity deletePipeline(@PathVariable Long id) { - pipelineRepository.deleteById(id); + @ResponseStatus(HttpStatus.NO_CONTENT) + public void deletePipeline(@PathVariable Long id) { + pipelineManager.deletePipeline(id); + } - return ResponseEntity.ok().build(); + @DeleteMapping("/") + @ResponseStatus(HttpStatus.NO_CONTENT) + public void deleteAllPipelines() { + pipelineManager.deleteAllPipelines(); } } diff --git a/core/src/test/java/org/jvalue/ods/coreservice/model/PipelineEventTest.java b/core/src/test/java/org/jvalue/ods/coreservice/model/PipelineEventTest.java new file mode 100644 index 000000000..aecbcd39f --- /dev/null +++ b/core/src/test/java/org/jvalue/ods/coreservice/model/PipelineEventTest.java @@ -0,0 +1,24 @@ +package org.jvalue.ods.coreservice.model; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class PipelineEventTest { + private final ObjectMapper mapper = new ObjectMapper(); + + @Test + public void testSerialization() { + PipelineEvent event = new PipelineEvent(EventType.PIPELINE_CREATE, 123L); + + JsonNode result = mapper.valueToTree(event); + + System.out.println(result); + assertEquals(3, result.size()); + assertEquals("PIPELINE_CREATE", result.get("eventType").textValue()); + assertEquals(123L, result.get("pipelineId").longValue()); + } + +} diff --git a/core/src/test/java/org/jvalue/ods/coreservice/pipeline/PipelineManagerTest.java b/core/src/test/java/org/jvalue/ods/coreservice/pipeline/PipelineManagerTest.java new file mode 100644 index 000000000..1b15e6d30 --- /dev/null +++ b/core/src/test/java/org/jvalue/ods/coreservice/pipeline/PipelineManagerTest.java @@ -0,0 +1,130 @@ +package org.jvalue.ods.coreservice.pipeline; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.jvalue.ods.coreservice.model.EventType; +import org.jvalue.ods.coreservice.model.PipelineConfig; +import org.jvalue.ods.coreservice.model.PipelineEvent; +import org.jvalue.ods.coreservice.repository.EventRepository; +import org.jvalue.ods.coreservice.repository.PipelineRepository; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; + +import java.io.File; +import java.io.IOException; +import java.util.Collections; +import java.util.List; +import java.util.Optional; + +import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.Mockito.*; + +@RunWith(MockitoJUnitRunner.class) +public class PipelineManagerTest { + + private final ObjectMapper mapper = new ObjectMapper(); + private final File configFile = new File("src/test/java/org/jvalue/ods/coreservice/model/PipelineConfig.json"); + + @Mock + PipelineRepository pipelineRepository; + + @Mock + EventRepository eventRepository; + + @InjectMocks + private PipelineManager manager; + + @Test + public void testCreatePipeline() throws IOException { + PipelineConfig config = mapper.readValue(configFile, PipelineConfig.class); + + PipelineConfig expectedConfig = new PipelineConfig(config.getAdapter(), config.getTransformations(), config.getTrigger(), config.getMetadata()); + expectedConfig.setId(123L); + + when(pipelineRepository.save(config)).thenReturn(expectedConfig); + + PipelineConfig result = manager.createPipeline(config); + + assertEquals(expectedConfig, result); + verify(pipelineRepository).save(config); + verify(eventRepository).save(argThat(event -> event.getEventType().equals("PIPELINE_CREATE"))); + } + + @Test + public void testUpdatePipeline() throws IOException { + PipelineConfig config = mapper.readValue(configFile, PipelineConfig.class); + config.setId(123L); + + PipelineConfig updated = new PipelineConfig(config.getAdapter(), Collections.emptyList(), config.getTrigger(), config.getMetadata()); + updated.setId(123L); + + when(pipelineRepository.findById(123L)).thenReturn(Optional.of(config)); + + manager.updatePipeline(123L, updated); + + verify(pipelineRepository).save(updated); + verify(eventRepository).save(argThat(event -> event.getEventType().equals("PIPELINE_UPDATE"))); + } + + @Test + public void testDeletePipeline() { + manager.deletePipeline(123L); + + verify(pipelineRepository).deleteById(123L); + verify(eventRepository).save(argThat(event -> event.getEventType().equals("PIPELINE_DELETE"))); + } + + @Test + public void testDeleteAllPipelines() throws IOException { + PipelineConfig config = mapper.readValue(configFile, PipelineConfig.class); + + when(pipelineRepository.findAll()).thenReturn( + List.of(config, config, config) // add the same config three times with different id's + ); + + manager.deleteAllPipelines(); + + verify(pipelineRepository).deleteAll(); + verify(eventRepository, times(3)).save(argThat(event -> event.getEventType().equals("PIPELINE_DELETE"))); + } + + @Test + public void testGetEvent() { + PipelineEvent event = new PipelineEvent(EventType.PIPELINE_CREATE, 123L); + + when(eventRepository.findById(123L)).thenReturn(Optional.of(event)); + + Optional result = manager.getEvent(123L); + + assertEquals(event, result.get()); + verify(eventRepository).findById(123L); + } + + @Test + public void testGetEventsAfter() { + PipelineEvent first = new PipelineEvent(EventType.PIPELINE_CREATE, 1L); + PipelineEvent snd = new PipelineEvent(EventType.PIPELINE_UPDATE, 1L); + PipelineEvent thrd = new PipelineEvent(EventType.PIPELINE_CREATE, 2L); + PipelineEvent frth = new PipelineEvent(EventType.PIPELINE_DELETE, 1L); + List events = List.of(first, snd, thrd, frth); + + when(eventRepository.getAllByEventIdAfter(2L)).thenReturn(events.subList(2, events.size())); + + Iterable result = manager.getEventsAfter(2L); + + assertEquals(List.of(thrd, frth), result); + verify(eventRepository).getAllByEventIdAfter(2L); + } + + @Test + public void testGetLatestEvent() { + when(eventRepository.findFirstByOrderByEventIdDesc()).thenReturn(null); + + manager.getLatestEvent(); + + verify(eventRepository).findFirstByOrderByEventIdDesc(); + } +} diff --git a/scheduler/integration-test/src/mock.core.js b/scheduler/integration-test/src/mock.core.js index 1a31c3d43..678496679 100644 --- a/scheduler/integration-test/src/mock.core.js +++ b/scheduler/integration-test/src/mock.core.js @@ -16,6 +16,21 @@ const PIPELINES = [ persistence: {}, metadata: {}, + trigger: { + periodic: true, + firstExecution: '2018-10-07T01:32:00.123Z', + interval: 10000 + } + }, + { + id: 125, + adapter: {}, + transformations: [{ + func: "return 1;" // not peformed in integration testing + }], + persistence: {}, + metadata: {}, + trigger: { periodic: true, firstExecution: '2018-10-07T01:32:00.123Z', @@ -24,20 +39,85 @@ const PIPELINES = [ } ]; +const EVENTS = [ + { + eventId: 347, + eventType: "PIPELINE_CREATE", + pipelineId: 123 + }, + { + eventId: 348, + eventType: "PIPELINE_CREATE", + pipelineId: 124 + }, + { + eventId: 349, + eventType: "PIPELINE_CREATE", + pipelineId: 125 + }, + { + eventId: 350, + eventType: "PIPELINE_DELETE", + pipelineId: 124 + }, + { + eventId: 351, + eventType: "PIPELINE_UPDATE", + pipelineId: 123 + }, + { + eventId: 352, + eventType: "PIPELINE_DELETE", + pipelineId: 125 + } +] + router.get("/", async ctx => { ctx.type = "text/plain"; ctx.body = "ok" }) router.get("/pipelines", async ctx => { - ctx.type = "text/json"; + ctx.type = "application/json"; ctx.body = PIPELINES; }) +router.get("/pipelines/:pipelineId", async ctx => { + ctx.type = "application/json"; + let pipelineId = Number(ctx.params.pipelineId) + let idx = 0; + for(i = 0; i < PIPELINES.length; i++) { + if(PIPELINES[i].id === pipelineId) { + idx = i; + } + } + ctx.body = PIPELINES[idx] +}) + +router.get("/events/latest", async ctx => { + ctx.type = "application/json"; + ctx.body = EVENTS[EVENTS.length-1]; +}) + +router.get("/events", async ctx => { + ctx.type = "application/json"; + let eventsAfter = Number(ctx.query.after) + 1 + let idx = 0; + for(i = 0; i < EVENTS.length; i++) { + if(EVENTS[i].eventId === eventsAfter) { + idx = i; + } + } + if(eventsAfter > EVENTS[EVENTS.length-1].eventId) { + ctx.body = [] + } else { + ctx.body = EVENTS.slice(idx) + } +}) + app.use(router.routes()); const server = app.listen(PORT, () => console.log("Starting mock core server on port " + PORT)); - process.on("SIGTERM", async () => { console.info("Mock-Core-Server: SIGTERM signal received."); await server.close(); diff --git a/scheduler/integration-test/src/mock.storage.js b/scheduler/integration-test/src/mock.storage.js index f489b2eaa..33a7ef545 100644 --- a/scheduler/integration-test/src/mock.storage.js +++ b/scheduler/integration-test/src/mock.storage.js @@ -28,6 +28,10 @@ router.get("/:path", async ctx => { ctx.body = dataStore.get(path); }) +router.post("/rpc/createstructurefordatasource", async ctx => { + ctx.status = 201; +}) + app.use(router.routes()); const server = app.listen(PORT, () => console.log("Starting mock storage server on port " + PORT)); diff --git a/scheduler/integration-test/src/scheduler.test.js b/scheduler/integration-test/src/scheduler.test.js index 14af327a6..ebf40206b 100644 --- a/scheduler/integration-test/src/scheduler.test.js +++ b/scheduler/integration-test/src/scheduler.test.js @@ -2,7 +2,7 @@ const request = require("supertest"); const waitOn = require("wait-on"); -const URL = process.env.SCHEDULER_API || "http://localhost:9000/scheduler"; +const URL = process.env.SCHEDULER_API || "http://localhost:8080"; const MOCK_CORE_PORT = process.env.MOCK_CORE_PORT || 8081; const MOCK_CORE_HOST = process.env.MOCK_CORE_HOST || "localhost"; @@ -25,12 +25,13 @@ describe("Scheduler", () => { beforeAll(async () => { const pingUrl = URL + "/"; - console.log("Waiting for service with URL: " + pingUrl); console.log("Waiting for service with URL: " + MOCK_CORE_URL); console.log("Waiting for service with URL: " + MOCK_ADAPTER_URL); console.log("Waiting for service with URL: " + MOCK_TRANSFORMATION_URL); console.log("Waiting for service with URL: " + MOCK_STORAGE_URL); - await waitOn({ resources: [pingUrl, MOCK_CORE_URL, MOCK_ADAPTER_URL, MOCK_TRANSFORMATION_URL, MOCK_STORAGE_URL], timeout: 50000 }); + await waitOn({ resources: [ MOCK_CORE_URL, MOCK_ADAPTER_URL, MOCK_TRANSFORMATION_URL, MOCK_STORAGE_URL], timeout: 50000 }); + console.log("Waiting for service with URL: " + pingUrl); + await waitOn({ resources: [ pingUrl ], timeout: 50000 }); }, 60000); test("GET /version", async () => { @@ -42,11 +43,11 @@ describe("Scheduler", () => { }); test("GET /jobs", async () => { - await sleep(1200); // wait until scheduler does sync + await sleep(2000); // wait until scheduler does sync const response = await request(URL).get("/jobs"); expect(response.status).toEqual(200); expect(response.type).toEqual("application/json"); - expect(response.body.length).toEqual(1); + expect(response.body.length).toEqual(2); expect(response.body[0].scheduleJob).toBeDefined(); // TODO: make explicit expect(response.body[0].pipelineConfig).toEqual({ id: 123, @@ -59,6 +60,22 @@ describe("Scheduler", () => { persistence: {}, metadata: {}, + trigger: { + periodic: true, + firstExecution: '2018-10-07T01:32:00.123Z', + interval: 10000 + } + }); + expect(response.body[1].pipelineConfig).toEqual({ + id: 125, + adapter: {}, + transformations: [{ + func: "return 1;" + } + ], + persistence: {}, + metadata: {}, + trigger: { periodic: true, firstExecution: '2018-10-07T01:32:00.123Z', @@ -82,6 +99,14 @@ describe("Scheduler", () => { test: 'abc' // from transformation service }); }, 12000); + + test("Pipeline processes events", async () => { + await sleep(3000); + const response = await request(URL).get("/jobs"); + expect(response.status).toEqual(200); + expect(response.type).toEqual("application/json"); + expect(response.body).toHaveLength(2); + }) }); const sleep = (ms) => { diff --git a/scheduler/src/adapter-client.ts b/scheduler/src/adapter-client.ts index cc2465d35..319623d19 100644 --- a/scheduler/src/adapter-client.ts +++ b/scheduler/src/adapter-client.ts @@ -1,20 +1,16 @@ -import axios from 'axios' +import axios, { AxiosResponse } from 'axios' import PipelineConfig from './pipeline-config' const ADAPTER_SERVICE_URL = process.env.ADAPTER_SERVICE_URL || 'http://localhost:8082' const ADAPTER_SERVICE_IMPORT_URL = ADAPTER_SERVICE_URL + '/dataImport' -export async function executeAdapter(pipelineConfig: PipelineConfig): Promise { +const http = axios.create({ + baseURL: ADAPTER_SERVICE_IMPORT_URL, + headers: { 'Content-Type': 'application/json' } +}) - const response = await axios.post( - ADAPTER_SERVICE_IMPORT_URL, - pipelineConfig.adapter, - { - headers: { - 'Content-Type': 'application/json' - } - } - ) - return response.data; +export async function executeAdapter (pipelineConfig: PipelineConfig): Promise { + const response = await http.post('/', pipelineConfig.adapter) + return response.data } diff --git a/scheduler/src/core-client.ts b/scheduler/src/core-client.ts new file mode 100644 index 000000000..5fcaba7ab --- /dev/null +++ b/scheduler/src/core-client.ts @@ -0,0 +1,36 @@ +import axios from 'axios' +import PipelineConfig from './pipeline-config' +import PipelineEvent from './pipeline-event' + +export const CONFIG_SERVICE_URL = process.env.CONFIG_SERVICE_URL || 'http://localhost:8081' +const CONFIG_SERVICE_PIPELINES_URL = CONFIG_SERVICE_URL + '/pipelines' +const CONFIG_SERVICE_EVENTS_URL = CONFIG_SERVICE_URL + '/events' + +const httpPipelines = axios.create({ + baseURL: CONFIG_SERVICE_PIPELINES_URL, + headers: { 'Content-Type': 'application/json' } +}) + +const httpEvents = axios.create({ + baseURL: CONFIG_SERVICE_EVENTS_URL +}) + +export async function getAllPipelines (): Promise { + const response = await httpPipelines.get('/') + return response.data +} + +export async function getPipeline (pipelineId: number): Promise { + const response = await httpPipelines.get(`/${pipelineId}`) + return response.data +} + +export async function getEventsAfter (eventId: number): Promise { + const response = await httpEvents.get(`?after=${eventId}`) + return response.data +} + +export async function getLatestEventId (): Promise { + const response = await httpEvents.get('/latest') + return response.data.eventId || 0 +} diff --git a/scheduler/src/index.ts b/scheduler/src/index.ts index d4d458c28..f1f15f349 100644 --- a/scheduler/src/index.ts +++ b/scheduler/src/index.ts @@ -1,17 +1,14 @@ import express from 'express' -import axios from 'axios' import schedule from 'node-schedule' import * as PipelineScheduling from './pipeline-scheduling' -import PipelineConfig from './pipeline-config' +import { CONFIG_SERVICE_URL } from './core-client' const app = express() const port = 8080 const API_VERSION = '0.0.1' -const CONFIG_SERVICE_URL = process.env.CONFIG_SERVICE_URL || 'http://localhost:8081' -const CONFIG_SERVICE_SYNC_URL = CONFIG_SERVICE_URL + '/pipelines' const CHRONJOB_EVERY_2_SECONDS = '*/2 * * * * *' @@ -29,37 +26,35 @@ app.get('/version', (req, res) => { }) app.get('/jobs', (req, res) => { res.header('Content-Type', 'application/json') - // TODO: think of how to expose scheduler-job info res.json(PipelineScheduling.getAllJobs()) }) -// POLLING THREAD -console.log('Starting sync with Configuration Service on URL ' + CONFIG_SERVICE_SYNC_URL) -const pipelineConfigPollingJob: schedule.Job = schedule.scheduleJob( - 'PipelineConfigPollingJob', - CHRONJOB_EVERY_2_SECONDS - , - async () => { - try { - const response = await axios.get(CONFIG_SERVICE_SYNC_URL) - const pipelineConfigurations: PipelineConfig[] = response.data +let pipelineConfigPollingJob: schedule.Job - pipelineConfigurations.forEach(pipelineConfig => { - pipelineConfig.trigger.firstExecution = new Date(pipelineConfig.trigger.firstExecution) // Otherwise it is a String - if (!PipelineScheduling.existsEqualPipelineJob(pipelineConfig)) { - PipelineScheduling.upsertPipelineJob(pipelineConfig) - } - }) - } catch (e) { - if (e.code === 'ECONNREFUSED' || e.code === 'ENOTFOUND') { - console.error('Failed to sync with Config Service.') - } else { - console.error(e) - } - // TODO: failure handling - } +async function updatePipelines (): Promise { + try { + return PipelineScheduling.updatePipelines() + } catch (e) { + return console.log(e) } -) +} + +async function initPipelineJobs (): Promise { + console.log('Starting sync with Configuration Service on URL ' + CONFIG_SERVICE_URL) + await PipelineScheduling.initializeJobs() + .catch(() => { + console.error('Scheduler: Initialization failed. Shutting down server...') + server.close() + process.exit() + }) + + pipelineConfigPollingJob = schedule.scheduleJob( + 'PipelineEventPollingJob', + CHRONJOB_EVERY_2_SECONDS, + updatePipelines) +} + +initPipelineJobs() process.on('SIGTERM', async () => { console.info('Scheduler: SIGTERM signal received.') diff --git a/scheduler/src/pipeline-event.ts b/scheduler/src/pipeline-event.ts new file mode 100644 index 000000000..6b501dc8b --- /dev/null +++ b/scheduler/src/pipeline-event.ts @@ -0,0 +1,11 @@ +export default interface PipelineEvent { + eventId: number; + pipelineId: number; + eventType: EventType; +} + +export enum EventType { + PIPELINE_CREATE, + PIPELINE_UPDATE, + PIPELINE_DELETE +} diff --git a/scheduler/src/pipeline-scheduling.test.ts b/scheduler/src/pipeline-scheduling.test.ts index 223508b87..ee2b321fd 100644 --- a/scheduler/src/pipeline-scheduling.test.ts +++ b/scheduler/src/pipeline-scheduling.test.ts @@ -4,6 +4,9 @@ import * as PipelineScheduling from './pipeline-scheduling' import { executeAdapter } from './adapter-client' import { executeTransformation } from './transformation-client' import { executeStorage } from './storage-client' +import { getLatestEventId, getAllPipelines, getEventsAfter, getPipeline } from './core-client' +import { EventType } from './pipeline-event' +import PipelineConfig from './pipeline-config'; jest.mock('./adapter-client') const mockedExecuteAdapter = executeAdapter as jest.Mock @@ -17,11 +20,100 @@ jest.mock('./storage-client') const mockedExecuteStorage = executeStorage as jest.Mock mockedExecuteStorage.mockResolvedValue({}) +jest.mock('./core-client') +const mockedGetLatestEventId = getLatestEventId as jest.Mock +mockedGetLatestEventId.mockResolvedValue(321) +const mockedGetAllPipelines = getAllPipelines as jest.Mock +const mockedGetEventsAfter = getEventsAfter as jest.Mock +const mockedGetPipeline = getPipeline as jest.Mock + describe('Scheduler', () => { + test('should initialize jobs correctly', async () => { + const config = generateConfig(true, new Date(Date.now() + 5000), 6000) + mockedGetAllPipelines.mockResolvedValue([config]) + + await PipelineScheduling.initializeJobs() + + expect(PipelineScheduling.getAllJobs()).toHaveLength(1) + expect(PipelineScheduling.getAllJobs()[0].pipelineConfig).toEqual(config) + }) + + test('should apply creation event', async () => { + mockedGetAllPipelines.mockResolvedValue([]) + const toBeAdded = generateConfig(true, new Date(Date.now() + 5000), 6000) + const creationEvent = { + eventId: 322, + eventType: EventType.PIPELINE_CREATE, + pipelineId: 123 + } + + await PipelineScheduling.initializeJobs() + expect(PipelineScheduling.getAllJobs()).toHaveLength(0) + + mockedGetEventsAfter.mockResolvedValue([creationEvent]) + mockedGetPipeline.mockResolvedValue(toBeAdded) + await PipelineScheduling.updatePipelines() + + await sleep(1000) // Give the scheduler some time to apply the update + + expect(PipelineScheduling.getAllJobs()).toHaveLength(1) + const job123 = PipelineScheduling.getPipelineJob(123) + expect(job123).toBeDefined() + expect(job123!.pipelineConfig).toEqual(toBeAdded) + }) + + test('should apply deletion event', async () => { + const toBeDeleted = generateConfig(true, new Date(Date.now() + 5000), 6000) + mockedGetAllPipelines.mockResolvedValue([toBeDeleted]) + const deletionEvent = { + eventId: 323, + eventType: EventType.PIPELINE_DELETE, + pipelineId: 123 + } + + await PipelineScheduling.initializeJobs() + expect(PipelineScheduling.getAllJobs()).toHaveLength(1) + + mockedGetEventsAfter.mockResolvedValue([deletionEvent]) + mockedGetPipeline.mockResolvedValue(toBeDeleted) + await PipelineScheduling.updatePipelines() + + await sleep(1000) // Give the scheduler some time to apply the update + + expect(PipelineScheduling.getAllJobs()).toHaveLength(0) + }) + + test('should apply update event', async () => { + const toBeUpdated = generateConfig(true, new Date(Date.now() + 5000), 6000) + mockedGetAllPipelines.mockResolvedValue([toBeUpdated]) + const updateEvent = { + eventId: 324, + eventType: EventType.PIPELINE_UPDATE, + pipelineId: 123 + } + + await PipelineScheduling.initializeJobs() + const allJobs = PipelineScheduling.getAllJobs() + expect(allJobs).toHaveLength(1) + expect(allJobs[0].pipelineConfig).toEqual(toBeUpdated) + + const updated = generateConfig(false, new Date(Date.now() + 5000), 12000) + mockedGetEventsAfter.mockResolvedValue([updateEvent]) + mockedGetPipeline.mockResolvedValue(updated) + + await PipelineScheduling.updatePipelines() + + await sleep(1000) // Give the scheduler some time to apply the update + + expect(PipelineScheduling.getAllJobs()).toHaveLength(1) + const job123 = PipelineScheduling.getPipelineJob(123) + expect(job123).toBeDefined() + expect(job123!.pipelineConfig).toEqual(updated) + }) + test('should have correct execution date in the future', () => { const timestampInFuture = Date.now() + 6000 const pipelineConfig = generateConfig(true, new Date(timestampInFuture), 6000) - expect(PipelineScheduling.determineExecutionDate(pipelineConfig).getTime()).toEqual(timestampInFuture) }) @@ -30,7 +122,6 @@ describe('Scheduler', () => { const interval = 10000 const pipelineConfig = generateConfig(true, new Date(timestampInPast), interval) - const expectedExecution = new Date(timestampInPast + interval) expect(PipelineScheduling.determineExecutionDate(pipelineConfig)).toEqual(expectedExecution) }) @@ -38,12 +129,11 @@ describe('Scheduler', () => { test('should insert new pipeline', () => { const timestampInFuture = Date.now() + 5000 const pipelineConfig = generateConfig(true, new Date(timestampInFuture), 10000) - const pipelineJob = PipelineScheduling.upsertPipelineJob(pipelineConfig) expect(pipelineJob.pipelineConfig).toEqual(pipelineConfig) expect(pipelineJob.scheduleJob).toBeDefined() - expect(PipelineScheduling.getPipielineJob(pipelineConfig.id)).toEqual(pipelineJob) + expect(PipelineScheduling.getPipelineJob(pipelineConfig.id)).toEqual(pipelineJob) }) test('should update existing pipeline', () => { @@ -79,11 +169,10 @@ describe('Scheduler', () => { test('should execute pipeline once', async () => { const timestampInFuture = Date.now() + 200 const pipelineConfig = generateConfig(false, new Date(timestampInFuture), 500) - PipelineScheduling.upsertPipelineJob(pipelineConfig) await sleep(250) - expect(PipelineScheduling.getPipielineJob(pipelineConfig.id)).toBeUndefined() + expect(PipelineScheduling.getPipelineJob(pipelineConfig.id)).toBeUndefined() }) afterEach(() => { @@ -93,11 +182,10 @@ describe('Scheduler', () => { test('should execute pipeline periodic', async () => { const timestampInFuture = Date.now() + 200 const pipelineConfig = generateConfig(true, new Date(timestampInFuture), 500) - const pipelineJob1 = PipelineScheduling.upsertPipelineJob(pipelineConfig) const nextInvocation1: Date = pipelineJob1.scheduleJob.nextInvocation() await sleep(250) - const pipelineJob2 = PipelineScheduling.getPipielineJob(pipelineConfig.id) + const pipelineJob2 = PipelineScheduling.getPipelineJob(pipelineConfig.id) const nextInvocation2: Date = pipelineJob1.scheduleJob.nextInvocation() expect(nextInvocation1).not.toEqual(nextInvocation2) @@ -109,11 +197,11 @@ describe('Scheduler', () => { }) }) -const sleep = (ms: number) => { +function sleep (ms: number): Promise { return new Promise(resolve => setTimeout(resolve, ms)) } -const generateConfig = (periodic: boolean, firstExecution: Date, interval: number) => { +function generateConfig (periodic: boolean, firstExecution: Date, interval: number): PipelineConfig { return { id: 123, adapter: {}, diff --git a/scheduler/src/pipeline-scheduling.ts b/scheduler/src/pipeline-scheduling.ts index 69e1783be..9380676e9 100644 --- a/scheduler/src/pipeline-scheduling.ts +++ b/scheduler/src/pipeline-scheduling.ts @@ -1,15 +1,96 @@ import deepEqual from 'deep-equal' import PipelineJob from './pipeline-job' import PipelineConfig from './pipeline-config' +import PipelineEvent, { EventType } from './pipeline-event' import schedule from 'node-schedule' import * as AdapterClient from './adapter-client' import * as TransformationClient from './transformation-client' import * as StorageClient from './storage-client' +import * as CoreClient from './core-client' +import * as PipelineScheduling from './pipeline-scheduling' const allJobs: Map = new Map() // pipelineId -> job +var currentEventId: number -export function getPipielineJob (pipelineId: number): PipelineJob | undefined { +/** + * Initially receive all pipelines from core service and start them up. + */ +export async function initializeJobs (retries: number = 30): Promise { + try { + console.log('Starting initialization pipeline scheduler') + currentEventId = await CoreClient.getLatestEventId() + + const pipelineConfigurations: PipelineConfig[] = await CoreClient.getAllPipelines() + + console.log(`Received ${pipelineConfigurations.length} pipelines from core-service`) + + pipelineConfigurations.forEach(pipelineConfig => { + pipelineConfig.trigger.firstExecution = new Date(pipelineConfig.trigger.firstExecution) // Otherwise it is a String + if (!PipelineScheduling.existsEqualPipelineJob(pipelineConfig)) { // We could leave out this check assuming that core-service checks for duplicates + PipelineScheduling.upsertPipelineJob(pipelineConfig) + } + }) + } catch (e) { + if (retries === 0) { + return Promise.reject(new Error('Failed to initialize pipeline scheduler.')) + } + if (e.code === 'ECONNREFUSED' || e.code === 'ENOTFOUND') { + console.error(`Failed to sync with Config Service on initialization (${retries}) . Retrying ... `) + } else { + console.error(e) + console.error(`Retrying (${retries})...`) + } + await sleep(1000) + return initializeJobs(retries - 1) + } +} + +/** + * Regularly get deltas for pipeline configurations and apply changes. + */ +export async function updatePipelines (): Promise { + try { + const nextEventId: number = await CoreClient.getLatestEventId() + + const events: PipelineEvent[] = await CoreClient.getEventsAfter(currentEventId) + if (events.length > 0) { + console.log(`Applying ${events.length} updates from core service:`) + } + + Array.from(events).forEach(async event => applyChanges(event)) + + currentEventId = nextEventId + } catch (e) { + if (e.code === 'ECONNREFUSED' || e.code === 'ENOTFOUND') { + console.error('Failed to sync with config service on update.') + } else { + console.error('update failed') + console.error(e) + } + } +} + +async function applyChanges (event: PipelineEvent): Promise { + switch (event.eventType) { + case EventType.PIPELINE_DELETE: { applyDeleteEvent(event); break } + case EventType.PIPELINE_CREATE: + case EventType.PIPELINE_UPDATE: { applyCreateOrUpdateEvent(event); break } + } +} + +function applyDeleteEvent (event: PipelineEvent): void { + cancelJob(event.pipelineId) + allJobs.delete(event.pipelineId) +} + +async function applyCreateOrUpdateEvent (event: PipelineEvent): Promise { + const pipeline = await CoreClient.getPipeline(event.pipelineId) + pipeline.trigger.firstExecution = new Date(pipeline.trigger.firstExecution) + PipelineScheduling.upsertPipelineJob(pipeline) +} + +export function getPipelineJob (pipelineId: number): PipelineJob | undefined { return allJobs.get(pipelineId) } @@ -18,7 +99,7 @@ export function existsPipelineJob (pipelineId: number): boolean { } export function existsEqualPipelineJob (pipelineConfig: PipelineConfig): boolean { - const pipelineJob = getPipielineJob(pipelineConfig.id) + const pipelineJob = getPipelineJob(pipelineConfig.id) return pipelineJob !== undefined && deepEqual(pipelineJob.pipelineConfig, pipelineConfig) } @@ -31,26 +112,26 @@ export function determineExecutionDate (pipelineConfig: PipelineConfig): Date { return new Date(potentialExecutionDate) } -async function executePipeline (pipelineConfig: PipelineConfig) { +async function executePipeline (pipelineConfig: PipelineConfig): Promise { console.log(`Execute Pipeline ${pipelineConfig.id}`) - let retryNumber = 0; - let pipelineSuccess = false; - while(!pipelineSuccess && retryNumber <= 3) { + let retryNumber = 0 + let pipelineSuccess = false + while (!pipelineSuccess && retryNumber <= 3) { if (retryNumber > 0) { - await sleep(1000); + await sleep(1000) console.log(`Starting retry ${retryNumber} of Pipeline ${pipelineConfig.id}`) } try { - const importedData: any = await executeAdapter(pipelineConfig); + const importedData: object = await executeAdapter(pipelineConfig) const transformedData = await executeTransformations(pipelineConfig, importedData) - executeStorage(pipelineConfig, transformedData) + await executeStorage(pipelineConfig, transformedData) pipelineSuccess = true console.log(`Successfully executed Pipeline ${pipelineConfig.id}`) } catch (e) { console.log(`Pipeline ${pipelineConfig.id} failed!`) retryNumber++ - } + } } if (pipelineConfig.trigger.periodic) { @@ -63,13 +144,13 @@ async function executePipeline (pipelineConfig: PipelineConfig) { } } -async function executeAdapter (pipelineConfig: PipelineConfig): Promise { +async function executeAdapter (pipelineConfig: PipelineConfig): Promise { console.log(`Execute Adapter for Pipeline ${pipelineConfig.id}`) try { const importedData = await AdapterClient.executeAdapter(pipelineConfig) console.log(`Sucessful import via Adapter for Pipeline ${pipelineConfig.id}`) return importedData - } catch(e) { + } catch (e) { if (e.code === 'ECONNREFUSED' || e.code === 'ENOTFOUND') { console.log(`Failed to import data via Adapter for Pipeline ${pipelineConfig.id}. Adapter Service not reachable`) } else { @@ -80,17 +161,17 @@ async function executeAdapter (pipelineConfig: PipelineConfig): Promise { } } -async function executeTransformations (pipelineConfig: PipelineConfig, data: any): Promise { +async function executeTransformations (pipelineConfig: PipelineConfig, data: object): Promise { console.log(`Execute Pipeline Transformation ${pipelineConfig.id}`) - let lastPartialResult = data; + let lastPartialResult = data try { - for(const transformation of pipelineConfig.transformations) { + for (const transformation of pipelineConfig.transformations) { const currentTransformation = JSON.parse(JSON.stringify(transformation)) // deeply copy object currentTransformation.data = lastPartialResult lastPartialResult = await TransformationClient.executeTransformation(currentTransformation) } - console.log(`Sucessful transformed data for Pipeline ${pipelineConfig.id}`) + console.log(`Sucessfully transformed data for Pipeline ${pipelineConfig.id}`) return lastPartialResult } catch (e) { if (e.code === 'ECONNREFUSED' || e.code === 'ENOTFOUND') { @@ -103,12 +184,11 @@ async function executeTransformations (pipelineConfig: PipelineConfig, data: any } } -async function executeStorage (pipelineConfig: PipelineConfig, data: any) { - console.log(`Execute Pipeline Storage ${pipelineConfig.id}`) +async function executeStorage (pipelineConfig: PipelineConfig, data: object): Promise { try { - const importedData = await StorageClient.executeStorage(pipelineConfig, data) - console.log(`Sucessful stored Data for Pipeline ${pipelineConfig.id}`) - } catch(e) { + await StorageClient.executeStorage(pipelineConfig, data) + console.log(`Sucessfully stored Data for Pipeline ${pipelineConfig.id}`) + } catch (e) { if (e.code === 'ECONNREFUSED' || e.code === 'ENOTFOUND') { console.log(`Failed to store Data for Pipeline ${pipelineConfig.id}. Storage Service not reachable`) } else { @@ -119,7 +199,6 @@ async function executeStorage (pipelineConfig: PipelineConfig, data: any) { } } - function schedulePipeline (pipelineConfig: PipelineConfig, executionDate: Date): PipelineJob { const pipelineId = pipelineConfig.id @@ -134,18 +213,17 @@ function schedulePipeline (pipelineConfig: PipelineConfig, executionDate: Date): export function upsertPipelineJob (pipelineConfig: PipelineConfig): PipelineJob { const executionDate: Date = determineExecutionDate(pipelineConfig) - const isNewPipeline = !existsPipelineJob(pipelineConfig.id) const pipelineState = isNewPipeline ? 'New' : 'Updated' - console.log(`[${pipelineState}] pipeline detected with id ${pipelineConfig.id}. + console.log(`[${pipelineState}] pipeline detected with id ${pipelineConfig.id}. Scheduled for next execution at ${executionDate.toLocaleString()}`) if (isNewPipeline) { StorageClient.createStructure(pipelineConfig.id) } else { cancelJob(pipelineConfig.id) - } + } return schedulePipeline(pipelineConfig, executionDate) } @@ -168,6 +246,6 @@ export function cancelJob (jobId: number): void { } } -const sleep = (ms: number) => { +function sleep (ms: number): Promise { return new Promise(resolve => setTimeout(resolve, ms)) } diff --git a/scheduler/src/storage-client.ts b/scheduler/src/storage-client.ts index 2bd52e675..d24e4eb93 100644 --- a/scheduler/src/storage-client.ts +++ b/scheduler/src/storage-client.ts @@ -13,7 +13,6 @@ export async function executeStorage (pipelineConfig: PipelineConfig, data: any) requestBody.origin = !!pipelineConfig.adapter && !!pipelineConfig.adapter.location ? pipelineConfig.adapter.location : 'UNKNOWN' requestBody.license = !!pipelineConfig.metadata && !!pipelineConfig.metadata.license ? pipelineConfig.metadata.license : 'UNKNOWN' - await axios.post( getDataRequestUrl(pipelineConfig.id), requestBody, @@ -44,4 +43,4 @@ export async function createStructure (pipelineId: number): Promise { function getDataRequestUrl (pipelineId: number): string { return `${STORAGE_SERVICE_URL}/${pipelineId}` -} \ No newline at end of file +} diff --git a/scheduler/src/transformation-client.ts b/scheduler/src/transformation-client.ts index 06ad5598a..cd062480c 100644 --- a/scheduler/src/transformation-client.ts +++ b/scheduler/src/transformation-client.ts @@ -1,18 +1,14 @@ -import axios from 'axios' +import axios, { AxiosResponse } from 'axios' const TRANSFORMATION_SERVICE_URL = process.env.TRANSFORMATION_SERVICE_URL || 'http://localhost:8083' const TRANSFORMATION_SERVICE_IMPORT_URL = TRANSFORMATION_SERVICE_URL + '/job' -export async function executeTransformation(transformationConfig: any): Promise { +const http = axios.create({ + baseURL: TRANSFORMATION_SERVICE_IMPORT_URL, + headers: { 'Content-Type': 'application/json' } +}) - const response = await axios.post( - TRANSFORMATION_SERVICE_IMPORT_URL, - transformationConfig, - { - headers: { - 'Content-Type': 'application/json' - } - } - ) - return response.data +export async function executeTransformation (transformationConfig: object): Promise { + const response = await http.post('/', transformationConfig) + return response.data } From debb8bfb2fc9764bf47abc81cba920ffcdea1105 Mon Sep 17 00:00:00 2001 From: Andreas Bauer Date: Wed, 28 Aug 2019 07:48:00 +0000 Subject: [PATCH 0049/1168] Resolve "scheduler: determineExecutionDate method should be refactored" --- scheduler/src/pipeline-scheduling.test.ts | 18 ++++++++++++++++-- scheduler/src/pipeline-scheduling.ts | 12 ++++++++---- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/scheduler/src/pipeline-scheduling.test.ts b/scheduler/src/pipeline-scheduling.test.ts index ee2b321fd..d7390a7d9 100644 --- a/scheduler/src/pipeline-scheduling.test.ts +++ b/scheduler/src/pipeline-scheduling.test.ts @@ -111,13 +111,13 @@ describe('Scheduler', () => { expect(job123!.pipelineConfig).toEqual(updated) }) - test('should have correct execution date in the future', () => { + test('should determine correct execution date from timestamp in the future ', () => { const timestampInFuture = Date.now() + 6000 const pipelineConfig = generateConfig(true, new Date(timestampInFuture), 6000) expect(PipelineScheduling.determineExecutionDate(pipelineConfig).getTime()).toEqual(timestampInFuture) }) - test('should have correct execution date in the past', () => { + test('should determine correct execution date from timestamp in the past', () => { const timestampInPast = Date.now() - 5000 const interval = 10000 @@ -126,6 +126,20 @@ describe('Scheduler', () => { expect(PipelineScheduling.determineExecutionDate(pipelineConfig)).toEqual(expectedExecution) }) + test('should determine correct execution date from timestamp in the past [> 24h]', () => { + const oneDayhInMs = 1000 * 3600 *24 + const threeDaysInMs = oneDayhInMs * 3 + const fiveMinutesInMs = 1000 * 60 * 5 + const now = Date.now() + + const timestampInPast = now - threeDaysInMs - fiveMinutesInMs + const interval = oneDayhInMs + + const pipelineConfig = generateConfig(true, new Date(timestampInPast), interval) + const expectedExecution = new Date(now + interval - fiveMinutesInMs) + expect(PipelineScheduling.determineExecutionDate(pipelineConfig)).toEqual(expectedExecution) + }) + test('should insert new pipeline', () => { const timestampInFuture = Date.now() + 5000 const pipelineConfig = generateConfig(true, new Date(timestampInFuture), 10000) diff --git a/scheduler/src/pipeline-scheduling.ts b/scheduler/src/pipeline-scheduling.ts index 9380676e9..3f34b7c39 100644 --- a/scheduler/src/pipeline-scheduling.ts +++ b/scheduler/src/pipeline-scheduling.ts @@ -104,12 +104,16 @@ export function existsEqualPipelineJob (pipelineConfig: PipelineConfig): boolean } export function determineExecutionDate (pipelineConfig: PipelineConfig): Date { - let potentialExecutionDate: number = pipelineConfig.trigger.firstExecution.getTime() + let executionDate = pipelineConfig.trigger.firstExecution.getTime() + const now =Date.now() - while (potentialExecutionDate < Date.now()) { - potentialExecutionDate += pipelineConfig.trigger.interval + if (executionDate > now) { + return pipelineConfig.trigger.firstExecution } - return new Date(potentialExecutionDate) + + const offset = (now - executionDate) % pipelineConfig.trigger.interval + executionDate = now + pipelineConfig.trigger.interval - offset + return new Date(executionDate) } async function executePipeline (pipelineConfig: PipelineConfig): Promise { From 354af4b16c5e1c4be51effa8ce7d774893e1b131 Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Wed, 28 Aug 2019 13:18:15 +0000 Subject: [PATCH 0050/1168] Resolve "Fix style issues for existing js/ts projects" --- scheduler/Dockerfile | 4 +-- scheduler/src/adapter-client.ts | 2 +- scheduler/src/core-client.ts | 4 +-- scheduler/src/interfaces/adapter-config.ts | 3 ++ scheduler/src/interfaces/metadata.ts | 4 +++ scheduler/src/interfaces/pipeline-config.ts | 13 ++++++++ .../src/{ => interfaces}/pipeline-event.ts | 0 .../src/{ => interfaces}/pipeline-job.ts | 0 .../src/{ => interfaces}/trigger-config.ts | 0 scheduler/src/pipeline-config.ts | 11 ------- scheduler/src/pipeline-scheduling.test.ts | 30 +++++++++++++------ scheduler/src/pipeline-scheduling.ts | 14 ++++----- scheduler/src/storage-client.ts | 24 +++++++-------- ui/src/components/DateTimePicker.vue | 11 ++++--- ui/src/components/Login.vue | 2 +- ui/src/pipeline/pipeline.ts | 2 +- ui/src/storage/PipelineStorageOverview.vue | 4 +-- 17 files changed, 73 insertions(+), 55 deletions(-) create mode 100644 scheduler/src/interfaces/adapter-config.ts create mode 100644 scheduler/src/interfaces/metadata.ts create mode 100644 scheduler/src/interfaces/pipeline-config.ts rename scheduler/src/{ => interfaces}/pipeline-event.ts (100%) rename scheduler/src/{ => interfaces}/pipeline-job.ts (100%) rename scheduler/src/{ => interfaces}/trigger-config.ts (100%) delete mode 100644 scheduler/src/pipeline-config.ts diff --git a/scheduler/Dockerfile b/scheduler/Dockerfile index cbe47886e..ac7bcfd82 100644 --- a/scheduler/Dockerfile +++ b/scheduler/Dockerfile @@ -8,7 +8,7 @@ COPY ./tsconfig.json ./ COPY ./jest.config.js ./ # Install dependencies and run build -RUN npm install +RUN npm install RUN npm run tsc RUN npm run test @@ -18,7 +18,7 @@ FROM node:lts-alpine RUN mkdir /app WORKDIR /app -COPY --from=builder /build/dist/* ./dist/ +COPY --from=builder /build/dist/ ./dist/ COPY --from=builder /build/package*.json ./ RUN npm install --only=production diff --git a/scheduler/src/adapter-client.ts b/scheduler/src/adapter-client.ts index 319623d19..e4d9c713b 100644 --- a/scheduler/src/adapter-client.ts +++ b/scheduler/src/adapter-client.ts @@ -1,6 +1,6 @@ import axios, { AxiosResponse } from 'axios' -import PipelineConfig from './pipeline-config' +import PipelineConfig from './interfaces/pipeline-config' const ADAPTER_SERVICE_URL = process.env.ADAPTER_SERVICE_URL || 'http://localhost:8082' const ADAPTER_SERVICE_IMPORT_URL = ADAPTER_SERVICE_URL + '/dataImport' diff --git a/scheduler/src/core-client.ts b/scheduler/src/core-client.ts index 5fcaba7ab..cdf8a387e 100644 --- a/scheduler/src/core-client.ts +++ b/scheduler/src/core-client.ts @@ -1,6 +1,6 @@ import axios from 'axios' -import PipelineConfig from './pipeline-config' -import PipelineEvent from './pipeline-event' +import PipelineConfig from './interfaces/pipeline-config' +import PipelineEvent from './interfaces/pipeline-event' export const CONFIG_SERVICE_URL = process.env.CONFIG_SERVICE_URL || 'http://localhost:8081' const CONFIG_SERVICE_PIPELINES_URL = CONFIG_SERVICE_URL + '/pipelines' diff --git a/scheduler/src/interfaces/adapter-config.ts b/scheduler/src/interfaces/adapter-config.ts new file mode 100644 index 000000000..f80a200b2 --- /dev/null +++ b/scheduler/src/interfaces/adapter-config.ts @@ -0,0 +1,3 @@ +export default interface AdapterConfig { + location: string; +} diff --git a/scheduler/src/interfaces/metadata.ts b/scheduler/src/interfaces/metadata.ts new file mode 100644 index 000000000..754fc37c6 --- /dev/null +++ b/scheduler/src/interfaces/metadata.ts @@ -0,0 +1,4 @@ +export default interface Metadata { + creationTimestamp: Date; + license: string; +} diff --git a/scheduler/src/interfaces/pipeline-config.ts b/scheduler/src/interfaces/pipeline-config.ts new file mode 100644 index 000000000..b25c1a852 --- /dev/null +++ b/scheduler/src/interfaces/pipeline-config.ts @@ -0,0 +1,13 @@ +import TriggerConfig from './trigger-config' +// import TransformationConfig from './transformation-config' +import Metadata from './metadata' +import AdapterConfig from './adapter-config' +export default interface PipelineConfig { + id: number; + + adapter: AdapterConfig; + transformations: object[]; + persistence: object; + metadata: Metadata; + trigger: TriggerConfig; +} diff --git a/scheduler/src/pipeline-event.ts b/scheduler/src/interfaces/pipeline-event.ts similarity index 100% rename from scheduler/src/pipeline-event.ts rename to scheduler/src/interfaces/pipeline-event.ts diff --git a/scheduler/src/pipeline-job.ts b/scheduler/src/interfaces/pipeline-job.ts similarity index 100% rename from scheduler/src/pipeline-job.ts rename to scheduler/src/interfaces/pipeline-job.ts diff --git a/scheduler/src/trigger-config.ts b/scheduler/src/interfaces/trigger-config.ts similarity index 100% rename from scheduler/src/trigger-config.ts rename to scheduler/src/interfaces/trigger-config.ts diff --git a/scheduler/src/pipeline-config.ts b/scheduler/src/pipeline-config.ts deleted file mode 100644 index 4487f2778..000000000 --- a/scheduler/src/pipeline-config.ts +++ /dev/null @@ -1,11 +0,0 @@ -import TriggerConfig from './trigger-config' -export default interface PipelineConfig { - id: number; - - adapter: any; - transformations: any[]; - persistence: any; - metadata: any; - - trigger: TriggerConfig; -} diff --git a/scheduler/src/pipeline-scheduling.test.ts b/scheduler/src/pipeline-scheduling.test.ts index d7390a7d9..71dcf3d2d 100644 --- a/scheduler/src/pipeline-scheduling.test.ts +++ b/scheduler/src/pipeline-scheduling.test.ts @@ -5,8 +5,8 @@ import { executeAdapter } from './adapter-client' import { executeTransformation } from './transformation-client' import { executeStorage } from './storage-client' import { getLatestEventId, getAllPipelines, getEventsAfter, getPipeline } from './core-client' -import { EventType } from './pipeline-event' -import PipelineConfig from './pipeline-config'; +import { EventType } from './interfaces/pipeline-event' +import PipelineConfig from './interfaces/pipeline-config' jest.mock('./adapter-client') const mockedExecuteAdapter = executeAdapter as jest.Mock @@ -59,7 +59,9 @@ describe('Scheduler', () => { expect(PipelineScheduling.getAllJobs()).toHaveLength(1) const job123 = PipelineScheduling.getPipelineJob(123) expect(job123).toBeDefined() - expect(job123!.pipelineConfig).toEqual(toBeAdded) + if (job123 !== undefined) { + expect(job123.pipelineConfig).toEqual(toBeAdded) + } }) test('should apply deletion event', async () => { @@ -108,7 +110,9 @@ describe('Scheduler', () => { expect(PipelineScheduling.getAllJobs()).toHaveLength(1) const job123 = PipelineScheduling.getPipelineJob(123) expect(job123).toBeDefined() - expect(job123!.pipelineConfig).toEqual(updated) + if (job123 !== undefined) { + expect(job123.pipelineConfig).toEqual(updated) + } }) test('should determine correct execution date from timestamp in the future ', () => { @@ -127,7 +131,7 @@ describe('Scheduler', () => { }) test('should determine correct execution date from timestamp in the past [> 24h]', () => { - const oneDayhInMs = 1000 * 3600 *24 + const oneDayhInMs = 1000 * 3600 * 24 const threeDaysInMs = oneDayhInMs * 3 const fiveMinutesInMs = 1000 * 60 * 5 const now = Date.now() @@ -203,7 +207,10 @@ describe('Scheduler', () => { const nextInvocation2: Date = pipelineJob1.scheduleJob.nextInvocation() expect(nextInvocation1).not.toEqual(nextInvocation2) - expect(pipelineJob1.pipelineConfig).toEqual(pipelineJob2!.pipelineConfig) + expect(pipelineJob2).toBeDefined() + if (pipelineJob2 !== undefined) { + expect(pipelineJob1.pipelineConfig).toEqual(pipelineJob2.pipelineConfig) + } }) afterEach(() => { @@ -218,10 +225,15 @@ function sleep (ms: number): Promise { function generateConfig (periodic: boolean, firstExecution: Date, interval: number): PipelineConfig { return { id: 123, - adapter: {}, - transformations: [{}], + adapter: { + location: 'somewhere' + }, + transformations: [], persistence: {}, - metadata: {}, + metadata: { + creationTimestamp: firstExecution, + license: 'license' + }, trigger: { periodic, diff --git a/scheduler/src/pipeline-scheduling.ts b/scheduler/src/pipeline-scheduling.ts index 3f34b7c39..43b53b3d9 100644 --- a/scheduler/src/pipeline-scheduling.ts +++ b/scheduler/src/pipeline-scheduling.ts @@ -1,7 +1,7 @@ import deepEqual from 'deep-equal' -import PipelineJob from './pipeline-job' -import PipelineConfig from './pipeline-config' -import PipelineEvent, { EventType } from './pipeline-event' +import PipelineJob from './interfaces/pipeline-job' +import PipelineConfig from './interfaces/pipeline-config' +import PipelineEvent, { EventType } from './interfaces/pipeline-event' import schedule from 'node-schedule' import * as AdapterClient from './adapter-client' @@ -26,10 +26,8 @@ export async function initializeJobs (retries: number = 30): Promise { console.log(`Received ${pipelineConfigurations.length} pipelines from core-service`) pipelineConfigurations.forEach(pipelineConfig => { - pipelineConfig.trigger.firstExecution = new Date(pipelineConfig.trigger.firstExecution) // Otherwise it is a String - if (!PipelineScheduling.existsEqualPipelineJob(pipelineConfig)) { // We could leave out this check assuming that core-service checks for duplicates - PipelineScheduling.upsertPipelineJob(pipelineConfig) - } + pipelineConfig.trigger.firstExecution = new Date(pipelineConfig.trigger.firstExecution) + PipelineScheduling.upsertPipelineJob(pipelineConfig) // assuming core service checks for duplicates }) } catch (e) { if (retries === 0) { @@ -105,7 +103,7 @@ export function existsEqualPipelineJob (pipelineConfig: PipelineConfig): boolean export function determineExecutionDate (pipelineConfig: PipelineConfig): Date { let executionDate = pipelineConfig.trigger.firstExecution.getTime() - const now =Date.now() + const now = Date.now() if (executionDate > now) { return pipelineConfig.trigger.firstExecution diff --git a/scheduler/src/storage-client.ts b/scheduler/src/storage-client.ts index d24e4eb93..99a64a271 100644 --- a/scheduler/src/storage-client.ts +++ b/scheduler/src/storage-client.ts @@ -1,19 +1,19 @@ import axios from 'axios' -import PipelineConfig from './pipeline-config' +import PipelineConfig from './interfaces/pipeline-config' const STORAGE_SERVICE_URL = process.env.STORAGE_SERVICE_URL || 'http://localhost:8084' -export async function executeStorage (pipelineConfig: PipelineConfig, data: any): Promise { - - const requestBody: any = {} - requestBody.data = data - requestBody.pipelineId = pipelineConfig.id - requestBody.timestamp = new Date(Date.now()) - requestBody.origin = !!pipelineConfig.adapter && !!pipelineConfig.adapter.location ? pipelineConfig.adapter.location : 'UNKNOWN' - requestBody.license = !!pipelineConfig.metadata && !!pipelineConfig.metadata.license ? pipelineConfig.metadata.license : 'UNKNOWN' +export async function executeStorage (pipelineConfig: PipelineConfig, data: object): Promise { + const requestBody: object = { + data, + pipelineId: pipelineConfig.id, + timestamp: new Date(Date.now()), + origin: !!pipelineConfig.adapter && !!pipelineConfig.adapter.location ? pipelineConfig.adapter.location : 'UNKNOWN', + license: !!pipelineConfig.metadata && !!pipelineConfig.metadata.license ? pipelineConfig.metadata.license : 'UNKNOWN' + } - await axios.post( + await axios.post( getDataRequestUrl(pipelineConfig.id), requestBody, { @@ -25,8 +25,8 @@ export async function executeStorage (pipelineConfig: PipelineConfig, data: any) } export async function createStructure (pipelineId: number): Promise { - const requestBody: any = { - 'pipelineid': pipelineId + const requestBody: object = { + pipelineId } const requestURI = `${STORAGE_SERVICE_URL}/rpc/createstructurefordatasource` diff --git a/ui/src/components/DateTimePicker.vue b/ui/src/components/DateTimePicker.vue index 218377108..fef634a51 100644 --- a/ui/src/components/DateTimePicker.vue +++ b/ui/src/components/DateTimePicker.vue @@ -138,7 +138,7 @@ export default class DateTimePicker extends Vue { private onSave () { const selectedDate = new Date( this.sliceYearFromDateString(this.date), - this.sliceMonthFromDateString(this.date) -1, + this.sliceMonthFromDateString(this.date) - 1, this.sliceDayFromDateString(this.date), this.sliceHourFromTimeString(this.time), this.sliceMinuteFromTimeString(this.time) @@ -154,13 +154,12 @@ export default class DateTimePicker extends Vue { private sliceYearFromDateString = (v: string): number => Number(v.slice(0, 4)) - private sliceMonthFromDateString = (v: string): number => Number(v.slice(5,7)) + private sliceMonthFromDateString = (v: string): number => Number(v.slice(5, 7)) - private sliceDayFromDateString = (v: string): number => Number(v.slice(8,10)) + private sliceDayFromDateString = (v: string): number => Number(v.slice(8, 10)) - private sliceHourFromTimeString = (v: string): number => Number(v.slice(0,2)) - - private sliceMinuteFromTimeString = (v: string): number => Number(v.slice(3,5)) + private sliceHourFromTimeString = (v: string): number => Number(v.slice(0, 2)) + private sliceMinuteFromTimeString = (v: string): number => Number(v.slice(3, 5)) } diff --git a/ui/src/components/Login.vue b/ui/src/components/Login.vue index 4467dd94c..0ee7f1f19 100644 --- a/ui/src/components/Login.vue +++ b/ui/src/components/Login.vue @@ -73,7 +73,7 @@ export default class Login extends Vue { @State('isAuth', namespace) private isAuthenticated!: boolean; - @State('userProfile', namespace) + @State('userProfile', namespace) private userProfile!: KeycloakProfile; @Action('login', namespace) diff --git a/ui/src/pipeline/pipeline.ts b/ui/src/pipeline/pipeline.ts index 7ae75c8f7..94e8d7f35 100644 --- a/ui/src/pipeline/pipeline.ts +++ b/ui/src/pipeline/pipeline.ts @@ -17,4 +17,4 @@ export interface Trigger { periodic: boolean; interval: number; firstExecution: Date; -} \ No newline at end of file +} diff --git a/ui/src/storage/PipelineStorageOverview.vue b/ui/src/storage/PipelineStorageOverview.vue index 71b266eb1..fab044380 100644 --- a/ui/src/storage/PipelineStorageOverview.vue +++ b/ui/src/storage/PipelineStorageOverview.vue @@ -120,7 +120,7 @@ export default class PipelineStorageOverview extends Vue { private getStorageItemUrl (pipelineId: string, itemId: string): string { let url = StorageClient.createUrlForItem(pipelineId, itemId) - if(url.startsWith("/")) { + if(url.startsWith('/')) { url = window.location.origin + url } return url @@ -128,7 +128,7 @@ export default class PipelineStorageOverview extends Vue { private getLatestStorageItemUrl (pipelineId: string): string { let url = StorageClient.createUrlForLatestItem(pipelineId) - if(url.startsWith("/")) { + if(url.startsWith('/')) { url = window.location.origin + url } return url From 0c976ae10f8a4bf290888a985904f536b48651b5 Mon Sep 17 00:00:00 2001 From: Andreas Bauer Date: Thu, 29 Aug 2019 12:59:49 +0000 Subject: [PATCH 0051/1168] Resolve "Upgrade dependencies" --- adapter/build.gradle | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- core/build.gradle | 2 +- core/gradle/wrapper/gradle-wrapper.properties | 2 +- core/integration-test/package-lock.json | 1192 ++++---- core/integration-test/package.json | 4 +- scheduler/integration-test/package-lock.json | 1173 ++++---- scheduler/integration-test/package.json | 6 +- scheduler/package-lock.json | 2657 +++++++++-------- scheduler/package.json | 36 +- .../integration-test/package-lock.json | 1241 ++++---- transformation/integration-test/package.json | 4 +- transformation/package-lock.json | 1568 +++++----- transformation/package.json | 28 +- ui/package-lock.json | 1859 +++++++----- ui/package.json | 41 +- ui/src/App.vue | 33 +- ui/src/components/Login.vue | 28 +- ui/src/main.ts | 8 +- ui/src/pipeline/PipelineEdit.vue | 21 +- ui/src/pipeline/PipelineOverview.vue | 66 +- ui/src/storage/PipelineStorageOverview.vue | 120 +- 22 files changed, 5227 insertions(+), 4867 deletions(-) diff --git a/adapter/build.gradle b/adapter/build.gradle index c21bc1c92..26a8bbadf 100644 --- a/adapter/build.gradle +++ b/adapter/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'org.springframework.boot' version '2.2.0.M2' + id 'org.springframework.boot' version '2.2.0.M5' id 'java' } diff --git a/adapter/gradle/wrapper/gradle-wrapper.properties b/adapter/gradle/wrapper/gradle-wrapper.properties index 2c97e5722..59b5f8928 100644 --- a/adapter/gradle/wrapper/gradle-wrapper.properties +++ b/adapter/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,5 @@ -#Mon May 27 17:04:52 CEST 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.2.1-all.zip diff --git a/core/build.gradle b/core/build.gradle index 4cadac3fd..a6d855870 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'org.springframework.boot' version '2.2.0.M2' + id 'org.springframework.boot' version '2.2.0.M5' id 'java' } diff --git a/core/gradle/wrapper/gradle-wrapper.properties b/core/gradle/wrapper/gradle-wrapper.properties index 44e7c4d1d..59b5f8928 100644 --- a/core/gradle/wrapper/gradle-wrapper.properties +++ b/core/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.2.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/core/integration-test/package-lock.json b/core/integration-test/package-lock.json index ee2ea98e8..a5b12dbf6 100644 --- a/core/integration-test/package-lock.json +++ b/core/integration-test/package-lock.json @@ -5,31 +5,31 @@ "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", "dev": true, "requires": { "@babel/highlight": "^7.0.0" } }, "@babel/core": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.5.tgz", - "integrity": "sha512-OvjIh6aqXtlsA8ujtGKfC7LYWksYSX8yQcM8Ay3LuvVeQ63lcOKgoZWVqcpFwkd29aYU9rVx7jxhfhiEDV9MZA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.5.5.tgz", + "integrity": "sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.4", - "@babel/helpers": "^7.4.4", - "@babel/parser": "^7.4.5", + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helpers": "^7.5.5", + "@babel/parser": "^7.5.5", "@babel/template": "^7.4.4", - "@babel/traverse": "^7.4.5", - "@babel/types": "^7.4.4", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5", "convert-source-map": "^1.1.0", "debug": "^4.1.0", "json5": "^2.1.0", - "lodash": "^4.17.11", + "lodash": "^4.17.13", "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" @@ -59,14 +59,14 @@ } }, "@babel/generator": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", - "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", "dev": true, "requires": { - "@babel/types": "^7.4.4", + "@babel/types": "^7.5.5", "jsesc": "^2.5.1", - "lodash": "^4.17.11", + "lodash": "^4.17.13", "source-map": "^0.5.0", "trim-right": "^1.0.1" }, @@ -115,20 +115,20 @@ } }, "@babel/helpers": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.4.4.tgz", - "integrity": "sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.5.5.tgz", + "integrity": "sha512-nRq2BUhxZFnfEn/ciJuhklHvFOqjJUD5wpx+1bxUF2axL9C+v4DE/dmp5sT2dKnpOs4orZWzpAZqlCy8QqE/7g==", "dev": true, "requires": { "@babel/template": "^7.4.4", - "@babel/traverse": "^7.4.4", - "@babel/types": "^7.4.4" + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5" } }, "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", "dev": true, "requires": { "chalk": "^2.0.0", @@ -137,9 +137,9 @@ } }, "@babel/parser": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", - "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", + "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==", "dev": true }, "@babel/plugin-syntax-object-rest-spread": { @@ -163,20 +163,20 @@ } }, "@babel/traverse": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz", - "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.4", + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", "@babel/helper-function-name": "^7.1.0", "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.4.5", - "@babel/types": "^7.4.4", + "@babel/parser": "^7.5.5", + "@babel/types": "^7.5.5", "debug": "^4.1.0", "globals": "^11.1.0", - "lodash": "^4.17.11" + "lodash": "^4.17.13" }, "dependencies": { "debug": { @@ -197,13 +197,13 @@ } }, "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", "dev": true, "requires": { "esutils": "^2.0.2", - "lodash": "^4.17.11", + "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } }, @@ -217,85 +217,120 @@ "minimist": "^1.2.0" } }, + "@hapi/address": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.0.0.tgz", + "integrity": "sha512-mV6T0IYqb0xL1UALPFplXYQmR0twnXG0M6jUswpquqT2sD12BOiCiLy3EvMp/Fy7s3DZElC4/aPjEjo2jeZpvw==" + }, + "@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==" + }, + "@hapi/hoek": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.2.1.tgz", + "integrity": "sha512-JPiBy+oSmsq3St7XlipfN5pNA6bDJ1kpa73PrK/zR29CVClDVqy04AanM/M/qx5bSF+I61DdCfAvRrujau+zRg==" + }, + "@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==", + "requires": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "@hapi/topo": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.3.tgz", + "integrity": "sha512-JmS9/vQK6dcUYn7wc2YZTqzIKubAQcJKu2KCKAru6es482U5RT5fP1EXCPtlXpiK7PR0On/kpQKI4fRKkzpZBQ==", + "requires": { + "@hapi/hoek": "8.x.x" + } + }, "@jest/console": { - "version": "24.7.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.7.1.tgz", - "integrity": "sha512-iNhtIy2M8bXlAOULWVTUxmnelTLFneTNEkHCgPmgd+zNwy9zVddJ6oS5rZ9iwoscNdT5mMwUd0C51v/fSlzItg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", "dev": true, "requires": { - "@jest/source-map": "^24.3.0", + "@jest/source-map": "^24.9.0", "chalk": "^2.0.1", "slash": "^2.0.0" } }, "@jest/core": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.8.0.tgz", - "integrity": "sha512-R9rhAJwCBQzaRnrRgAdVfnglUuATXdwTRsYqs6NMdVcAl5euG8LtWDe+fVkN27YfKVBW61IojVsXKaOmSnqd/A==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", + "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", "dev": true, "requires": { "@jest/console": "^24.7.1", - "@jest/reporters": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/reporters": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", "ansi-escapes": "^3.0.0", "chalk": "^2.0.1", "exit": "^0.1.2", "graceful-fs": "^4.1.15", - "jest-changed-files": "^24.8.0", - "jest-config": "^24.8.0", - "jest-haste-map": "^24.8.0", - "jest-message-util": "^24.8.0", + "jest-changed-files": "^24.9.0", + "jest-config": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-message-util": "^24.9.0", "jest-regex-util": "^24.3.0", - "jest-resolve-dependencies": "^24.8.0", - "jest-runner": "^24.8.0", - "jest-runtime": "^24.8.0", - "jest-snapshot": "^24.8.0", - "jest-util": "^24.8.0", - "jest-validate": "^24.8.0", - "jest-watcher": "^24.8.0", + "jest-resolve": "^24.9.0", + "jest-resolve-dependencies": "^24.9.0", + "jest-runner": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "jest-watcher": "^24.9.0", "micromatch": "^3.1.10", "p-each-series": "^1.0.0", - "pirates": "^4.0.1", "realpath-native": "^1.1.0", "rimraf": "^2.5.4", + "slash": "^2.0.0", "strip-ansi": "^5.0.0" } }, "@jest/environment": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.8.0.tgz", - "integrity": "sha512-vlGt2HLg7qM+vtBrSkjDxk9K0YtRBi7HfRFaDxoRtyi+DyVChzhF20duvpdAnKVBV6W5tym8jm0U9EfXbDk1tw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", + "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", "dev": true, "requires": { - "@jest/fake-timers": "^24.8.0", - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", - "jest-mock": "^24.8.0" + "@jest/fake-timers": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0" } }, "@jest/fake-timers": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.8.0.tgz", - "integrity": "sha512-2M4d5MufVXwi6VzZhJ9f5S/wU4ud2ck0kxPof1Iz3zWx6Y+V2eJrES9jEktB6O3o/oEyk+il/uNu9PvASjWXQw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", + "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", "dev": true, "requires": { - "@jest/types": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-mock": "^24.8.0" + "@jest/types": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0" } }, "@jest/reporters": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.8.0.tgz", - "integrity": "sha512-eZ9TyUYpyIIXfYCrw0UHUWUvE35vx5I92HGMgS93Pv7du+GHIzl+/vh8Qj9MCWFK/4TqyttVBPakWMOfZRIfxw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", + "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", "dev": true, "requires": { - "@jest/environment": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", "exit": "^0.1.2", "glob": "^7.1.2", @@ -303,22 +338,22 @@ "istanbul-lib-instrument": "^3.0.1", "istanbul-lib-report": "^2.0.4", "istanbul-lib-source-maps": "^3.0.1", - "istanbul-reports": "^2.1.1", - "jest-haste-map": "^24.8.0", - "jest-resolve": "^24.8.0", - "jest-runtime": "^24.8.0", - "jest-util": "^24.8.0", + "istanbul-reports": "^2.2.6", + "jest-haste-map": "^24.9.0", + "jest-resolve": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-util": "^24.9.0", "jest-worker": "^24.6.0", - "node-notifier": "^5.2.1", + "node-notifier": "^5.4.2", "slash": "^2.0.0", "source-map": "^0.6.0", "string-length": "^2.0.0" } }, "@jest/source-map": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.3.0.tgz", - "integrity": "sha512-zALZt1t2ou8le/crCeeiRYzvdnTzaIlpOWaet45lNSqNJUnXbppUUFR4ZUAlzgDmKee4Q5P/tKXypI1RiHwgag==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", "dev": true, "requires": { "callsites": "^3.0.0", @@ -327,45 +362,46 @@ } }, "@jest/test-result": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.8.0.tgz", - "integrity": "sha512-+YdLlxwizlfqkFDh7Mc7ONPQAhA4YylU1s529vVM1rsf67vGZH/2GGm5uO8QzPeVyaVMobCQ7FTxl38QrKRlng==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", "dev": true, "requires": { - "@jest/console": "^24.7.1", - "@jest/types": "^24.8.0", + "@jest/console": "^24.9.0", + "@jest/types": "^24.9.0", "@types/istanbul-lib-coverage": "^2.0.0" } }, "@jest/test-sequencer": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.8.0.tgz", - "integrity": "sha512-OzL/2yHyPdCHXEzhoBuq37CE99nkme15eHkAzXRVqthreWZamEMA0WoetwstsQBCXABhczpK03JNbc4L01vvLg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", + "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", "dev": true, "requires": { - "@jest/test-result": "^24.8.0", - "jest-haste-map": "^24.8.0", - "jest-runner": "^24.8.0", - "jest-runtime": "^24.8.0" + "@jest/test-result": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-runner": "^24.9.0", + "jest-runtime": "^24.9.0" } }, "@jest/transform": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.8.0.tgz", - "integrity": "sha512-xBMfFUP7TortCs0O+Xtez2W7Zu1PLH9bvJgtraN1CDST6LBM/eTOZ9SfwS/lvV8yOfcDpFmwf9bq5cYbXvqsvA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", + "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "babel-plugin-istanbul": "^5.1.0", "chalk": "^2.0.1", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.8.0", - "jest-regex-util": "^24.3.0", - "jest-util": "^24.8.0", + "jest-haste-map": "^24.9.0", + "jest-regex-util": "^24.9.0", + "jest-util": "^24.9.0", "micromatch": "^3.1.10", + "pirates": "^4.0.1", "realpath-native": "^1.1.0", "slash": "^2.0.0", "source-map": "^0.6.1", @@ -373,14 +409,14 @@ } }, "@jest/types": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.8.0.tgz", - "integrity": "sha512-g17UxVr2YfBtaMUxn9u/4+siG1ptg9IGYAYwvpwn61nBg779RXnjE/m7CxYcIzEt0AbHZZAHSEZNhkE2WxURVg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^12.0.9" + "@types/yargs": "^13.0.0" } }, "@types/babel__core": { @@ -456,15 +492,24 @@ "dev": true }, "@types/yargs": { - "version": "12.0.12", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-12.0.12.tgz", - "integrity": "sha512-SOhuU4wNBxhhTHxYaiG5NY4HBhDIDnJF60GU+2LqHAdKKer86//e4yg69aENCtQ04n0ovz+tq2YPME5t5yp4pw==", + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.2.tgz", + "integrity": "sha512-lwwgizwk/bIIU+3ELORkyuOgDjCh7zuWDFqRtPPhhVgq9N1F7CvLNKg1TX4f2duwtKQ0p044Au9r1PLIXHrIzQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-13.0.0.tgz", + "integrity": "sha512-wBlsw+8n21e6eTd4yVv8YD/E3xq0O6nNnJIquutAsFGE7EyMKz7W6RNT6BRu1SmdgmlCZ9tb0X+j+D6HGr8pZw==", "dev": true }, "abab": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", - "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.1.tgz", + "integrity": "sha512-1zSbbCuoIjafKZ3mblY5ikvAb0ODUbqBnFuUb7f6uLeQhhGJ0vEV4ntmtxKLT2WgXCO94E07BjunsIw1jOMPZw==", "dev": true }, "acorn": { @@ -474,9 +519,9 @@ "dev": true }, "acorn-globals": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.2.tgz", - "integrity": "sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.3.tgz", + "integrity": "sha512-vkR40VwS2SYO98AIeFvzWWh+xyc2qi9s7OoXSFEGIP/rOJKzjnhykaZJNnHdoq4BL2gGxI5EZOU16z896EYnOQ==", "dev": true, "requires": { "acorn": "^6.0.1", @@ -484,23 +529,23 @@ }, "dependencies": { "acorn": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", - "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", "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": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", "dev": true }, "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", "requires": { "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", @@ -595,9 +640,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": { @@ -622,48 +667,49 @@ "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" }, "babel-jest": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.8.0.tgz", - "integrity": "sha512-+5/kaZt4I9efoXzPlZASyK/lN9qdRKmmUav9smVc0ruPQD7IsfucQ87gpOE8mn2jbDuS6M/YOW6n3v9ZoIfgnw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", + "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", "dev": true, "requires": { - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", "@types/babel__core": "^7.1.0", "babel-plugin-istanbul": "^5.1.0", - "babel-preset-jest": "^24.6.0", + "babel-preset-jest": "^24.9.0", "chalk": "^2.4.2", "slash": "^2.0.0" } }, "babel-plugin-istanbul": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.4.tgz", - "integrity": "sha512-dySz4VJMH+dpndj0wjJ8JPs/7i1TdSPb1nRrn56/92pKOF9VKC1FMFJmMXjzlGGusnCAqujP6PBCiKq0sVA+YQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", + "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", "dev": true, "requires": { + "@babel/helper-plugin-utils": "^7.0.0", "find-up": "^3.0.0", "istanbul-lib-instrument": "^3.3.0", "test-exclude": "^5.2.3" } }, "babel-plugin-jest-hoist": { - "version": "24.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.6.0.tgz", - "integrity": "sha512-3pKNH6hMt9SbOv0F3WVmy5CWQ4uogS3k0GY5XLyQHJ9EGpAT9XWkFd2ZiXXtkwFHdAHa5j7w7kfxSP5lAIwu7w==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", + "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", "dev": true, "requires": { "@types/babel__traverse": "^7.0.6" } }, "babel-preset-jest": { - "version": "24.6.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.6.0.tgz", - "integrity": "sha512-pdZqLEdmy1ZK5kyRUfvBb2IfTPb2BUvIJczlPspS8fWmBQslNNDBqVfh7BW5leOVJMDZKzjD8XEyABTk6gQ5yw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", + "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", "dev": true, "requires": { "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^24.6.0" + "babel-plugin-jest-hoist": "^24.9.0" } }, "balanced-match": { @@ -896,31 +942,14 @@ } }, "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" } }, "co": { @@ -929,12 +958,6 @@ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -1032,15 +1055,15 @@ } }, "cssom": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.6.tgz", - "integrity": "sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", "dev": true }, "cssstyle": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.2.2.tgz", - "integrity": "sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", + "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", "dev": true, "requires": { "cssom": "0.3.x" @@ -1167,9 +1190,9 @@ "dev": true }, "diff-sequences": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.3.0.tgz", - "integrity": "sha512-xLqpez+Zj9GKSnPWS0WZw1igGocZ+uua8+y+5dDNTT934N3QuY1sp2LkHzwiaYQGz60hMq0pjAshdeXm5VUOEw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", + "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", "dev": true }, "domexception": { @@ -1190,6 +1213,12 @@ "safer-buffer": "^2.1.0" } }, + "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 + }, "end-of-stream": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", @@ -1240,9 +1269,9 @@ "dev": true }, "escodegen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", - "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz", + "integrity": "sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==", "dev": true, "requires": { "esprima": "^3.1.3", @@ -1259,15 +1288,15 @@ "dev": true }, "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, "exec-sh": { @@ -1333,17 +1362,17 @@ } }, "expect": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-24.8.0.tgz", - "integrity": "sha512-/zYvP8iMDrzaaxHVa724eJBCKqSHmO0FA7EDkBiRHxg6OipmMn1fN+C8T9L9K8yr7UONkOifu6+LLH+z76CnaA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", + "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", "dev": true, "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "ansi-styles": "^3.2.0", - "jest-get-type": "^24.8.0", - "jest-matcher-utils": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-regex-util": "^24.3.0" + "jest-get-type": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-regex-util": "^24.9.0" } }, "extend": { @@ -2096,9 +2125,9 @@ "dev": true }, "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, "get-stream": { @@ -2145,9 +2174,9 @@ "dev": true }, "graceful-fs": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", - "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", "dev": true }, "growly": { @@ -2235,15 +2264,10 @@ } } }, - "hoek": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-5.0.4.tgz", - "integrity": "sha512-Alr4ZQgoMlnere5FZJsIyfIjORBqZll5POhDsF4q64dPuJR6rNxXdDxtHSQq8OXRurhmx+PWYEE8bXRROY8h0w==" - }, "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.4.tgz", + "integrity": "sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==", "dev": true }, "html-encoding-sniffer": { @@ -2315,12 +2339,6 @@ "loose-envify": "^1.0.0" } }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", @@ -2507,14 +2525,6 @@ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, - "isemail": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/isemail/-/isemail-3.2.0.tgz", - "integrity": "sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg==", - "requires": { - "punycode": "2.x.x" - } - }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -2554,9 +2564,9 @@ }, "dependencies": { "semver": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.2.tgz", - "integrity": "sha512-z4PqiCpomGtWj8633oeAdXm1Kn1W++3T8epkZYnwiVgIYIJ0QHszhInYSJTYxebByQH7KVCEAn8R9duzZW2PhQ==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } @@ -2623,215 +2633,216 @@ } }, "jest": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-24.8.0.tgz", - "integrity": "sha512-o0HM90RKFRNWmAWvlyV8i5jGZ97pFwkeVoGvPW1EtLTgJc2+jcuqcbbqcSZLE/3f2S5pt0y2ZBETuhpWNl1Reg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", + "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", "dev": true, "requires": { "import-local": "^2.0.0", - "jest-cli": "^24.8.0" + "jest-cli": "^24.9.0" }, "dependencies": { "jest-cli": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.8.0.tgz", - "integrity": "sha512-+p6J00jSMPQ116ZLlHJJvdf8wbjNbZdeSX9ptfHX06/MSNaXmKihQzx5vQcw0q2G6JsdVkUIdWbOWtSnaYs3yA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", + "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", "dev": true, "requires": { - "@jest/core": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/core": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", "exit": "^0.1.2", "import-local": "^2.0.0", "is-ci": "^2.0.0", - "jest-config": "^24.8.0", - "jest-util": "^24.8.0", - "jest-validate": "^24.8.0", + "jest-config": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", "prompts": "^2.0.1", "realpath-native": "^1.1.0", - "yargs": "^12.0.2" + "yargs": "^13.3.0" } } } }, "jest-changed-files": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.8.0.tgz", - "integrity": "sha512-qgANC1Yrivsq+UrLXsvJefBKVoCsKB0Hv+mBb6NMjjZ90wwxCDmU3hsCXBya30cH+LnPYjwgcU65i6yJ5Nfuug==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", + "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", "dev": true, "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "execa": "^1.0.0", "throat": "^4.0.0" } }, "jest-config": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.8.0.tgz", - "integrity": "sha512-Czl3Nn2uEzVGsOeaewGWoDPD8GStxCpAe0zOYs2x2l0fZAgPbCr3uwUkgNKV3LwE13VXythM946cd5rdGkkBZw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", + "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^24.8.0", - "@jest/types": "^24.8.0", - "babel-jest": "^24.8.0", + "@jest/test-sequencer": "^24.9.0", + "@jest/types": "^24.9.0", + "babel-jest": "^24.9.0", "chalk": "^2.0.1", "glob": "^7.1.1", - "jest-environment-jsdom": "^24.8.0", - "jest-environment-node": "^24.8.0", - "jest-get-type": "^24.8.0", - "jest-jasmine2": "^24.8.0", + "jest-environment-jsdom": "^24.9.0", + "jest-environment-node": "^24.9.0", + "jest-get-type": "^24.9.0", + "jest-jasmine2": "^24.9.0", "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.8.0", - "jest-util": "^24.8.0", - "jest-validate": "^24.8.0", + "jest-resolve": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", "micromatch": "^3.1.10", - "pretty-format": "^24.8.0", + "pretty-format": "^24.9.0", "realpath-native": "^1.1.0" } }, "jest-diff": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.8.0.tgz", - "integrity": "sha512-wxetCEl49zUpJ/bvUmIFjd/o52J+yWcoc5ZyPq4/W1LUKGEhRYDIbP1KcF6t+PvqNrGAFk4/JhtxDq/Nnzs66g==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", + "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", "dev": true, "requires": { "chalk": "^2.0.1", - "diff-sequences": "^24.3.0", - "jest-get-type": "^24.8.0", - "pretty-format": "^24.8.0" + "diff-sequences": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" } }, "jest-docblock": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.3.0.tgz", - "integrity": "sha512-nlANmF9Yq1dufhFlKG9rasfQlrY7wINJbo3q01tu56Jv5eBU5jirylhF2O5ZBnLxzOVBGRDz/9NAwNyBtG4Nyg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz", + "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==", "dev": true, "requires": { "detect-newline": "^2.1.0" } }, "jest-each": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.8.0.tgz", - "integrity": "sha512-NrwK9gaL5+XgrgoCsd9svsoWdVkK4gnvyhcpzd6m487tXHqIdYeykgq3MKI1u4I+5Zf0tofr70at9dWJDeb+BA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", + "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", "dev": true, "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", - "jest-get-type": "^24.8.0", - "jest-util": "^24.8.0", - "pretty-format": "^24.8.0" + "jest-get-type": "^24.9.0", + "jest-util": "^24.9.0", + "pretty-format": "^24.9.0" } }, "jest-environment-jsdom": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.8.0.tgz", - "integrity": "sha512-qbvgLmR7PpwjoFjM/sbuqHJt/NCkviuq9vus9NBn/76hhSidO+Z6Bn9tU8friecegbJL8gzZQEMZBQlFWDCwAQ==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", + "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", "dev": true, "requires": { - "@jest/environment": "^24.8.0", - "@jest/fake-timers": "^24.8.0", - "@jest/types": "^24.8.0", - "jest-mock": "^24.8.0", - "jest-util": "^24.8.0", + "@jest/environment": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-util": "^24.9.0", "jsdom": "^11.5.1" } }, "jest-environment-node": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.8.0.tgz", - "integrity": "sha512-vIGUEScd1cdDgR6sqn2M08sJTRLQp6Dk/eIkCeO4PFHxZMOgy+uYLPMC4ix3PEfM5Au/x3uQ/5Tl0DpXXZsJ/Q==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", + "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", "dev": true, "requires": { - "@jest/environment": "^24.8.0", - "@jest/fake-timers": "^24.8.0", - "@jest/types": "^24.8.0", - "jest-mock": "^24.8.0", - "jest-util": "^24.8.0" + "@jest/environment": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-util": "^24.9.0" } }, "jest-get-type": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.8.0.tgz", - "integrity": "sha512-RR4fo8jEmMD9zSz2nLbs2j0zvPpk/KCEz3a62jJWbd2ayNo0cb+KFRxPHVhE4ZmgGJEQp0fosmNz84IfqM8cMQ==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", "dev": true }, "jest-haste-map": { - "version": "24.8.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.8.1.tgz", - "integrity": "sha512-SwaxMGVdAZk3ernAx2Uv2sorA7jm3Kx+lR0grp6rMmnY06Kn/urtKx1LPN2mGTea4fCT38impYT28FfcLUhX0g==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", + "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", "dev": true, "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "anymatch": "^2.0.0", "fb-watchman": "^2.0.0", "fsevents": "^1.2.7", "graceful-fs": "^4.1.15", "invariant": "^2.2.4", - "jest-serializer": "^24.4.0", - "jest-util": "^24.8.0", - "jest-worker": "^24.6.0", + "jest-serializer": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.9.0", "micromatch": "^3.1.10", "sane": "^4.0.3", "walker": "^1.0.7" } }, "jest-jasmine2": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.8.0.tgz", - "integrity": "sha512-cEky88npEE5LKd5jPpTdDCLvKkdyklnaRycBXL6GNmpxe41F0WN44+i7lpQKa/hcbXaQ+rc9RMaM4dsebrYong==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", + "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", "co": "^4.6.0", - "expect": "^24.8.0", + "expect": "^24.9.0", "is-generator-fn": "^2.0.0", - "jest-each": "^24.8.0", - "jest-matcher-utils": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-runtime": "^24.8.0", - "jest-snapshot": "^24.8.0", - "jest-util": "^24.8.0", - "pretty-format": "^24.8.0", + "jest-each": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "pretty-format": "^24.9.0", "throat": "^4.0.0" } }, "jest-leak-detector": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.8.0.tgz", - "integrity": "sha512-cG0yRSK8A831LN8lIHxI3AblB40uhv0z+SsQdW3GoMMVcK+sJwrIIyax5tu3eHHNJ8Fu6IMDpnLda2jhn2pD/g==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", + "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", "dev": true, "requires": { - "pretty-format": "^24.8.0" + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" } }, "jest-matcher-utils": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.8.0.tgz", - "integrity": "sha512-lex1yASY51FvUuHgm0GOVj7DCYEouWSlIYmCW7APSqB9v8mXmKSn5+sWVF0MhuASG0bnYY106/49JU1FZNl5hw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", + "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", "dev": true, "requires": { "chalk": "^2.0.1", - "jest-diff": "^24.8.0", - "jest-get-type": "^24.8.0", - "pretty-format": "^24.8.0" + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" } }, "jest-message-util": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.8.0.tgz", - "integrity": "sha512-p2k71rf/b6ns8btdB0uVdljWo9h0ovpnEe05ZKWceQGfXYr4KkzgKo3PBi8wdnd9OtNh46VpNIJynUn/3MKm1g==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "@types/stack-utils": "^1.0.1", "chalk": "^2.0.1", "micromatch": "^3.1.10", @@ -2840,12 +2851,12 @@ } }, "jest-mock": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.8.0.tgz", - "integrity": "sha512-6kWugwjGjJw+ZkK4mDa0Df3sDlUTsV47MSrT0nGQ0RBWJbpODDQ8MHDVtGtUYBne3IwZUhtB7elxHspU79WH3A==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", + "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", "dev": true, "requires": { - "@jest/types": "^24.8.0" + "@jest/types": "^24.9.0" } }, "jest-pnp-resolver": { @@ -2855,18 +2866,18 @@ "dev": true }, "jest-regex-util": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.3.0.tgz", - "integrity": "sha512-tXQR1NEOyGlfylyEjg1ImtScwMq8Oh3iJbGTjN7p0J23EuVX1MA8rwU69K4sLbCmwzgCUbVkm0FkSF9TdzOhtg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", + "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", "dev": true }, "jest-resolve": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.8.0.tgz", - "integrity": "sha512-+hjSzi1PoRvnuOICoYd5V/KpIQmkAsfjFO71458hQ2Whi/yf1GDeBOFj8Gxw4LrApHsVJvn5fmjcPdmoUHaVKw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", + "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", "dev": true, "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "browser-resolve": "^1.11.3", "chalk": "^2.0.1", "jest-pnp-resolver": "^1.2.1", @@ -2874,111 +2885,120 @@ } }, "jest-resolve-dependencies": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.8.0.tgz", - "integrity": "sha512-hyK1qfIf/krV+fSNyhyJeq3elVMhK9Eijlwy+j5jqmZ9QsxwKBiP6qukQxaHtK8k6zql/KYWwCTQ+fDGTIJauw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz", + "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", "dev": true, "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "jest-regex-util": "^24.3.0", - "jest-snapshot": "^24.8.0" + "jest-snapshot": "^24.9.0" } }, "jest-runner": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.8.0.tgz", - "integrity": "sha512-utFqC5BaA3JmznbissSs95X1ZF+d+4WuOWwpM9+Ak356YtMhHE/GXUondZdcyAAOTBEsRGAgH/0TwLzfI9h7ow==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", + "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", "dev": true, "requires": { "@jest/console": "^24.7.1", - "@jest/environment": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "chalk": "^2.4.2", "exit": "^0.1.2", "graceful-fs": "^4.1.15", - "jest-config": "^24.8.0", + "jest-config": "^24.9.0", "jest-docblock": "^24.3.0", - "jest-haste-map": "^24.8.0", - "jest-jasmine2": "^24.8.0", - "jest-leak-detector": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-resolve": "^24.8.0", - "jest-runtime": "^24.8.0", - "jest-util": "^24.8.0", + "jest-haste-map": "^24.9.0", + "jest-jasmine2": "^24.9.0", + "jest-leak-detector": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-resolve": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-util": "^24.9.0", "jest-worker": "^24.6.0", "source-map-support": "^0.5.6", "throat": "^4.0.0" } }, "jest-runtime": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.8.0.tgz", - "integrity": "sha512-Mq0aIXhvO/3bX44ccT+czU1/57IgOMyy80oM0XR/nyD5zgBcesF84BPabZi39pJVA6UXw+fY2Q1N+4BiVUBWOA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", + "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", "dev": true, "requires": { "@jest/console": "^24.7.1", - "@jest/environment": "^24.8.0", + "@jest/environment": "^24.9.0", "@jest/source-map": "^24.3.0", - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", - "@types/yargs": "^12.0.2", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/yargs": "^13.0.0", "chalk": "^2.0.1", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.1.15", - "jest-config": "^24.8.0", - "jest-haste-map": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-mock": "^24.8.0", + "jest-config": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0", "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.8.0", - "jest-snapshot": "^24.8.0", - "jest-util": "^24.8.0", - "jest-validate": "^24.8.0", + "jest-resolve": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", "realpath-native": "^1.1.0", "slash": "^2.0.0", "strip-bom": "^3.0.0", - "yargs": "^12.0.2" + "yargs": "^13.3.0" } }, "jest-serializer": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.4.0.tgz", - "integrity": "sha512-k//0DtglVstc1fv+GY/VHDIjrtNjdYvYjMlbLUed4kxrE92sIUewOi5Hj3vrpB8CXfkJntRPDRjCrCvUhBdL8Q==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", + "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", "dev": true }, "jest-snapshot": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.8.0.tgz", - "integrity": "sha512-5ehtWoc8oU9/cAPe6fez6QofVJLBKyqkY2+TlKTOf0VllBB/mqUNdARdcjlZrs9F1Cv+/HKoCS/BknT0+tmfPg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", + "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", "dev": true, "requires": { "@babel/types": "^7.0.0", - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", - "expect": "^24.8.0", - "jest-diff": "^24.8.0", - "jest-matcher-utils": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-resolve": "^24.8.0", + "expect": "^24.9.0", + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-resolve": "^24.9.0", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "pretty-format": "^24.8.0", - "semver": "^5.5.0" + "pretty-format": "^24.9.0", + "semver": "^6.2.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 + } } }, "jest-util": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.8.0.tgz", - "integrity": "sha512-DYZeE+XyAnbNt0BG1OQqKy/4GVLPtzwGx5tsnDrFcax36rVE3lTA5fbvgmbVPUZf9w77AJ8otqR4VBbfFJkUZA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", + "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", "dev": true, "requires": { - "@jest/console": "^24.7.1", - "@jest/fake-timers": "^24.8.0", - "@jest/source-map": "^24.3.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/console": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/source-map": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "callsites": "^3.0.0", "chalk": "^2.0.1", "graceful-fs": "^4.1.15", @@ -2989,41 +3009,41 @@ } }, "jest-validate": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.8.0.tgz", - "integrity": "sha512-+/N7VOEMW1Vzsrk3UWBDYTExTPwf68tavEPKDnJzrC6UlHtUDU/fuEdXqFoHzv9XnQ+zW6X3qMZhJ3YexfeLDA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", + "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", "dev": true, "requires": { - "@jest/types": "^24.8.0", - "camelcase": "^5.0.0", + "@jest/types": "^24.9.0", + "camelcase": "^5.3.1", "chalk": "^2.0.1", - "jest-get-type": "^24.8.0", - "leven": "^2.1.0", - "pretty-format": "^24.8.0" + "jest-get-type": "^24.9.0", + "leven": "^3.1.0", + "pretty-format": "^24.9.0" } }, "jest-watcher": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.8.0.tgz", - "integrity": "sha512-SBjwHt5NedQoVu54M5GEx7cl7IGEFFznvd/HNT8ier7cCAx/Qgu9ZMlaTQkvK22G1YOpcWBLQPFSImmxdn3DAw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz", + "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", "dev": true, "requires": { - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", - "@types/yargs": "^12.0.9", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/yargs": "^13.0.0", "ansi-escapes": "^3.0.0", "chalk": "^2.0.1", - "jest-util": "^24.8.0", + "jest-util": "^24.9.0", "string-length": "^2.0.0" } }, "jest-worker": { - "version": "24.6.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.6.0.tgz", - "integrity": "sha512-jDwgW5W9qGNvpI1tNnvajh0a5IE/PuGLFmHk6aR/BZFz8tSgGw17GsDPXAJ6p91IvYDjOw8GpFbvvZGAK+DPQQ==", + "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": "^1.0.1", + "merge-stream": "^2.0.0", "supports-color": "^6.1.0" }, "dependencies": { @@ -3038,16 +3058,6 @@ } } }, - "joi": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-13.7.0.tgz", - "integrity": "sha512-xuY5VkHfeOYK3Hdi91ulocfuFopwgbSORmIwzcwHKESQhC7w1kD5jaVSPnqDxS2I8t3RZ9omCKAxNwXN5zG1/Q==", - "requires": { - "hoek": "5.x.x", - "isemail": "3.x.x", - "topo": "3.x.x" - } - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -3152,15 +3162,6 @@ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, "left-pad": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", @@ -3168,9 +3169,9 @@ "dev": true }, "leven": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", - "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "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": { @@ -3206,9 +3207,9 @@ } }, "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, "lodash.sortby": { @@ -3253,15 +3254,6 @@ "tmpl": "1.0.x" } }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -3277,25 +3269,11 @@ "object-visit": "^1.0.0" } }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - } - }, "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } + "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 }, "methods": { "version": "1.1.2", @@ -3343,12 +3321,6 @@ "mime-db": "1.40.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 - }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -3464,9 +3436,9 @@ "dev": true }, "node-notifier": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.0.tgz", - "integrity": "sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ==", + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", + "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", "dev": true, "requires": { "growly": "^1.3.0", @@ -3506,12 +3478,6 @@ "path-key": "^2.0.0" } }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, "nwsapi": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz", @@ -3637,23 +3603,6 @@ } } }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, "p-each-series": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", @@ -3669,16 +3618,10 @@ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true - }, "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "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" @@ -3808,12 +3751,12 @@ "dev": true }, "pretty-format": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.8.0.tgz", - "integrity": "sha512-P952T7dkrDEplsR+TuY7q3VXDae5Sr7zmQb12JU/NDQa/3CH7/QW0yvqLcGN6jL+zQFKaoJcPc+yJxMTGmosqw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", "dev": true, "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "ansi-regex": "^4.0.0", "ansi-styles": "^3.2.0", "react-is": "^16.8.4" @@ -3826,19 +3769,19 @@ "dev": true }, "prompts": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.1.0.tgz", - "integrity": "sha512-+x5TozgqYdOwWsQFZizE/Tra3fKvAoy037kOyU6cgz84n8f6zxngLOV4O32kTwt9FcLCxAqw0P/c8rOr9y+Gfg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.2.1.tgz", + "integrity": "sha512-VObPvJiWPhpZI6C5m60XOzTfnYg/xc/an+r9VYymj9WJW3B/DIH+REzjpAACPf8brwPeP+7vz3bIim3S+AaMjw==", "dev": true, "requires": { - "kleur": "^3.0.2", - "sisteransi": "^1.0.0" + "kleur": "^3.0.3", + "sisteransi": "^1.0.3" } }, "psl": { - "version": "1.1.33", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.33.tgz", - "integrity": "sha512-LTDP2uSrsc7XCb5lO7A8BI1qYxRe/8EqlRvMeEl6rsnYAqDOl8xHR+8lSAIVfrNaSAlTPTNOCgNjWcoUL3AZsw==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.3.0.tgz", + "integrity": "sha512-avHdspHO+9rQTLbv1RO+MPYeP/SzsCoxofjVnHanETfQhTJrmB0HlDoW+EiN/R+C0BZ+gERab9NY0lPN2TxNag==" }, "pump": { "version": "3.0.0", @@ -3861,9 +3804,9 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, "react-is": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", - "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==", + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.9.0.tgz", + "integrity": "sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw==", "dev": true }, "read-pkg": { @@ -4015,9 +3958,9 @@ "dev": true }, "resolve": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", - "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -4051,9 +3994,9 @@ "dev": true }, "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "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" @@ -4113,9 +4056,9 @@ "dev": true }, "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, "set-blocking": { @@ -4175,9 +4118,9 @@ "dev": true }, "sisteransi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.0.tgz", - "integrity": "sha512-N+z4pHB4AmUv0SjveWRd6q1Nj5w62m5jodv+GD8lvmbY/83T/rpbJGZOnK5T149OldDj4Db07BSv9xY4K6NTPQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.3.tgz", + "integrity": "sha512-SbEG75TzH8G7eVXFSN5f9EExILKfly7SUvVY5DhhYLvfhKqhDFY0OzevWa/zwak0RLRfWS5AvfMWpd9gJvr5Yg==", "dev": true }, "slash": { @@ -4319,9 +4262,9 @@ } }, "source-map-support": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", - "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -4361,9 +4304,9 @@ } }, "spdx-license-ids": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", - "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", "dev": true }, "split-string": { @@ -4452,30 +4395,14 @@ } }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { + "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } + "strip-ansi": "^5.1.0" } }, "string_decoder": { @@ -4640,21 +4567,6 @@ "repeat-string": "^1.6.1" } }, - "topo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/topo/-/topo-3.0.3.tgz", - "integrity": "sha512-IgpPtvD4kjrJ7CRA3ov2FhWQADwv+Tdqbsf1ZnPUSAtCJ9e1Z44MmoSGDXGk4IppoZA7jd/QRkNddlLJWlUZsQ==", - "requires": { - "hoek": "6.x.x" - }, - "dependencies": { - "hoek": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-6.1.3.tgz", - "integrity": "sha512-YXXAAhmF9zpQbC7LEcREFtXfGq5K1fmd+4PHkBq8NUqmzW3G+Dq10bI/i0KucLRwss3YYFQ0fSfoxBZYiGUqtQ==" - } - } - }, "tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -4802,9 +4714,9 @@ } }, "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" }, "validate-npm-package-license": { "version": "3.0.4", @@ -4836,12 +4748,12 @@ } }, "wait-on": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-3.2.0.tgz", - "integrity": "sha512-QUGNKlKLDyY6W/qHdxaRlXUAgLPe+3mLL/tRByHpRNcHs/c7dZXbu+OnJWGNux6tU1WFh/Z8aEwvbuzSAu79Zg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-3.3.0.tgz", + "integrity": "sha512-97dEuUapx4+Y12aknWZn7D25kkjMk16PbWoYzpSdA8bYpVfS6hpl2a2pOWZ3c+Tyt3/i4/pglyZctG3J4V1hWQ==", "requires": { - "core-js": "^2.5.7", - "joi": "^13.0.0", + "@hapi/joi": "^15.0.3", + "core-js": "^2.6.5", "minimist": "^1.2.0", "request": "^2.88.0", "rx": "^4.1.0" @@ -4910,50 +4822,14 @@ "dev": true }, "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "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 - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "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" - } - } + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" } }, "wrappy": { @@ -4995,37 +4871,27 @@ "dev": true }, "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", "dev": true, "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", + "cliui": "^5.0.0", "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", + "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", + "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^2.0.0", + "string-width": "^3.0.0", "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - }, - "dependencies": { - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - } + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" } }, "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", "dev": true, "requires": { "camelcase": "^5.0.0", diff --git a/core/integration-test/package.json b/core/integration-test/package.json index 020482469..ab9fd7af9 100644 --- a/core/integration-test/package.json +++ b/core/integration-test/package.json @@ -6,13 +6,13 @@ "test": "jest" }, "devDependencies": { - "jest": "^24.8.0", + "jest": "^24.9.0", "supertest": "^4.0.2" }, "jest": { "testEnvironment": "node" }, "dependencies": { - "wait-on": "^3.2.0" + "wait-on": "^3.3.0" } } diff --git a/scheduler/integration-test/package-lock.json b/scheduler/integration-test/package-lock.json index c984e30dd..658e6e269 100644 --- a/scheduler/integration-test/package-lock.json +++ b/scheduler/integration-test/package-lock.json @@ -5,31 +5,31 @@ "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", "dev": true, "requires": { "@babel/highlight": "^7.0.0" } }, "@babel/core": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.5.tgz", - "integrity": "sha512-OvjIh6aqXtlsA8ujtGKfC7LYWksYSX8yQcM8Ay3LuvVeQ63lcOKgoZWVqcpFwkd29aYU9rVx7jxhfhiEDV9MZA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.5.5.tgz", + "integrity": "sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.4", - "@babel/helpers": "^7.4.4", - "@babel/parser": "^7.4.5", + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helpers": "^7.5.5", + "@babel/parser": "^7.5.5", "@babel/template": "^7.4.4", - "@babel/traverse": "^7.4.5", - "@babel/types": "^7.4.4", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5", "convert-source-map": "^1.1.0", "debug": "^4.1.0", "json5": "^2.1.0", - "lodash": "^4.17.11", + "lodash": "^4.17.13", "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" @@ -59,14 +59,14 @@ } }, "@babel/generator": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", - "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", "dev": true, "requires": { - "@babel/types": "^7.4.4", + "@babel/types": "^7.5.5", "jsesc": "^2.5.1", - "lodash": "^4.17.11", + "lodash": "^4.17.13", "source-map": "^0.5.0", "trim-right": "^1.0.1" }, @@ -115,20 +115,20 @@ } }, "@babel/helpers": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.4.4.tgz", - "integrity": "sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.5.5.tgz", + "integrity": "sha512-nRq2BUhxZFnfEn/ciJuhklHvFOqjJUD5wpx+1bxUF2axL9C+v4DE/dmp5sT2dKnpOs4orZWzpAZqlCy8QqE/7g==", "dev": true, "requires": { "@babel/template": "^7.4.4", - "@babel/traverse": "^7.4.4", - "@babel/types": "^7.4.4" + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5" } }, "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", "dev": true, "requires": { "chalk": "^2.0.0", @@ -137,9 +137,9 @@ } }, "@babel/parser": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", - "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", + "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==", "dev": true }, "@babel/plugin-syntax-object-rest-spread": { @@ -163,20 +163,20 @@ } }, "@babel/traverse": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz", - "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.4", + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", "@babel/helper-function-name": "^7.1.0", "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.4.5", - "@babel/types": "^7.4.4", + "@babel/parser": "^7.5.5", + "@babel/types": "^7.5.5", "debug": "^4.1.0", "globals": "^11.1.0", - "lodash": "^4.17.11" + "lodash": "^4.17.13" }, "dependencies": { "debug": { @@ -197,13 +197,13 @@ } }, "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", "dev": true, "requires": { "esutils": "^2.0.2", - "lodash": "^4.17.11", + "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } }, @@ -217,85 +217,120 @@ "minimist": "^1.2.0" } }, + "@hapi/address": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.0.0.tgz", + "integrity": "sha512-mV6T0IYqb0xL1UALPFplXYQmR0twnXG0M6jUswpquqT2sD12BOiCiLy3EvMp/Fy7s3DZElC4/aPjEjo2jeZpvw==" + }, + "@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==" + }, + "@hapi/hoek": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.2.1.tgz", + "integrity": "sha512-JPiBy+oSmsq3St7XlipfN5pNA6bDJ1kpa73PrK/zR29CVClDVqy04AanM/M/qx5bSF+I61DdCfAvRrujau+zRg==" + }, + "@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==", + "requires": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "@hapi/topo": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.3.tgz", + "integrity": "sha512-JmS9/vQK6dcUYn7wc2YZTqzIKubAQcJKu2KCKAru6es482U5RT5fP1EXCPtlXpiK7PR0On/kpQKI4fRKkzpZBQ==", + "requires": { + "@hapi/hoek": "8.x.x" + } + }, "@jest/console": { - "version": "24.7.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.7.1.tgz", - "integrity": "sha512-iNhtIy2M8bXlAOULWVTUxmnelTLFneTNEkHCgPmgd+zNwy9zVddJ6oS5rZ9iwoscNdT5mMwUd0C51v/fSlzItg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", "dev": true, "requires": { - "@jest/source-map": "^24.3.0", + "@jest/source-map": "^24.9.0", "chalk": "^2.0.1", "slash": "^2.0.0" } }, "@jest/core": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.8.0.tgz", - "integrity": "sha512-R9rhAJwCBQzaRnrRgAdVfnglUuATXdwTRsYqs6NMdVcAl5euG8LtWDe+fVkN27YfKVBW61IojVsXKaOmSnqd/A==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", + "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", "dev": true, "requires": { "@jest/console": "^24.7.1", - "@jest/reporters": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/reporters": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", "ansi-escapes": "^3.0.0", "chalk": "^2.0.1", "exit": "^0.1.2", "graceful-fs": "^4.1.15", - "jest-changed-files": "^24.8.0", - "jest-config": "^24.8.0", - "jest-haste-map": "^24.8.0", - "jest-message-util": "^24.8.0", + "jest-changed-files": "^24.9.0", + "jest-config": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-message-util": "^24.9.0", "jest-regex-util": "^24.3.0", - "jest-resolve-dependencies": "^24.8.0", - "jest-runner": "^24.8.0", - "jest-runtime": "^24.8.0", - "jest-snapshot": "^24.8.0", - "jest-util": "^24.8.0", - "jest-validate": "^24.8.0", - "jest-watcher": "^24.8.0", + "jest-resolve": "^24.9.0", + "jest-resolve-dependencies": "^24.9.0", + "jest-runner": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "jest-watcher": "^24.9.0", "micromatch": "^3.1.10", "p-each-series": "^1.0.0", - "pirates": "^4.0.1", "realpath-native": "^1.1.0", "rimraf": "^2.5.4", + "slash": "^2.0.0", "strip-ansi": "^5.0.0" } }, "@jest/environment": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.8.0.tgz", - "integrity": "sha512-vlGt2HLg7qM+vtBrSkjDxk9K0YtRBi7HfRFaDxoRtyi+DyVChzhF20duvpdAnKVBV6W5tym8jm0U9EfXbDk1tw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", + "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", "dev": true, "requires": { - "@jest/fake-timers": "^24.8.0", - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", - "jest-mock": "^24.8.0" + "@jest/fake-timers": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0" } }, "@jest/fake-timers": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.8.0.tgz", - "integrity": "sha512-2M4d5MufVXwi6VzZhJ9f5S/wU4ud2ck0kxPof1Iz3zWx6Y+V2eJrES9jEktB6O3o/oEyk+il/uNu9PvASjWXQw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", + "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", "dev": true, "requires": { - "@jest/types": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-mock": "^24.8.0" + "@jest/types": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0" } }, "@jest/reporters": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.8.0.tgz", - "integrity": "sha512-eZ9TyUYpyIIXfYCrw0UHUWUvE35vx5I92HGMgS93Pv7du+GHIzl+/vh8Qj9MCWFK/4TqyttVBPakWMOfZRIfxw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", + "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", "dev": true, "requires": { - "@jest/environment": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", "exit": "^0.1.2", "glob": "^7.1.2", @@ -303,22 +338,22 @@ "istanbul-lib-instrument": "^3.0.1", "istanbul-lib-report": "^2.0.4", "istanbul-lib-source-maps": "^3.0.1", - "istanbul-reports": "^2.1.1", - "jest-haste-map": "^24.8.0", - "jest-resolve": "^24.8.0", - "jest-runtime": "^24.8.0", - "jest-util": "^24.8.0", + "istanbul-reports": "^2.2.6", + "jest-haste-map": "^24.9.0", + "jest-resolve": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-util": "^24.9.0", "jest-worker": "^24.6.0", - "node-notifier": "^5.2.1", + "node-notifier": "^5.4.2", "slash": "^2.0.0", "source-map": "^0.6.0", "string-length": "^2.0.0" } }, "@jest/source-map": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.3.0.tgz", - "integrity": "sha512-zALZt1t2ou8le/crCeeiRYzvdnTzaIlpOWaet45lNSqNJUnXbppUUFR4ZUAlzgDmKee4Q5P/tKXypI1RiHwgag==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", "dev": true, "requires": { "callsites": "^3.0.0", @@ -327,45 +362,46 @@ } }, "@jest/test-result": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.8.0.tgz", - "integrity": "sha512-+YdLlxwizlfqkFDh7Mc7ONPQAhA4YylU1s529vVM1rsf67vGZH/2GGm5uO8QzPeVyaVMobCQ7FTxl38QrKRlng==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", "dev": true, "requires": { - "@jest/console": "^24.7.1", - "@jest/types": "^24.8.0", + "@jest/console": "^24.9.0", + "@jest/types": "^24.9.0", "@types/istanbul-lib-coverage": "^2.0.0" } }, "@jest/test-sequencer": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.8.0.tgz", - "integrity": "sha512-OzL/2yHyPdCHXEzhoBuq37CE99nkme15eHkAzXRVqthreWZamEMA0WoetwstsQBCXABhczpK03JNbc4L01vvLg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", + "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", "dev": true, "requires": { - "@jest/test-result": "^24.8.0", - "jest-haste-map": "^24.8.0", - "jest-runner": "^24.8.0", - "jest-runtime": "^24.8.0" + "@jest/test-result": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-runner": "^24.9.0", + "jest-runtime": "^24.9.0" } }, "@jest/transform": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.8.0.tgz", - "integrity": "sha512-xBMfFUP7TortCs0O+Xtez2W7Zu1PLH9bvJgtraN1CDST6LBM/eTOZ9SfwS/lvV8yOfcDpFmwf9bq5cYbXvqsvA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", + "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "babel-plugin-istanbul": "^5.1.0", "chalk": "^2.0.1", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.8.0", - "jest-regex-util": "^24.3.0", - "jest-util": "^24.8.0", + "jest-haste-map": "^24.9.0", + "jest-regex-util": "^24.9.0", + "jest-util": "^24.9.0", "micromatch": "^3.1.10", + "pirates": "^4.0.1", "realpath-native": "^1.1.0", "slash": "^2.0.0", "source-map": "^0.6.1", @@ -373,14 +409,14 @@ } }, "@jest/types": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.8.0.tgz", - "integrity": "sha512-g17UxVr2YfBtaMUxn9u/4+siG1ptg9IGYAYwvpwn61nBg779RXnjE/m7CxYcIzEt0AbHZZAHSEZNhkE2WxURVg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^12.0.9" + "@types/yargs": "^13.0.0" } }, "@types/babel__core": { @@ -456,15 +492,24 @@ "dev": true }, "@types/yargs": { - "version": "12.0.12", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-12.0.12.tgz", - "integrity": "sha512-SOhuU4wNBxhhTHxYaiG5NY4HBhDIDnJF60GU+2LqHAdKKer86//e4yg69aENCtQ04n0ovz+tq2YPME5t5yp4pw==", + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.2.tgz", + "integrity": "sha512-lwwgizwk/bIIU+3ELORkyuOgDjCh7zuWDFqRtPPhhVgq9N1F7CvLNKg1TX4f2duwtKQ0p044Au9r1PLIXHrIzQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-13.0.0.tgz", + "integrity": "sha512-wBlsw+8n21e6eTd4yVv8YD/E3xq0O6nNnJIquutAsFGE7EyMKz7W6RNT6BRu1SmdgmlCZ9tb0X+j+D6HGr8pZw==", "dev": true }, "abab": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", - "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.1.tgz", + "integrity": "sha512-1zSbbCuoIjafKZ3mblY5ikvAb0ODUbqBnFuUb7f6uLeQhhGJ0vEV4ntmtxKLT2WgXCO94E07BjunsIw1jOMPZw==", "dev": true }, "abbrev": { @@ -489,9 +534,9 @@ "dev": true }, "acorn-globals": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.2.tgz", - "integrity": "sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.3.tgz", + "integrity": "sha512-vkR40VwS2SYO98AIeFvzWWh+xyc2qi9s7OoXSFEGIP/rOJKzjnhykaZJNnHdoq4BL2gGxI5EZOU16z896EYnOQ==", "dev": true, "requires": { "acorn": "^6.0.1", @@ -499,23 +544,23 @@ }, "dependencies": { "acorn": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", - "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", "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": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", "dev": true }, "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", "requires": { "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", @@ -630,9 +675,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": { @@ -657,48 +702,49 @@ "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" }, "babel-jest": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.8.0.tgz", - "integrity": "sha512-+5/kaZt4I9efoXzPlZASyK/lN9qdRKmmUav9smVc0ruPQD7IsfucQ87gpOE8mn2jbDuS6M/YOW6n3v9ZoIfgnw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", + "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", "dev": true, "requires": { - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", "@types/babel__core": "^7.1.0", "babel-plugin-istanbul": "^5.1.0", - "babel-preset-jest": "^24.6.0", + "babel-preset-jest": "^24.9.0", "chalk": "^2.4.2", "slash": "^2.0.0" } }, "babel-plugin-istanbul": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.4.tgz", - "integrity": "sha512-dySz4VJMH+dpndj0wjJ8JPs/7i1TdSPb1nRrn56/92pKOF9VKC1FMFJmMXjzlGGusnCAqujP6PBCiKq0sVA+YQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", + "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", "dev": true, "requires": { + "@babel/helper-plugin-utils": "^7.0.0", "find-up": "^3.0.0", "istanbul-lib-instrument": "^3.3.0", "test-exclude": "^5.2.3" } }, "babel-plugin-jest-hoist": { - "version": "24.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.6.0.tgz", - "integrity": "sha512-3pKNH6hMt9SbOv0F3WVmy5CWQ4uogS3k0GY5XLyQHJ9EGpAT9XWkFd2ZiXXtkwFHdAHa5j7w7kfxSP5lAIwu7w==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", + "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", "dev": true, "requires": { "@types/babel__traverse": "^7.0.6" } }, "babel-preset-jest": { - "version": "24.6.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.6.0.tgz", - "integrity": "sha512-pdZqLEdmy1ZK5kyRUfvBb2IfTPb2BUvIJczlPspS8fWmBQslNNDBqVfh7BW5leOVJMDZKzjD8XEyABTk6gQ5yw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", + "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", "dev": true, "requires": { "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^24.6.0" + "babel-plugin-jest-hoist": "^24.9.0" } }, "balanced-match": { @@ -862,9 +908,9 @@ } }, "bser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", - "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.0.tgz", + "integrity": "sha512-8zsjWrQkkBoLK6uxASk1nJ2SKv97ltiGDo6A3wA0/yRPz+CwmEyDo0hUrhIuukG2JHpAl3bvFIixw2/3Hi0DOg==", "dev": true, "requires": { "node-int64": "^0.4.0" @@ -1014,29 +1060,25 @@ "dev": true }, "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "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": { - "ansi-regex": "^3.0.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" } } } @@ -1057,12 +1099,6 @@ "type-is": "^1.6.16" } }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -1227,15 +1263,15 @@ "dev": true }, "cssom": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.6.tgz", - "integrity": "sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", "dev": true }, "cssstyle": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.2.2.tgz", - "integrity": "sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", + "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", "dev": true, "requires": { "cssom": "0.3.x" @@ -1388,9 +1424,9 @@ "dev": true }, "diff-sequences": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.3.0.tgz", - "integrity": "sha512-xLqpez+Zj9GKSnPWS0WZw1igGocZ+uua8+y+5dDNTT934N3QuY1sp2LkHzwiaYQGz60hMq0pjAshdeXm5VUOEw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", + "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", "dev": true }, "domexception": { @@ -1431,6 +1467,12 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, + "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 + }, "end-of-stream": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", @@ -1491,9 +1533,9 @@ "dev": true }, "escodegen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", - "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz", + "integrity": "sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==", "dev": true, "requires": { "esprima": "^3.1.3", @@ -1510,15 +1552,15 @@ "dev": true }, "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, "exec-sh": { @@ -1584,17 +1626,17 @@ } }, "expect": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-24.8.0.tgz", - "integrity": "sha512-/zYvP8iMDrzaaxHVa724eJBCKqSHmO0FA7EDkBiRHxg6OipmMn1fN+C8T9L9K8yr7UONkOifu6+LLH+z76CnaA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", + "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", "dev": true, "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "ansi-styles": "^3.2.0", - "jest-get-type": "^24.8.0", - "jest-matcher-utils": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-regex-util": "^24.3.0" + "jest-get-type": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-regex-util": "^24.9.0" } }, "extend": { @@ -2352,9 +2394,9 @@ "dev": true }, "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, "get-stream": { @@ -2548,15 +2590,10 @@ } } }, - "hoek": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-5.0.4.tgz", - "integrity": "sha512-Alr4ZQgoMlnere5FZJsIyfIjORBqZll5POhDsF4q64dPuJR6rNxXdDxtHSQq8OXRurhmx+PWYEE8bXRROY8h0w==" - }, "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.4.tgz", + "integrity": "sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==", "dev": true }, "html-encoding-sniffer": { @@ -2670,12 +2707,6 @@ "loose-envify": "^1.0.0" } }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", @@ -2934,14 +2965,6 @@ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, - "isemail": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/isemail/-/isemail-3.2.0.tgz", - "integrity": "sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg==", - "requires": { - "punycode": "2.x.x" - } - }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -2981,9 +3004,9 @@ }, "dependencies": { "semver": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz", - "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } @@ -3050,215 +3073,216 @@ } }, "jest": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-24.8.0.tgz", - "integrity": "sha512-o0HM90RKFRNWmAWvlyV8i5jGZ97pFwkeVoGvPW1EtLTgJc2+jcuqcbbqcSZLE/3f2S5pt0y2ZBETuhpWNl1Reg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", + "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", "dev": true, "requires": { "import-local": "^2.0.0", - "jest-cli": "^24.8.0" + "jest-cli": "^24.9.0" }, "dependencies": { "jest-cli": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.8.0.tgz", - "integrity": "sha512-+p6J00jSMPQ116ZLlHJJvdf8wbjNbZdeSX9ptfHX06/MSNaXmKihQzx5vQcw0q2G6JsdVkUIdWbOWtSnaYs3yA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", + "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", "dev": true, "requires": { - "@jest/core": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/core": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", "exit": "^0.1.2", "import-local": "^2.0.0", "is-ci": "^2.0.0", - "jest-config": "^24.8.0", - "jest-util": "^24.8.0", - "jest-validate": "^24.8.0", + "jest-config": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", "prompts": "^2.0.1", "realpath-native": "^1.1.0", - "yargs": "^12.0.2" + "yargs": "^13.3.0" } } } }, "jest-changed-files": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.8.0.tgz", - "integrity": "sha512-qgANC1Yrivsq+UrLXsvJefBKVoCsKB0Hv+mBb6NMjjZ90wwxCDmU3hsCXBya30cH+LnPYjwgcU65i6yJ5Nfuug==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", + "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", "dev": true, "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "execa": "^1.0.0", "throat": "^4.0.0" } }, "jest-config": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.8.0.tgz", - "integrity": "sha512-Czl3Nn2uEzVGsOeaewGWoDPD8GStxCpAe0zOYs2x2l0fZAgPbCr3uwUkgNKV3LwE13VXythM946cd5rdGkkBZw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", + "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^24.8.0", - "@jest/types": "^24.8.0", - "babel-jest": "^24.8.0", + "@jest/test-sequencer": "^24.9.0", + "@jest/types": "^24.9.0", + "babel-jest": "^24.9.0", "chalk": "^2.0.1", "glob": "^7.1.1", - "jest-environment-jsdom": "^24.8.0", - "jest-environment-node": "^24.8.0", - "jest-get-type": "^24.8.0", - "jest-jasmine2": "^24.8.0", + "jest-environment-jsdom": "^24.9.0", + "jest-environment-node": "^24.9.0", + "jest-get-type": "^24.9.0", + "jest-jasmine2": "^24.9.0", "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.8.0", - "jest-util": "^24.8.0", - "jest-validate": "^24.8.0", + "jest-resolve": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", "micromatch": "^3.1.10", - "pretty-format": "^24.8.0", + "pretty-format": "^24.9.0", "realpath-native": "^1.1.0" } }, "jest-diff": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.8.0.tgz", - "integrity": "sha512-wxetCEl49zUpJ/bvUmIFjd/o52J+yWcoc5ZyPq4/W1LUKGEhRYDIbP1KcF6t+PvqNrGAFk4/JhtxDq/Nnzs66g==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", + "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", "dev": true, "requires": { "chalk": "^2.0.1", - "diff-sequences": "^24.3.0", - "jest-get-type": "^24.8.0", - "pretty-format": "^24.8.0" + "diff-sequences": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" } }, "jest-docblock": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.3.0.tgz", - "integrity": "sha512-nlANmF9Yq1dufhFlKG9rasfQlrY7wINJbo3q01tu56Jv5eBU5jirylhF2O5ZBnLxzOVBGRDz/9NAwNyBtG4Nyg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz", + "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==", "dev": true, "requires": { "detect-newline": "^2.1.0" } }, "jest-each": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.8.0.tgz", - "integrity": "sha512-NrwK9gaL5+XgrgoCsd9svsoWdVkK4gnvyhcpzd6m487tXHqIdYeykgq3MKI1u4I+5Zf0tofr70at9dWJDeb+BA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", + "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", "dev": true, "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", - "jest-get-type": "^24.8.0", - "jest-util": "^24.8.0", - "pretty-format": "^24.8.0" + "jest-get-type": "^24.9.0", + "jest-util": "^24.9.0", + "pretty-format": "^24.9.0" } }, "jest-environment-jsdom": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.8.0.tgz", - "integrity": "sha512-qbvgLmR7PpwjoFjM/sbuqHJt/NCkviuq9vus9NBn/76hhSidO+Z6Bn9tU8friecegbJL8gzZQEMZBQlFWDCwAQ==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", + "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", "dev": true, "requires": { - "@jest/environment": "^24.8.0", - "@jest/fake-timers": "^24.8.0", - "@jest/types": "^24.8.0", - "jest-mock": "^24.8.0", - "jest-util": "^24.8.0", + "@jest/environment": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-util": "^24.9.0", "jsdom": "^11.5.1" } }, "jest-environment-node": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.8.0.tgz", - "integrity": "sha512-vIGUEScd1cdDgR6sqn2M08sJTRLQp6Dk/eIkCeO4PFHxZMOgy+uYLPMC4ix3PEfM5Au/x3uQ/5Tl0DpXXZsJ/Q==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", + "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", "dev": true, "requires": { - "@jest/environment": "^24.8.0", - "@jest/fake-timers": "^24.8.0", - "@jest/types": "^24.8.0", - "jest-mock": "^24.8.0", - "jest-util": "^24.8.0" + "@jest/environment": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-util": "^24.9.0" } }, "jest-get-type": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.8.0.tgz", - "integrity": "sha512-RR4fo8jEmMD9zSz2nLbs2j0zvPpk/KCEz3a62jJWbd2ayNo0cb+KFRxPHVhE4ZmgGJEQp0fosmNz84IfqM8cMQ==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", "dev": true }, "jest-haste-map": { - "version": "24.8.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.8.1.tgz", - "integrity": "sha512-SwaxMGVdAZk3ernAx2Uv2sorA7jm3Kx+lR0grp6rMmnY06Kn/urtKx1LPN2mGTea4fCT38impYT28FfcLUhX0g==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", + "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", "dev": true, "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "anymatch": "^2.0.0", "fb-watchman": "^2.0.0", "fsevents": "^1.2.7", "graceful-fs": "^4.1.15", "invariant": "^2.2.4", - "jest-serializer": "^24.4.0", - "jest-util": "^24.8.0", - "jest-worker": "^24.6.0", + "jest-serializer": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.9.0", "micromatch": "^3.1.10", "sane": "^4.0.3", "walker": "^1.0.7" } }, "jest-jasmine2": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.8.0.tgz", - "integrity": "sha512-cEky88npEE5LKd5jPpTdDCLvKkdyklnaRycBXL6GNmpxe41F0WN44+i7lpQKa/hcbXaQ+rc9RMaM4dsebrYong==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", + "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", "co": "^4.6.0", - "expect": "^24.8.0", + "expect": "^24.9.0", "is-generator-fn": "^2.0.0", - "jest-each": "^24.8.0", - "jest-matcher-utils": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-runtime": "^24.8.0", - "jest-snapshot": "^24.8.0", - "jest-util": "^24.8.0", - "pretty-format": "^24.8.0", + "jest-each": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "pretty-format": "^24.9.0", "throat": "^4.0.0" } }, "jest-leak-detector": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.8.0.tgz", - "integrity": "sha512-cG0yRSK8A831LN8lIHxI3AblB40uhv0z+SsQdW3GoMMVcK+sJwrIIyax5tu3eHHNJ8Fu6IMDpnLda2jhn2pD/g==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", + "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", "dev": true, "requires": { - "pretty-format": "^24.8.0" + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" } }, "jest-matcher-utils": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.8.0.tgz", - "integrity": "sha512-lex1yASY51FvUuHgm0GOVj7DCYEouWSlIYmCW7APSqB9v8mXmKSn5+sWVF0MhuASG0bnYY106/49JU1FZNl5hw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", + "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", "dev": true, "requires": { "chalk": "^2.0.1", - "jest-diff": "^24.8.0", - "jest-get-type": "^24.8.0", - "pretty-format": "^24.8.0" + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" } }, "jest-message-util": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.8.0.tgz", - "integrity": "sha512-p2k71rf/b6ns8btdB0uVdljWo9h0ovpnEe05ZKWceQGfXYr4KkzgKo3PBi8wdnd9OtNh46VpNIJynUn/3MKm1g==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "@types/stack-utils": "^1.0.1", "chalk": "^2.0.1", "micromatch": "^3.1.10", @@ -3267,12 +3291,12 @@ } }, "jest-mock": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.8.0.tgz", - "integrity": "sha512-6kWugwjGjJw+ZkK4mDa0Df3sDlUTsV47MSrT0nGQ0RBWJbpODDQ8MHDVtGtUYBne3IwZUhtB7elxHspU79WH3A==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", + "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", "dev": true, "requires": { - "@jest/types": "^24.8.0" + "@jest/types": "^24.9.0" } }, "jest-pnp-resolver": { @@ -3282,18 +3306,18 @@ "dev": true }, "jest-regex-util": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.3.0.tgz", - "integrity": "sha512-tXQR1NEOyGlfylyEjg1ImtScwMq8Oh3iJbGTjN7p0J23EuVX1MA8rwU69K4sLbCmwzgCUbVkm0FkSF9TdzOhtg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", + "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", "dev": true }, "jest-resolve": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.8.0.tgz", - "integrity": "sha512-+hjSzi1PoRvnuOICoYd5V/KpIQmkAsfjFO71458hQ2Whi/yf1GDeBOFj8Gxw4LrApHsVJvn5fmjcPdmoUHaVKw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", + "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", "dev": true, "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "browser-resolve": "^1.11.3", "chalk": "^2.0.1", "jest-pnp-resolver": "^1.2.1", @@ -3301,111 +3325,120 @@ } }, "jest-resolve-dependencies": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.8.0.tgz", - "integrity": "sha512-hyK1qfIf/krV+fSNyhyJeq3elVMhK9Eijlwy+j5jqmZ9QsxwKBiP6qukQxaHtK8k6zql/KYWwCTQ+fDGTIJauw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz", + "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", "dev": true, "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "jest-regex-util": "^24.3.0", - "jest-snapshot": "^24.8.0" + "jest-snapshot": "^24.9.0" } }, "jest-runner": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.8.0.tgz", - "integrity": "sha512-utFqC5BaA3JmznbissSs95X1ZF+d+4WuOWwpM9+Ak356YtMhHE/GXUondZdcyAAOTBEsRGAgH/0TwLzfI9h7ow==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", + "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", "dev": true, "requires": { "@jest/console": "^24.7.1", - "@jest/environment": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "chalk": "^2.4.2", "exit": "^0.1.2", "graceful-fs": "^4.1.15", - "jest-config": "^24.8.0", + "jest-config": "^24.9.0", "jest-docblock": "^24.3.0", - "jest-haste-map": "^24.8.0", - "jest-jasmine2": "^24.8.0", - "jest-leak-detector": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-resolve": "^24.8.0", - "jest-runtime": "^24.8.0", - "jest-util": "^24.8.0", + "jest-haste-map": "^24.9.0", + "jest-jasmine2": "^24.9.0", + "jest-leak-detector": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-resolve": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-util": "^24.9.0", "jest-worker": "^24.6.0", "source-map-support": "^0.5.6", "throat": "^4.0.0" } }, "jest-runtime": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.8.0.tgz", - "integrity": "sha512-Mq0aIXhvO/3bX44ccT+czU1/57IgOMyy80oM0XR/nyD5zgBcesF84BPabZi39pJVA6UXw+fY2Q1N+4BiVUBWOA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", + "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", "dev": true, "requires": { "@jest/console": "^24.7.1", - "@jest/environment": "^24.8.0", + "@jest/environment": "^24.9.0", "@jest/source-map": "^24.3.0", - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", - "@types/yargs": "^12.0.2", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/yargs": "^13.0.0", "chalk": "^2.0.1", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.1.15", - "jest-config": "^24.8.0", - "jest-haste-map": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-mock": "^24.8.0", + "jest-config": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0", "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.8.0", - "jest-snapshot": "^24.8.0", - "jest-util": "^24.8.0", - "jest-validate": "^24.8.0", + "jest-resolve": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", "realpath-native": "^1.1.0", "slash": "^2.0.0", "strip-bom": "^3.0.0", - "yargs": "^12.0.2" + "yargs": "^13.3.0" } }, "jest-serializer": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.4.0.tgz", - "integrity": "sha512-k//0DtglVstc1fv+GY/VHDIjrtNjdYvYjMlbLUed4kxrE92sIUewOi5Hj3vrpB8CXfkJntRPDRjCrCvUhBdL8Q==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", + "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", "dev": true }, "jest-snapshot": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.8.0.tgz", - "integrity": "sha512-5ehtWoc8oU9/cAPe6fez6QofVJLBKyqkY2+TlKTOf0VllBB/mqUNdARdcjlZrs9F1Cv+/HKoCS/BknT0+tmfPg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", + "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", "dev": true, "requires": { "@babel/types": "^7.0.0", - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", - "expect": "^24.8.0", - "jest-diff": "^24.8.0", - "jest-matcher-utils": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-resolve": "^24.8.0", + "expect": "^24.9.0", + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-resolve": "^24.9.0", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "pretty-format": "^24.8.0", - "semver": "^5.5.0" + "pretty-format": "^24.9.0", + "semver": "^6.2.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 + } } }, "jest-util": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.8.0.tgz", - "integrity": "sha512-DYZeE+XyAnbNt0BG1OQqKy/4GVLPtzwGx5tsnDrFcax36rVE3lTA5fbvgmbVPUZf9w77AJ8otqR4VBbfFJkUZA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", + "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", "dev": true, "requires": { - "@jest/console": "^24.7.1", - "@jest/fake-timers": "^24.8.0", - "@jest/source-map": "^24.3.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/console": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/source-map": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "callsites": "^3.0.0", "chalk": "^2.0.1", "graceful-fs": "^4.1.15", @@ -3416,41 +3449,41 @@ } }, "jest-validate": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.8.0.tgz", - "integrity": "sha512-+/N7VOEMW1Vzsrk3UWBDYTExTPwf68tavEPKDnJzrC6UlHtUDU/fuEdXqFoHzv9XnQ+zW6X3qMZhJ3YexfeLDA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", + "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", "dev": true, "requires": { - "@jest/types": "^24.8.0", - "camelcase": "^5.0.0", + "@jest/types": "^24.9.0", + "camelcase": "^5.3.1", "chalk": "^2.0.1", - "jest-get-type": "^24.8.0", - "leven": "^2.1.0", - "pretty-format": "^24.8.0" + "jest-get-type": "^24.9.0", + "leven": "^3.1.0", + "pretty-format": "^24.9.0" } }, "jest-watcher": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.8.0.tgz", - "integrity": "sha512-SBjwHt5NedQoVu54M5GEx7cl7IGEFFznvd/HNT8ier7cCAx/Qgu9ZMlaTQkvK22G1YOpcWBLQPFSImmxdn3DAw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz", + "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", "dev": true, "requires": { - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", - "@types/yargs": "^12.0.9", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/yargs": "^13.0.0", "ansi-escapes": "^3.0.0", "chalk": "^2.0.1", - "jest-util": "^24.8.0", + "jest-util": "^24.9.0", "string-length": "^2.0.0" } }, "jest-worker": { - "version": "24.6.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.6.0.tgz", - "integrity": "sha512-jDwgW5W9qGNvpI1tNnvajh0a5IE/PuGLFmHk6aR/BZFz8tSgGw17GsDPXAJ6p91IvYDjOw8GpFbvvZGAK+DPQQ==", + "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": "^1.0.1", + "merge-stream": "^2.0.0", "supports-color": "^6.1.0" }, "dependencies": { @@ -3465,16 +3498,6 @@ } } }, - "joi": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-13.7.0.tgz", - "integrity": "sha512-xuY5VkHfeOYK3Hdi91ulocfuFopwgbSORmIwzcwHKESQhC7w1kD5jaVSPnqDxS2I8t3RZ9omCKAxNwXN5zG1/Q==", - "requires": { - "hoek": "5.x.x", - "isemail": "3.x.x", - "topo": "3.x.x" - } - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -3585,9 +3608,9 @@ "dev": true }, "koa": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.7.0.tgz", - "integrity": "sha512-7ojD05s2Q+hFudF8tDLZ1CpCdVZw8JQELWSkcfG9bdtoTDzMmkRF6BQBU7JzIzCCOY3xd3tftiy/loHBUYaY2Q==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.8.1.tgz", + "integrity": "sha512-iCgjRkntcVud5amnioi+79r7TPVhKPfCY8UzL9GjyU+nIWTE9xsqyrJ6kib3InT9JYRyUu9Y67i5apCjf997TQ==", "requires": { "accepts": "^1.3.5", "cache-content-type": "^1.0.0", @@ -3708,15 +3731,6 @@ "package-json": "^4.0.0" } }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, "left-pad": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", @@ -3724,9 +3738,9 @@ "dev": true }, "leven": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", - "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "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": { @@ -3762,9 +3776,9 @@ } }, "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, "lodash.sortby": { @@ -3825,15 +3839,6 @@ "tmpl": "1.0.x" } }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -3854,25 +3859,11 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - } - }, "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } + "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 }, "methods": { "version": "1.1.2", @@ -3919,12 +3910,6 @@ "mime-db": "1.40.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 - }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -4044,9 +4029,9 @@ "dev": true }, "node-notifier": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.0.tgz", - "integrity": "sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ==", + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", + "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", "dev": true, "requires": { "growly": "^1.3.0", @@ -4130,12 +4115,6 @@ "path-key": "^2.0.0" } }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, "nwsapi": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz", @@ -4274,23 +4253,6 @@ } } }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, "p-each-series": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", @@ -4306,16 +4268,10 @@ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true - }, "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "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" @@ -4495,12 +4451,12 @@ "dev": true }, "pretty-format": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.8.0.tgz", - "integrity": "sha512-P952T7dkrDEplsR+TuY7q3VXDae5Sr7zmQb12JU/NDQa/3CH7/QW0yvqLcGN6jL+zQFKaoJcPc+yJxMTGmosqw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", "dev": true, "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "ansi-regex": "^4.0.0", "ansi-styles": "^3.2.0", "react-is": "^16.8.4" @@ -4513,13 +4469,13 @@ "dev": true }, "prompts": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.1.0.tgz", - "integrity": "sha512-+x5TozgqYdOwWsQFZizE/Tra3fKvAoy037kOyU6cgz84n8f6zxngLOV4O32kTwt9FcLCxAqw0P/c8rOr9y+Gfg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.2.1.tgz", + "integrity": "sha512-VObPvJiWPhpZI6C5m60XOzTfnYg/xc/an+r9VYymj9WJW3B/DIH+REzjpAACPf8brwPeP+7vz3bIim3S+AaMjw==", "dev": true, "requires": { - "kleur": "^3.0.2", - "sisteransi": "^1.0.0" + "kleur": "^3.0.3", + "sisteransi": "^1.0.3" } }, "pseudomap": { @@ -4529,9 +4485,9 @@ "dev": true }, "psl": { - "version": "1.1.32", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.32.tgz", - "integrity": "sha512-MHACAkHpihU/REGGPLj4sEfc/XKW2bheigvHO1dUqjaKigMp1C8+WLQYRGgeKFMsw5PMfegZcaN8IDXK/cD0+g==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.3.0.tgz", + "integrity": "sha512-avHdspHO+9rQTLbv1RO+MPYeP/SzsCoxofjVnHanETfQhTJrmB0HlDoW+EiN/R+C0BZ+gERab9NY0lPN2TxNag==" }, "pstree.remy": { "version": "1.1.7", @@ -4602,9 +4558,9 @@ } }, "react-is": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", - "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==", + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.9.0.tgz", + "integrity": "sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw==", "dev": true }, "read-pkg": { @@ -4786,9 +4742,9 @@ "dev": true }, "resolve": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz", - "integrity": "sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -4822,9 +4778,9 @@ "dev": true }, "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "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" @@ -4960,9 +4916,9 @@ "dev": true }, "sisteransi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.0.tgz", - "integrity": "sha512-N+z4pHB4AmUv0SjveWRd6q1Nj5w62m5jodv+GD8lvmbY/83T/rpbJGZOnK5T149OldDj4Db07BSv9xY4K6NTPQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.3.tgz", + "integrity": "sha512-SbEG75TzH8G7eVXFSN5f9EExILKfly7SUvVY5DhhYLvfhKqhDFY0OzevWa/zwak0RLRfWS5AvfMWpd9gJvr5Yg==", "dev": true }, "slash": { @@ -5104,9 +5060,9 @@ } }, "source-map-support": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", - "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -5146,9 +5102,9 @@ } }, "spdx-license-ids": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", - "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", "dev": true }, "split-string": { @@ -5490,21 +5446,6 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" }, - "topo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/topo/-/topo-3.0.3.tgz", - "integrity": "sha512-IgpPtvD4kjrJ7CRA3ov2FhWQADwv+Tdqbsf1ZnPUSAtCJ9e1Z44MmoSGDXGk4IppoZA7jd/QRkNddlLJWlUZsQ==", - "requires": { - "hoek": "6.x.x" - }, - "dependencies": { - "hoek": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-6.1.3.tgz", - "integrity": "sha512-YXXAAhmF9zpQbC7LEcREFtXfGq5K1fmd+4PHkBq8NUqmzW3G+Dq10bI/i0KucLRwss3YYFQ0fSfoxBZYiGUqtQ==" - } - } - }, "touch": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", @@ -5777,9 +5718,9 @@ } }, "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" }, "validate-npm-package-license": { "version": "3.0.4", @@ -5816,12 +5757,12 @@ } }, "wait-on": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-3.2.0.tgz", - "integrity": "sha512-QUGNKlKLDyY6W/qHdxaRlXUAgLPe+3mLL/tRByHpRNcHs/c7dZXbu+OnJWGNux6tU1WFh/Z8aEwvbuzSAu79Zg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-3.3.0.tgz", + "integrity": "sha512-97dEuUapx4+Y12aknWZn7D25kkjMk16PbWoYzpSdA8bYpVfS6hpl2a2pOWZ3c+Tyt3/i4/pglyZctG3J4V1hWQ==", "requires": { - "core-js": "^2.5.7", - "joi": "^13.0.0", + "@hapi/joi": "^15.0.3", + "core-js": "^2.6.5", "minimist": "^1.2.0", "request": "^2.88.0", "rx": "^4.1.0" @@ -5899,48 +5840,25 @@ "dev": true }, "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "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": { - "ansi-regex": "^2.0.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" } } } @@ -5996,37 +5914,40 @@ "dev": true }, "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", "dev": true, "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", + "cliui": "^5.0.0", "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", + "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", + "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^2.0.0", + "string-width": "^3.0.0", "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" }, "dependencies": { - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true + "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" + } } } }, "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", "dev": true, "requires": { "camelcase": "^5.0.0", diff --git a/scheduler/integration-test/package.json b/scheduler/integration-test/package.json index 2fbae7ca9..623cc0ff0 100644 --- a/scheduler/integration-test/package.json +++ b/scheduler/integration-test/package.json @@ -13,7 +13,7 @@ "watch:mock": "nodemon src/mock.server.js" }, "devDependencies": { - "jest": "^24.8.0", + "jest": "^24.9.0", "nodemon": "^1.19.1", "supertest": "^4.0.2" }, @@ -21,9 +21,9 @@ "testEnvironment": "node" }, "dependencies": { - "koa": "^2.7.0", + "koa": "^2.8.1", "koa-bodyparser": "^4.2.1", "koa-router": "^7.4.0", - "wait-on": "^3.2.0" + "wait-on": "^3.3.0" } } diff --git a/scheduler/package-lock.json b/scheduler/package-lock.json index 8ca5f7b43..550c0e0d0 100644 --- a/scheduler/package-lock.json +++ b/scheduler/package-lock.json @@ -5,31 +5,31 @@ "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", "dev": true, "requires": { "@babel/highlight": "^7.0.0" } }, "@babel/core": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.0.tgz", - "integrity": "sha512-Dzl7U0/T69DFOTwqz/FJdnOSWS57NpjNfCwMKHABr589Lg8uX1RrlBIJ7L5Dubt/xkLsx0xH5EBFzlBVes1ayA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.0", - "@babel/helpers": "^7.4.0", - "@babel/parser": "^7.4.0", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.0", - "@babel/types": "^7.4.0", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.5.5.tgz", + "integrity": "sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helpers": "^7.5.5", + "@babel/parser": "^7.5.5", + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5", "convert-source-map": "^1.1.0", "debug": "^4.1.0", "json5": "^2.1.0", - "lodash": "^4.17.11", + "lodash": "^4.17.13", "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" @@ -45,9 +45,9 @@ } }, "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==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "source-map": { @@ -59,14 +59,14 @@ } }, "@babel/generator": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.0.tgz", - "integrity": "sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", "dev": true, "requires": { - "@babel/types": "^7.4.0", + "@babel/types": "^7.5.5", "jsesc": "^2.5.1", - "lodash": "^4.17.11", + "lodash": "^4.17.13", "source-map": "^0.5.0", "trim-right": "^1.0.1" }, @@ -106,29 +106,29 @@ "dev": true }, "@babel/helper-split-export-declaration": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz", - "integrity": "sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", "dev": true, "requires": { - "@babel/types": "^7.4.0" + "@babel/types": "^7.4.4" } }, "@babel/helpers": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.4.2.tgz", - "integrity": "sha512-gQR1eQeroDzFBikhrCccm5Gs2xBjZ57DNjGbqTaHo911IpmSxflOQWMAHPw/TXk8L3isv7s9lYzUkexOeTQUYg==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.5.5.tgz", + "integrity": "sha512-nRq2BUhxZFnfEn/ciJuhklHvFOqjJUD5wpx+1bxUF2axL9C+v4DE/dmp5sT2dKnpOs4orZWzpAZqlCy8QqE/7g==", "dev": true, "requires": { - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.0", - "@babel/types": "^7.4.0" + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5" } }, "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", "dev": true, "requires": { "chalk": "^2.0.0", @@ -137,9 +137,9 @@ } }, "@babel/parser": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.2.tgz", - "integrity": "sha512-9fJTDipQFvlfSVdD/JBtkiY0br9BtfvW2R8wo6CX/Ej2eMuV0gWPk1M67Mt3eggQvBqYW1FCEk8BN7WvGm/g5g==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", + "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==", "dev": true }, "@babel/plugin-syntax-object-rest-spread": { @@ -152,31 +152,31 @@ } }, "@babel/template": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.0.tgz", - "integrity": "sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.0", - "@babel/types": "^7.4.0" + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" } }, "@babel/traverse": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.0.tgz", - "integrity": "sha512-/DtIHKfyg2bBKnIN+BItaIlEg5pjAnzHOIQe5w+rHAw/rg9g0V7T4rqPX8BJPfW11kt3koyjAnTNwCzb28Y1PA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.0", + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.0", - "@babel/parser": "^7.4.0", - "@babel/types": "^7.4.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.5.5", + "@babel/types": "^7.5.5", "debug": "^4.1.0", "globals": "^11.1.0", - "lodash": "^4.17.11" + "lodash": "^4.17.13" }, "dependencies": { "debug": { @@ -189,21 +189,21 @@ } }, "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==", + "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.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", - "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", "dev": true, "requires": { "esutils": "^2.0.2", - "lodash": "^4.17.11", + "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } }, @@ -218,109 +218,125 @@ } }, "@jest/console": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.3.0.tgz", - "integrity": "sha512-NaCty/OOei6rSDcbPdMiCbYCI0KGFGPgGO6B09lwWt5QTxnkuhKYET9El5u5z1GAcSxkQmSMtM63e24YabCWqA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", "dev": true, "requires": { - "@jest/source-map": "^24.3.0", - "@types/node": "*", + "@jest/source-map": "^24.9.0", "chalk": "^2.0.1", "slash": "^2.0.0" } }, "@jest/core": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.5.0.tgz", - "integrity": "sha512-RDZArRzAs51YS7dXG1pbXbWGxK53rvUu8mCDYsgqqqQ6uSOaTjcVyBl2Jce0exT2rSLk38ca7az7t2f3b0/oYQ==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", + "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", "dev": true, "requires": { - "@jest/console": "^24.3.0", - "@jest/reporters": "^24.5.0", - "@jest/test-result": "^24.5.0", - "@jest/transform": "^24.5.0", - "@jest/types": "^24.5.0", + "@jest/console": "^24.7.1", + "@jest/reporters": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", "ansi-escapes": "^3.0.0", "chalk": "^2.0.1", "exit": "^0.1.2", "graceful-fs": "^4.1.15", - "jest-changed-files": "^24.5.0", - "jest-config": "^24.5.0", - "jest-haste-map": "^24.5.0", - "jest-message-util": "^24.5.0", + "jest-changed-files": "^24.9.0", + "jest-config": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-message-util": "^24.9.0", "jest-regex-util": "^24.3.0", - "jest-resolve-dependencies": "^24.5.0", - "jest-runner": "^24.5.0", - "jest-runtime": "^24.5.0", - "jest-snapshot": "^24.5.0", - "jest-util": "^24.5.0", - "jest-validate": "^24.5.0", - "jest-watcher": "^24.5.0", + "jest-resolve": "^24.9.0", + "jest-resolve-dependencies": "^24.9.0", + "jest-runner": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "jest-watcher": "^24.9.0", "micromatch": "^3.1.10", "p-each-series": "^1.0.0", - "pirates": "^4.0.1", "realpath-native": "^1.1.0", "rimraf": "^2.5.4", + "slash": "^2.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" + } + } } }, "@jest/environment": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.5.0.tgz", - "integrity": "sha512-tzUHR9SHjMXwM8QmfHb/EJNbF0fjbH4ieefJBvtwO8YErLTrecc1ROj0uo2VnIT6SlpEGZnvdCK6VgKYBo8LsA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", + "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", "dev": true, "requires": { - "@jest/fake-timers": "^24.5.0", - "@jest/transform": "^24.5.0", - "@jest/types": "^24.5.0", - "@types/node": "*", - "jest-mock": "^24.5.0" + "@jest/fake-timers": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0" } }, "@jest/fake-timers": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.5.0.tgz", - "integrity": "sha512-i59KVt3QBz9d+4Qr4QxsKgsIg+NjfuCjSOWj3RQhjF5JNy+eVJDhANQ4WzulzNCHd72srMAykwtRn5NYDGVraw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", + "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", "dev": true, "requires": { - "@jest/types": "^24.5.0", - "@types/node": "*", - "jest-message-util": "^24.5.0", - "jest-mock": "^24.5.0" + "@jest/types": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0" } }, "@jest/reporters": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.5.0.tgz", - "integrity": "sha512-vfpceiaKtGgnuC3ss5czWOihKOUSyjJA4M4udm6nH8xgqsuQYcyDCi4nMMcBKsHXWgz9/V5G7iisnZGfOh1w6Q==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", + "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", "dev": true, "requires": { - "@jest/environment": "^24.5.0", - "@jest/test-result": "^24.5.0", - "@jest/transform": "^24.5.0", - "@jest/types": "^24.5.0", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", "exit": "^0.1.2", "glob": "^7.1.2", - "istanbul-api": "^2.1.1", "istanbul-lib-coverage": "^2.0.2", "istanbul-lib-instrument": "^3.0.1", + "istanbul-lib-report": "^2.0.4", "istanbul-lib-source-maps": "^3.0.1", - "jest-haste-map": "^24.5.0", - "jest-resolve": "^24.5.0", - "jest-runtime": "^24.5.0", - "jest-util": "^24.5.0", - "jest-worker": "^24.4.0", - "node-notifier": "^5.2.1", + "istanbul-reports": "^2.2.6", + "jest-haste-map": "^24.9.0", + "jest-resolve": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.6.0", + "node-notifier": "^5.4.2", "slash": "^2.0.0", "source-map": "^0.6.0", "string-length": "^2.0.0" } }, "@jest/source-map": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.3.0.tgz", - "integrity": "sha512-zALZt1t2ou8le/crCeeiRYzvdnTzaIlpOWaet45lNSqNJUnXbppUUFR4ZUAlzgDmKee4Q5P/tKXypI1RiHwgag==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", "dev": true, "requires": { "callsites": "^3.0.0", @@ -329,33 +345,46 @@ } }, "@jest/test-result": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.5.0.tgz", - "integrity": "sha512-u66j2vBfa8Bli1+o3rCaVnVYa9O8CAFZeqiqLVhnarXtreSXG33YQ6vNYBogT7+nYiFNOohTU21BKiHlgmxD5A==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", + "dev": true, + "requires": { + "@jest/console": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/istanbul-lib-coverage": "^2.0.0" + } + }, + "@jest/test-sequencer": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", + "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", "dev": true, "requires": { - "@jest/console": "^24.3.0", - "@jest/types": "^24.5.0", - "@types/istanbul-lib-coverage": "^1.1.0" + "@jest/test-result": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-runner": "^24.9.0", + "jest-runtime": "^24.9.0" } }, "@jest/transform": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.5.0.tgz", - "integrity": "sha512-XSsDz1gdR/QMmB8UCKlweAReQsZrD/DK7FuDlNo/pE8EcKMrfi2kqLRk8h8Gy/PDzgqJj64jNEzOce9pR8oj1w==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", + "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^24.5.0", + "@jest/types": "^24.9.0", "babel-plugin-istanbul": "^5.1.0", "chalk": "^2.0.1", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.5.0", - "jest-regex-util": "^24.3.0", - "jest-util": "^24.5.0", + "jest-haste-map": "^24.9.0", + "jest-regex-util": "^24.9.0", + "jest-util": "^24.9.0", "micromatch": "^3.1.10", + "pirates": "^4.0.1", "realpath-native": "^1.1.0", "slash": "^2.0.0", "source-map": "^0.6.1", @@ -363,19 +392,20 @@ } }, "@jest/types": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.5.0.tgz", - "integrity": "sha512-kN7RFzNMf2R8UDadPOl6ReyI+MT8xfqRuAnuVL+i4gwjv/zubdDK+EDeLHYwq1j0CSSR2W/MmgaRlMZJzXdmVA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", "dev": true, "requires": { - "@types/istanbul-lib-coverage": "^1.1.0", - "@types/yargs": "^12.0.9" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" } }, "@types/babel__core": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.0.tgz", - "integrity": "sha512-wJTeJRt7BToFx3USrCDs2BhEi4ijBInTQjOIukj6a/5tEkwpFMVZ+1ppgmE+Q/FQyc5P/VWUbx7I9NELrKruHA==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.2.tgz", + "integrity": "sha512-cfCCrFmiGY/yq0NuKNxIQvZFy9kY/1immpSpTngOnyIbD4+eJOG5mxphhHDv3CHL9GltO4GcKr54kGBg3RNdbg==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -405,18 +435,18 @@ } }, "@types/babel__traverse": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.6.tgz", - "integrity": "sha512-XYVgHF2sQ0YblLRMLNPB3CkFMewzFmlDsH/TneZFHUXDlABQgh88uOxuez7ZcXxayLFrqLwtDH1t+FmlFwNZxw==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.7.tgz", + "integrity": "sha512-CeBpmX1J8kWLcDEnI3Cl2Eo6RfbGvzUctA+CjZUhOKDFbLfcr7fc4usEqLNWetrlJd7RhAkyYe2czXop4fICpw==", "dev": true, "requires": { "@babel/types": "^7.3.0" } }, "@types/body-parser": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.0.tgz", - "integrity": "sha512-a2+YeUjPkztKJu5aIF2yArYFQQp8d51wZ7DavSHjFuY1mqVgidGyzEQ41JIVNy82fXj8yPgy2vJmfIywgESW6w==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.1.tgz", + "integrity": "sha512-RoX2EZjMiFMjZh9lmYrwgoP9RTpAjSHiJxdp4oidAQVO02T7HER3xj9UKue5534ULWeqVEkujhWcyvUce+d68w==", "dev": true, "requires": { "@types/connect": "*", @@ -445,9 +475,9 @@ "dev": true }, "@types/express": { - "version": "4.16.1", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.16.1.tgz", - "integrity": "sha512-V0clmJow23WeyblmACoxbHBu2JKlE5TiIme6Lem14FnPW9gsttyHtk6wq7njcdIWH1njAaFgR8gW09lgY98gQg==", + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.1.tgz", + "integrity": "sha512-VfH/XCP0QbQk5B5puLqTLEeFgR8lfCJHZJKkInZ9mkYd+u8byX0kztXEQxEk4wZXJs8HI+7km2ALXjn4YKcX9w==", "dev": true, "requires": { "@types/body-parser": "*", @@ -456,9 +486,9 @@ } }, "@types/express-serve-static-core": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.16.2.tgz", - "integrity": "sha512-qgc8tjnDrc789rAQed8NoiFLV5VGcItA4yWNFphqGU0RcuuQngD00g3LHhWIK3HQ2XeDgVCmlNPDlqi3fWBHnQ==", + "version": "4.16.9", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.16.9.tgz", + "integrity": "sha512-GqpaVWR0DM8FnRUJYKlWgyARoBUAVfRIeVDZQKOttLFp5SmhhF9YFIYeTPwMd/AXfxlP7xVO2dj1fGu0Q+krKQ==", "dev": true, "requires": { "@types/node": "*", @@ -466,15 +496,34 @@ } }, "@types/istanbul-lib-coverage": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.0.tgz", - "integrity": "sha512-ohkhb9LehJy+PA40rDtGAji61NCgdtKLAlFoYp4cnuuQEswwdK3vz9SOIkkyc3wrk8dzjphQApNs56yyXLStaQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", + "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==", "dev": true }, + "@types/istanbul-lib-report": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", + "integrity": "sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", + "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, "@types/jest": { - "version": "24.0.11", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.0.11.tgz", - "integrity": "sha512-2kLuPC5FDnWIDvaJBzsGTBQaBbnDweznicvK7UGYzlIJP4RJR2a4A/ByLUXEyEgag6jz8eHdlWExGDtH3EYUXQ==", + "version": "24.0.18", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.0.18.tgz", + "integrity": "sha512-jcDDXdjTcrQzdN06+TSVsPPqxvsZA/5QkYfIZlq1JMw7FdP5AZylbOc+6B/cuDurctRe+MziUMtQ3xQdrbjqyQ==", "dev": true, "requires": { "@types/jest-diff": "*" @@ -486,6 +535,12 @@ "integrity": "sha512-yALhelO3i0hqZwhjtcr6dYyaLoCHbAMshwtj6cGxTvHZAKXHsYGdff6E8EPw3xLKY0ELUTQ69Q1rQiJENnccMA==", "dev": true }, + "@types/json-schema": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.3.tgz", + "integrity": "sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A==", + "dev": true + }, "@types/mime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.1.tgz", @@ -493,15 +548,15 @@ "dev": true }, "@types/node": { - "version": "11.12.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-11.12.2.tgz", - "integrity": "sha512-c82MtnqWB/CqqK7/zit74Ob8H1dBdV7bK+BcErwtXbe0+nUGkgzq5NTDmRW/pAv2lFtmeNmW95b0zK2hxpeklg==", + "version": "12.7.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.2.tgz", + "integrity": "sha512-dyYO+f6ihZEtNPDcWNR1fkoTDf3zAK3lAABDze3mz6POyIercH0lEUawUFXlG8xaQZmm1yEBON/4TsYv/laDYg==", "dev": true }, "@types/node-schedule": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@types/node-schedule/-/node-schedule-1.2.3.tgz", - "integrity": "sha512-pmuGe7xlx4hnUnOeGk2G46xxGKesF8reddLPiQu0tEIOQePMjDezjaOXFLfRPFBDWm03Aj8FoqPTuFxQt9LDaw==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/node-schedule/-/node-schedule-1.2.4.tgz", + "integrity": "sha512-s8ie8rUwAtX0Si75SiKH14akE/Ofw/Hx4Exbulv4wOQJEDerI7zeOaDODr/a1UEaHN19VkmZCt9Q0rFEKrVE5g==", "dev": true, "requires": { "@types/node": "*" @@ -514,9 +569,9 @@ "dev": true }, "@types/serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-/BZ4QRLpH/bNYgZgwhKEh+5AsboDBcUdlBYgzoLX0fpj3Y2gp6EApyOlM3bK53wQS/OE1SrdSYBAbux2D1528Q==", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.3.tgz", + "integrity": "sha512-oprSwp094zOglVrXdlo/4bAHtKTAxX6VT8FOZlBKrmyLbNvE1zxZyJ6yikMVtHIvwP45+ZQGJn+FdXGKTozq0g==", "dev": true, "requires": { "@types/express-serve-static-core": "*", @@ -530,68 +585,89 @@ "dev": true }, "@types/yargs": { - "version": "12.0.10", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-12.0.10.tgz", - "integrity": "sha512-WsVzTPshvCSbHThUduGGxbmnwcpkgSctHGHTqzWyFg4lYAuV5qXlyFPOsP3OWqCINfmg/8VXP+zJaa4OxEsBQQ==", + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.2.tgz", + "integrity": "sha512-lwwgizwk/bIIU+3ELORkyuOgDjCh7zuWDFqRtPPhhVgq9N1F7CvLNKg1TX4f2duwtKQ0p044Au9r1PLIXHrIzQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-13.0.0.tgz", + "integrity": "sha512-wBlsw+8n21e6eTd4yVv8YD/E3xq0O6nNnJIquutAsFGE7EyMKz7W6RNT6BRu1SmdgmlCZ9tb0X+j+D6HGr8pZw==", "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.11.0.tgz", - "integrity": "sha512-mXv9ccCou89C8/4avKHuPB2WkSZyY/XcTQUXd5LFZAcLw1I3mWYVjUu6eS9Ja0QkP/ClolbcW9tb3Ov/pMdcqw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.0.0.tgz", + "integrity": "sha512-Mo45nxTTELODdl7CgpZKJISvLb+Fu64OOO2ZFc2x8sYSnUpFrBUW3H+H/ZGYmEkfnL6VkdtOSxgdt+Av79j0sA==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "1.11.0", - "eslint-utils": "^1.3.1", + "@typescript-eslint/experimental-utils": "2.0.0", + "eslint-utils": "^1.4.0", "functional-red-black-tree": "^1.0.1", "regexpp": "^2.0.1", - "tsutils": "^3.7.0" + "tsutils": "^3.14.0" + }, + "dependencies": { + "eslint-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.2.tgz", + "integrity": "sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.0.0" + } + } } }, "@typescript-eslint/experimental-utils": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-1.11.0.tgz", - "integrity": "sha512-7LbfaqF6B8oa8cp/315zxKk8FFzosRzzhF8Kn/ZRsRsnpm7Qcu25cR/9RnAQo5utZ2KIWVgaALr+ZmcbG47ruw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.0.0.tgz", + "integrity": "sha512-XGJG6GNBXIEx/mN4eTRypN/EUmsd0VhVGQ1AG+WTgdvjHl0G8vHhVBHrd/5oI6RRYBRnedNymSYWW1HAdivtmg==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "1.11.0", + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "2.0.0", "eslint-scope": "^4.0.0" } }, "@typescript-eslint/parser": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-1.11.0.tgz", - "integrity": "sha512-5xBExyXaxVyczrZvbRKEXvaTUFFq7gIM9BynXukXZE0zF3IQP/FxF4mPmmh3gJ9egafZFqByCpPTFm3dk4SY7Q==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.0.0.tgz", + "integrity": "sha512-ibyMBMr0383ZKserIsp67+WnNVoM402HKkxqXGlxEZsXtnGGurbnY90pBO3e0nBUM7chEEOcxUhgw9aPq7fEBA==", "dev": true, "requires": { "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "1.11.0", - "@typescript-eslint/typescript-estree": "1.11.0", + "@typescript-eslint/experimental-utils": "2.0.0", + "@typescript-eslint/typescript-estree": "2.0.0", "eslint-visitor-keys": "^1.0.0" } }, "@typescript-eslint/typescript-estree": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-1.11.0.tgz", - "integrity": "sha512-fquUHF5tAx1sM2OeRCC7wVxFd1iMELWMGCzOSmJ3pLzArj9+kRixdlC4d5MncuzXpjEqc6045p3KwM0o/3FuUA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.0.0.tgz", + "integrity": "sha512-NXbmzA3vWrSgavymlzMWNecgNOuiMMp62MO3kI7awZRLRcsA1QrYWo6q08m++uuAGVbXH/prZi2y1AWuhSu63w==", "dev": true, "requires": { "lodash.unescape": "4.0.1", - "semver": "5.5.0" + "semver": "^6.2.0" }, "dependencies": { "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, "abab": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", - "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.1.tgz", + "integrity": "sha512-1zSbbCuoIjafKZ3mblY5ikvAb0ODUbqBnFuUb7f6uLeQhhGJ0vEV4ntmtxKLT2WgXCO94E07BjunsIw1jOMPZw==", "dev": true }, "abbrev": { @@ -601,24 +677,24 @@ "dev": true }, "accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", "requires": { - "mime-types": "~2.1.18", - "negotiator": "0.6.1" + "mime-types": "~2.1.24", + "negotiator": "0.6.2" } }, "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.0.0.tgz", + "integrity": "sha512-PaF/MduxijYYt7unVGRuds1vBC9bFxbNf+VWqhOClfdgy7RlVkQqt610ig1/yxTgsDIfW1cWDel5EBbOy3jdtQ==", "dev": true }, "acorn-globals": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.0.tgz", - "integrity": "sha512-hMtHj3s5RnuhvHPowpBYvJVj3rAar82JiDQHvGs1zO0l10ocX/xEdBShNHTJaboucJUsScghp74pH3s7EnHHQw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.3.tgz", + "integrity": "sha512-vkR40VwS2SYO98AIeFvzWWh+xyc2qi9s7OoXSFEGIP/rOJKzjnhykaZJNnHdoq4BL2gGxI5EZOU16z896EYnOQ==", "dev": true, "requires": { "acorn": "^6.0.1", @@ -626,29 +702,29 @@ }, "dependencies": { "acorn": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", - "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", "dev": true } } }, "acorn-jsx": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", - "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.2.tgz", + "integrity": "sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw==", "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": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", "dev": true }, "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", "dev": true, "requires": { "fast-deep-equal": "^2.0.1", @@ -673,9 +749,9 @@ "dev": true }, "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, "ansi-styles": { @@ -697,15 +773,6 @@ "normalize-path": "^2.1.1" } }, - "append-transform": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", - "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", - "dev": true, - "requires": { - "default-require-extensions": "^2.0.0" - } - }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -760,12 +827,6 @@ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -793,15 +854,6 @@ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, - "async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", - "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", - "dev": true, - "requires": { - "lodash": "^4.17.11" - } - }, "async-each": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", @@ -809,9 +861,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": { @@ -855,48 +907,49 @@ } }, "babel-jest": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.5.0.tgz", - "integrity": "sha512-0fKCXyRwxFTJL0UXDJiT2xYxO9Lu2vBd9n+cC+eDjESzcVG3s2DRGAxbzJX21fceB1WYoBjAh8pQ83dKcl003g==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", + "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", "dev": true, "requires": { - "@jest/transform": "^24.5.0", - "@jest/types": "^24.5.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", "@types/babel__core": "^7.1.0", "babel-plugin-istanbul": "^5.1.0", - "babel-preset-jest": "^24.3.0", + "babel-preset-jest": "^24.9.0", "chalk": "^2.4.2", "slash": "^2.0.0" } }, "babel-plugin-istanbul": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.1.tgz", - "integrity": "sha512-RNNVv2lsHAXJQsEJ5jonQwrJVWK8AcZpG1oxhnjCUaAjL7xahYLANhPUZbzEQHjKy1NMYUwn+0NPKQc8iSY4xQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", + "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", "dev": true, "requires": { + "@babel/helper-plugin-utils": "^7.0.0", "find-up": "^3.0.0", - "istanbul-lib-instrument": "^3.0.0", - "test-exclude": "^5.0.0" + "istanbul-lib-instrument": "^3.3.0", + "test-exclude": "^5.2.3" } }, "babel-plugin-jest-hoist": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.3.0.tgz", - "integrity": "sha512-nWh4N1mVH55Tzhx2isvUN5ebM5CDUvIpXPZYMRazQughie/EqGnbR+czzoQlhUmJG9pPJmYDRhvocotb2THl1w==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", + "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", "dev": true, "requires": { "@types/babel__traverse": "^7.0.6" } }, "babel-preset-jest": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.3.0.tgz", - "integrity": "sha512-VGTV2QYBa/Kn3WCOKdfS31j9qomaXSgJqi65B6o05/1GsJyj9LVhSljM9ro4S+IBGj/ENhNBuH9bpqzztKAQSw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", + "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", "dev": true, "requires": { "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^24.3.0" + "babel-plugin-jest-hoist": "^24.9.0" } }, "balanced-match": { @@ -976,20 +1029,20 @@ "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=", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", "requires": { - "bytes": "3.0.0", + "bytes": "3.1.0", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", - "http-errors": "~1.6.3", - "iconv-lite": "0.4.23", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.5.2", - "raw-body": "2.3.3", - "type-is": "~1.6.16" + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" } }, "boxen": { @@ -1087,9 +1140,9 @@ } }, "bser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", - "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.0.tgz", + "integrity": "sha512-8zsjWrQkkBoLK6uxASk1nJ2SKv97ltiGDo6A3wA0/yRPz+CwmEyDo0hUrhIuukG2JHpAl3bvFIixw2/3Hi0DOg==", "dev": true, "requires": { "node-int64": "^0.4.0" @@ -1102,9 +1155,9 @@ "dev": true }, "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" }, "cache-base": { "version": "1.0.1", @@ -1124,15 +1177,15 @@ } }, "callsites": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.0.0.tgz", - "integrity": "sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, "camelcase": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.0.tgz", - "integrity": "sha512-Y05ICatFYPAfykDIB7VdwSJ0LUl1yq/BwO2OpyGGLjiRe1fgzTwVypPiWnzkGFOVFHXrCXUNBl86bpjBhZWSJg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, "capture-exit": { @@ -1260,23 +1313,6 @@ "string-width": "^2.1.1", "strip-ansi": "^4.0.0", "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } } }, "co": { @@ -1317,27 +1353,21 @@ "dev": true }, "combined-stream": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", - "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "requires": { "delayed-stream": "~1.0.0" } }, "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", "dev": true, "optional": true }, - "compare-versions": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.4.0.tgz", - "integrity": "sha512-tK69D7oNXXqUW3ZNo/z7NXTEz22TCF0pTE+YF9cxvaAM9XnkLo1fV621xCLrRR6aevJlKxExkss0vWqUCUpqdg==", - "dev": true - }, "component-emitter": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", @@ -1351,20 +1381,20 @@ "dev": true }, "concurrently": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-4.1.1.tgz", - "integrity": "sha512-48+FE5RJ0qc8azwKv4keVQWlni1hZeSjcWr8shBelOBtBHcKj1aJFM9lHRiSc1x7lq416pkvsqfBMhSRja+Lhw==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-4.1.2.tgz", + "integrity": "sha512-Kim9SFrNr2jd8/0yNYqDTFALzUX1tvimmwFWxmp/D4mRI+kbqIIwE2RkBDrxS2ic25O1UgQMI5AtBqdtX3ynYg==", "dev": true, "requires": { - "chalk": "^2.4.1", - "date-fns": "^1.23.0", - "lodash": "^4.17.10", + "chalk": "^2.4.2", + "date-fns": "^1.30.1", + "lodash": "^4.17.15", "read-pkg": "^4.0.1", - "rxjs": "^6.3.3", + "rxjs": "^6.5.2", "spawn-command": "^0.0.2-1", "supports-color": "^4.5.0", - "tree-kill": "^1.1.0", - "yargs": "^12.0.1" + "tree-kill": "^1.2.1", + "yargs": "^12.0.5" }, "dependencies": { "has-flag": { @@ -1373,17 +1403,6 @@ "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", "dev": true }, - "read-pkg": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", - "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", - "dev": true, - "requires": { - "normalize-package-data": "^2.3.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0" - } - }, "supports-color": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", @@ -1416,9 +1435,12 @@ "dev": true }, "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } }, "content-type": { "version": "1.0.4", @@ -1435,9 +1457,9 @@ } }, "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" }, "cookie-signature": { "version": "1.0.6", @@ -1494,15 +1516,15 @@ "dev": true }, "cssom": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.6.tgz", - "integrity": "sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", "dev": true }, "cssstyle": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.2.2.tgz", - "integrity": "sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", + "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", "dev": true, "requires": { "cssom": "0.3.x" @@ -1568,9 +1590,24 @@ "dev": true }, "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.0.tgz", + "integrity": "sha512-ZbfWJq/wN1Z273o7mUSjILYqehAktR2NVoSrOukDkU9kg2v/Uv89yU4Cvz8seJeAmtN5oqiefKq8FPuXOboqLw==", + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + }, + "dependencies": { + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + } + } }, "deep-extend": { "version": "0.6.0", @@ -1584,15 +1621,6 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, - "default-require-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", - "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", - "dev": true, - "requires": { - "strip-bom": "^3.0.0" - } - }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -1665,9 +1693,9 @@ "dev": true }, "diff-sequences": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.3.0.tgz", - "integrity": "sha512-xLqpez+Zj9GKSnPWS0WZw1igGocZ+uua8+y+5dDNTT934N3QuY1sp2LkHzwiaYQGz60hMq0pjAshdeXm5VUOEw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", + "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", "dev": true }, "doctrine": { @@ -1784,9 +1812,9 @@ "dev": true }, "escodegen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", - "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz", + "integrity": "sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==", "dev": true, "requires": { "esprima": "^3.1.3", @@ -1805,53 +1833,54 @@ } }, "eslint": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", - "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.2.2.tgz", + "integrity": "sha512-mf0elOkxHbdyGX1IJEUsNBzCDdyoUgljF3rRlgfyYh0pwGnreLc0jjD6ZuleOibjmnUWZLY2eXwSooeOgGJ2jw==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "ajv": "^6.9.1", + "ajv": "^6.10.0", "chalk": "^2.1.0", "cross-spawn": "^6.0.5", "debug": "^4.0.1", "doctrine": "^3.0.0", - "eslint-scope": "^4.0.3", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^5.0.1", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.2", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.1", "esquery": "^1.0.1", "esutils": "^2.0.2", "file-entry-cache": "^5.0.1", "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", + "glob-parent": "^5.0.0", "globals": "^11.7.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^6.2.2", - "js-yaml": "^3.13.0", + "inquirer": "^6.4.1", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.3.0", - "lodash": "^4.17.11", + "lodash": "^4.17.14", "minimatch": "^3.0.4", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", "progress": "^2.0.0", "regexpp": "^2.0.1", - "semver": "^5.5.1", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", "table": "^5.2.3", - "text-table": "^0.2.0" + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "debug": { @@ -1863,27 +1892,67 @@ "ms": "^2.1.1" } }, + "eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.2.tgz", + "integrity": "sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.0.0.tgz", + "integrity": "sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg==", + "dev": true, + "requires": { + "is-glob": "^4.0.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 }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^4.1.0" } + }, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "dev": true } } }, "eslint-config-standard": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz", - "integrity": "sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-14.1.0.tgz", + "integrity": "sha512-EF6XkrrGVbvv8hL/kYa/m6vnvmUT+K82pJJc4JJVMM6+Qgqh0pnwprSxdduDLB9p/7bIxD+YV5O0wfb8lmcPbA==", "dev": true }, "eslint-import-resolver-node": { @@ -1897,67 +1966,13 @@ } }, "eslint-module-utils": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.0.tgz", - "integrity": "sha512-14tltLm38Eu3zS+mt0KvILC3q8jyIAH518MlG+HO0p+yK885Lb1UHTY/UgR91eOyGdmxAPb+OLoW4znqIT6Ndw==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.1.tgz", + "integrity": "sha512-H6DOj+ejw7Tesdgbfs4jeS4YMFrT8uI8xwd1gtQqXssaR0EQ26L+2O/w6wkYFy2MymON0fTwHmXBvvfLNZVZEw==", "dev": true, "requires": { "debug": "^2.6.8", "pkg-dir": "^2.0.0" - }, - "dependencies": { - "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" - } - }, - "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 - }, - "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" - } - } } }, "eslint-plugin-es": { @@ -1971,9 +1986,9 @@ } }, "eslint-plugin-import": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.18.0.tgz", - "integrity": "sha512-PZpAEC4gj/6DEMMoU2Df01C5c50r7zdGIN52Yfi7CvvWaYssG7Jt5R9nFG5gmqodxNOz9vQS87xk6Izdtpdrig==", + "version": "2.18.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz", + "integrity": "sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ==", "dev": true, "requires": { "array-includes": "^3.0.3", @@ -1983,8 +1998,8 @@ "eslint-import-resolver-node": "^0.3.2", "eslint-module-utils": "^2.4.0", "has": "^1.0.3", - "lodash": "^4.17.11", "minimatch": "^3.0.4", + "object.values": "^1.1.0", "read-pkg-up": "^2.0.0", "resolve": "^1.11.0" }, @@ -1998,115 +2013,6 @@ "esutils": "^2.0.2", "isarray": "^1.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" - } - }, - "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": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.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" - } - }, - "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 - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - } - }, - "resolve": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", - "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } } } }, @@ -2154,9 +2060,9 @@ "dev": true }, "eslint-plugin-standard": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.0.tgz", - "integrity": "sha512-OwxJkR6TQiYMmt1EsNRMe5qG3GsbjlcOhbGUBY4LtavF9DsLaTcoR+j2Tdjqi23oUwKNUqX7qcn5fPStafMdlA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz", + "integrity": "sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ==", "dev": true }, "eslint-scope": { @@ -2176,28 +2082,20 @@ "dev": true }, "eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", "dev": true }, "espree": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", - "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.1.tgz", + "integrity": "sha512-EYbr8XZUhWbYCqQRW0duU5LxzL5bETN6AjKBGy1302qqzPaCH10QbRg3Wvco79Z8x9WbiE8HYB4e75xl6qUYvQ==", "dev": true, "requires": { - "acorn": "^6.0.7", - "acorn-jsx": "^5.0.0", - "eslint-visitor-keys": "^1.0.0" - }, - "dependencies": { - "acorn": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", - "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", - "dev": true - } + "acorn": "^7.0.0", + "acorn-jsx": "^5.0.2", + "eslint-visitor-keys": "^1.1.0" } }, "esprima": { @@ -2225,15 +2123,15 @@ } }, "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, "etag": { @@ -2304,52 +2202,52 @@ } }, "expect": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-24.5.0.tgz", - "integrity": "sha512-p2Gmc0CLxOgkyA93ySWmHFYHUPFIHG6XZ06l7WArWAsrqYVaVEkOU5NtT5i68KUyGKbkQgDCkiT65bWmdoL6Bw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", + "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", "dev": true, "requires": { - "@jest/types": "^24.5.0", + "@jest/types": "^24.9.0", "ansi-styles": "^3.2.0", - "jest-get-type": "^24.3.0", - "jest-matcher-utils": "^24.5.0", - "jest-message-util": "^24.5.0", - "jest-regex-util": "^24.3.0" + "jest-get-type": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-regex-util": "^24.9.0" } }, "express": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", - "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", "requires": { - "accepts": "~1.3.5", + "accepts": "~1.3.7", "array-flatten": "1.1.1", - "body-parser": "1.18.3", - "content-disposition": "0.5.2", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", "content-type": "~1.0.4", - "cookie": "0.3.1", + "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.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.2", + "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.4", - "qs": "6.5.2", - "range-parser": "~1.2.0", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", "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", + "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" } @@ -2382,25 +2280,14 @@ } }, "external-editor": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", - "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "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" - } - } } }, "extglob": { @@ -2519,16 +2406,6 @@ "flat-cache": "^2.0.1" } }, - "fileset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", - "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", - "dev": true, - "requires": { - "glob": "^7.0.3", - "minimatch": "^3.0.3" - } - }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -2553,16 +2430,16 @@ } }, "finalhandler": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", - "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "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", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", "unpipe": "~1.0.0" } }, @@ -3209,8 +3086,7 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "functional-red-black-tree": { "version": "1.0.1", @@ -3249,9 +3125,9 @@ } }, "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -3293,9 +3169,9 @@ } }, "globals": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", - "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", + "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 }, "got": { @@ -3338,9 +3214,9 @@ "dev": true }, "handlebars": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.1.tgz", - "integrity": "sha512-3Zhi6C0euYZL5sM0Zcy7lInLXKQ+YLcF/olbN010mzGQ4XVm50JeyBnMqofHh696GrciGruC7kCcApPDJvVgwA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", + "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", "dev": true, "requires": { "neo-async": "^2.6.0", @@ -3369,7 +3245,6 @@ "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" } @@ -3419,9 +3294,9 @@ } }, "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.4.tgz", + "integrity": "sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==", "dev": true }, "html-encoding-sniffer": { @@ -3434,14 +3309,15 @@ } }, "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=", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", "requires": { "depd": "~1.1.2", "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" } }, "http-signature": { @@ -3456,9 +3332,9 @@ } }, "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -3483,14 +3359,6 @@ "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" - }, - "dependencies": { - "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 - } } }, "import-lazy": { @@ -3507,6 +3375,17 @@ "requires": { "pkg-dir": "^3.0.0", "resolve-cwd": "^2.0.0" + }, + "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==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + } } }, "imurmurhash": { @@ -3537,9 +3416,9 @@ "dev": true }, "inquirer": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.4.1.tgz", - "integrity": "sha512-/Jw+qPZx4EDYsaT6uz7F4GJRNFMRdKNeUZw3ZnKV8lyuUgz/YWRCSUAJMZSVhSq4Ec0R2oYnyi6b3d4JXcL5Nw==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", "dev": true, "requires": { "ansi-escapes": "^3.2.0", @@ -3548,13 +3427,30 @@ "cli-width": "^2.0.0", "external-editor": "^3.0.3", "figures": "^2.0.0", - "lodash": "^4.17.11", + "lodash": "^4.17.12", "mute-stream": "0.0.7", "run-async": "^2.2.0", "rxjs": "^6.4.0", "string-width": "^2.1.0", "strip-ansi": "^5.1.0", "through": "^2.3.6" + }, + "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" + } + } } }, "invariant": { @@ -3573,9 +3469,9 @@ "dev": true }, "ipaddr.js": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", - "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" + "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==" }, "is-accessor-descriptor": { "version": "0.1.6", @@ -3597,6 +3493,11 @@ } } }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==" + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -3656,8 +3557,7 @@ "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 + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" }, "is-descriptor": { "version": "0.1.6", @@ -3697,9 +3597,9 @@ "dev": true }, "is-generator-fn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.0.0.tgz", - "integrity": "sha512-elzyIdM7iKoFHzcrndIqjYomImhxrFRnGP3galODoII4TB9gI7mZ+FnlLQmmjf27SxHS2gKEeyhX5/+YRS6H9g==", + "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": { @@ -3795,7 +3695,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "dev": true, "requires": { "has": "^1.0.1" } @@ -3863,68 +3762,62 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, - "istanbul-api": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-2.1.1.tgz", - "integrity": "sha512-kVmYrehiwyeBAk/wE71tW6emzLiHGjYIiDrc8sfyty4F8M02/lrgXSm+R1kXysmF20zArvmZXjlE/mg24TVPJw==", - "dev": true, - "requires": { - "async": "^2.6.1", - "compare-versions": "^3.2.1", - "fileset": "^2.0.3", - "istanbul-lib-coverage": "^2.0.3", - "istanbul-lib-hook": "^2.0.3", - "istanbul-lib-instrument": "^3.1.0", - "istanbul-lib-report": "^2.0.4", - "istanbul-lib-source-maps": "^3.0.2", - "istanbul-reports": "^2.1.1", - "js-yaml": "^3.12.0", - "make-dir": "^1.3.0", - "minimatch": "^3.0.4", - "once": "^1.4.0" - } - }, "istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==", + "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 }, - "istanbul-lib-hook": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.3.tgz", - "integrity": "sha512-CLmEqwEhuCYtGcpNVJjLV1DQyVnIqavMLFHV/DP+np/g3qvdxu3gsPqYoJMXm15sN84xOlckFB3VNvRbf5yEgA==", - "dev": true, - "requires": { - "append-transform": "^1.0.0" - } - }, "istanbul-lib-instrument": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.1.0.tgz", - "integrity": "sha512-ooVllVGT38HIk8MxDj/OIHXSYvH+1tq/Vb38s8ixt9GoJadXska4WkGY+0wkmtYCZNYtaARniH/DixUGGLZ0uA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", "dev": true, "requires": { - "@babel/generator": "^7.0.0", - "@babel/parser": "^7.0.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "istanbul-lib-coverage": "^2.0.3", - "semver": "^5.5.0" + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.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==", + "dev": true + } } }, "istanbul-lib-report": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.4.tgz", - "integrity": "sha512-sOiLZLAWpA0+3b5w5/dq0cjm2rrNdAfHWaGhmn7XEFW6X++IV9Ohn+pnELAl9K3rfpaeBfbmH9JU5sejacdLeA==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", "dev": true, "requires": { - "istanbul-lib-coverage": "^2.0.3", - "make-dir": "^1.3.0", - "supports-color": "^6.0.0" + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.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, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, "supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", @@ -3937,15 +3830,15 @@ } }, "istanbul-lib-source-maps": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.2.tgz", - "integrity": "sha512-JX4v0CiKTGp9fZPmoxpu9YEkPbEqCqBbO3403VabKjH+NRXo72HafD5UgnjTEqHL2SAjaZK1XDuDOkn6I5QVfQ==", + "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==", "dev": true, "requires": { "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.3", - "make-dir": "^1.3.0", - "rimraf": "^2.6.2", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", "source-map": "^0.6.1" }, "dependencies": { @@ -3958,229 +3851,338 @@ "ms": "^2.1.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==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, "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==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "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 } } }, "istanbul-reports": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.1.1.tgz", - "integrity": "sha512-FzNahnidyEPBCI0HcufJoSEoKykesRlFcSzQqjH9x0+LC8tnnE/p/90PBLu8iZTxr8yYZNyTtiAujUqyN+CIxw==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", + "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", "dev": true, "requires": { - "handlebars": "^4.1.0" + "handlebars": "^4.1.2" } }, "jest": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-24.5.0.tgz", - "integrity": "sha512-lxL+Fq5/RH7inxxmfS2aZLCf8MsS+YCUBfeiNO6BWz/MmjhDGaIEA/2bzEf9q4Q0X+mtFHiinHFvQ0u+RvW/qQ==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", + "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", "dev": true, "requires": { "import-local": "^2.0.0", - "jest-cli": "^24.5.0" + "jest-cli": "^24.9.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 + }, + "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" + } + }, + "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 + }, "jest-cli": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.5.0.tgz", - "integrity": "sha512-P+Jp0SLO4KWN0cGlNtC7JV0dW1eSFR7eRpoOucP2UM0sqlzp/bVHeo71Omonvigrj9AvCKy7NtQANtqJ7FXz8g==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", + "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", "dev": true, "requires": { - "@jest/core": "^24.5.0", - "@jest/test-result": "^24.5.0", - "@jest/types": "^24.5.0", + "@jest/core": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", "exit": "^0.1.2", "import-local": "^2.0.0", "is-ci": "^2.0.0", - "jest-config": "^24.5.0", - "jest-util": "^24.5.0", - "jest-validate": "^24.5.0", + "jest-config": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", "prompts": "^2.0.1", "realpath-native": "^1.1.0", - "yargs": "^12.0.2" + "yargs": "^13.3.0" + } + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "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" + } + }, + "yargs": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "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.1" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } }, "jest-changed-files": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.5.0.tgz", - "integrity": "sha512-Ikl29dosYnTsH9pYa1Tv9POkILBhN/TLZ37xbzgNsZ1D2+2n+8oEZS2yP1BrHn/T4Rs4Ggwwbp/x8CKOS5YJOg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", + "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", "dev": true, "requires": { - "@jest/types": "^24.5.0", + "@jest/types": "^24.9.0", "execa": "^1.0.0", "throat": "^4.0.0" } }, "jest-config": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.5.0.tgz", - "integrity": "sha512-t2UTh0Z2uZhGBNVseF8wA2DS2SuBiLOL6qpLq18+OZGfFUxTM7BzUVKyHFN/vuN+s/aslY1COW95j1Rw81huOQ==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", + "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^24.5.0", - "babel-jest": "^24.5.0", + "@jest/test-sequencer": "^24.9.0", + "@jest/types": "^24.9.0", + "babel-jest": "^24.9.0", "chalk": "^2.0.1", "glob": "^7.1.1", - "jest-environment-jsdom": "^24.5.0", - "jest-environment-node": "^24.5.0", - "jest-get-type": "^24.3.0", - "jest-jasmine2": "^24.5.0", + "jest-environment-jsdom": "^24.9.0", + "jest-environment-node": "^24.9.0", + "jest-get-type": "^24.9.0", + "jest-jasmine2": "^24.9.0", "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.5.0", - "jest-util": "^24.5.0", - "jest-validate": "^24.5.0", + "jest-resolve": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", "micromatch": "^3.1.10", - "pretty-format": "^24.5.0", + "pretty-format": "^24.9.0", "realpath-native": "^1.1.0" } }, "jest-diff": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.5.0.tgz", - "integrity": "sha512-mCILZd9r7zqL9Uh6yNoXjwGQx0/J43OD2vvWVKwOEOLZliQOsojXwqboubAQ+Tszrb6DHGmNU7m4whGeB9YOqw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", + "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", "dev": true, "requires": { "chalk": "^2.0.1", - "diff-sequences": "^24.3.0", - "jest-get-type": "^24.3.0", - "pretty-format": "^24.5.0" + "diff-sequences": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" } }, "jest-docblock": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.3.0.tgz", - "integrity": "sha512-nlANmF9Yq1dufhFlKG9rasfQlrY7wINJbo3q01tu56Jv5eBU5jirylhF2O5ZBnLxzOVBGRDz/9NAwNyBtG4Nyg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz", + "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==", "dev": true, "requires": { "detect-newline": "^2.1.0" } }, "jest-each": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.5.0.tgz", - "integrity": "sha512-6gy3Kh37PwIT5sNvNY2VchtIFOOBh8UCYnBlxXMb5sr5wpJUDPTUATX2Axq1Vfk+HWTMpsYPeVYp4TXx5uqUBw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", + "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", "dev": true, "requires": { - "@jest/types": "^24.5.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", - "jest-get-type": "^24.3.0", - "jest-util": "^24.5.0", - "pretty-format": "^24.5.0" + "jest-get-type": "^24.9.0", + "jest-util": "^24.9.0", + "pretty-format": "^24.9.0" } }, "jest-environment-jsdom": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.5.0.tgz", - "integrity": "sha512-62Ih5HbdAWcsqBx2ktUnor/mABBo1U111AvZWcLKeWN/n/gc5ZvDBKe4Og44fQdHKiXClrNGC6G0mBo6wrPeGQ==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", + "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", "dev": true, "requires": { - "@jest/environment": "^24.5.0", - "@jest/fake-timers": "^24.5.0", - "@jest/types": "^24.5.0", - "jest-mock": "^24.5.0", - "jest-util": "^24.5.0", + "@jest/environment": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-util": "^24.9.0", "jsdom": "^11.5.1" } }, "jest-environment-node": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.5.0.tgz", - "integrity": "sha512-du6FuyWr/GbKLsmAbzNF9mpr2Iu2zWSaq/BNHzX+vgOcts9f2ayXBweS7RAhr+6bLp6qRpMB6utAMF5Ygktxnw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", + "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", "dev": true, "requires": { - "@jest/environment": "^24.5.0", - "@jest/fake-timers": "^24.5.0", - "@jest/types": "^24.5.0", - "jest-mock": "^24.5.0", - "jest-util": "^24.5.0" + "@jest/environment": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-util": "^24.9.0" } }, "jest-get-type": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.3.0.tgz", - "integrity": "sha512-HYF6pry72YUlVcvUx3sEpMRwXEWGEPlJ0bSPVnB3b3n++j4phUEoSPcS6GC0pPJ9rpyPSe4cb5muFo6D39cXow==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", "dev": true }, "jest-haste-map": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.5.0.tgz", - "integrity": "sha512-mb4Yrcjw9vBgSvobDwH8QUovxApdimGcOkp+V1ucGGw4Uvr3VzZQBJhNm1UY3dXYm4XXyTW2G7IBEZ9pM2ggRQ==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", + "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", "dev": true, "requires": { - "@jest/types": "^24.5.0", + "@jest/types": "^24.9.0", + "anymatch": "^2.0.0", "fb-watchman": "^2.0.0", + "fsevents": "^1.2.7", "graceful-fs": "^4.1.15", "invariant": "^2.2.4", - "jest-serializer": "^24.4.0", - "jest-util": "^24.5.0", - "jest-worker": "^24.4.0", + "jest-serializer": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.9.0", "micromatch": "^3.1.10", - "sane": "^4.0.3" + "sane": "^4.0.3", + "walker": "^1.0.7" } }, "jest-jasmine2": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.5.0.tgz", - "integrity": "sha512-sfVrxVcx1rNUbBeyIyhkqZ4q+seNKyAG6iM0S2TYBdQsXjoFDdqWFfsUxb6uXSsbimbXX/NMkJIwUZ1uT9+/Aw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", + "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^24.5.0", - "@jest/test-result": "^24.5.0", - "@jest/types": "^24.5.0", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", "co": "^4.6.0", - "expect": "^24.5.0", + "expect": "^24.9.0", "is-generator-fn": "^2.0.0", - "jest-each": "^24.5.0", - "jest-matcher-utils": "^24.5.0", - "jest-message-util": "^24.5.0", - "jest-runtime": "^24.5.0", - "jest-snapshot": "^24.5.0", - "jest-util": "^24.5.0", - "pretty-format": "^24.5.0", + "jest-each": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "pretty-format": "^24.9.0", "throat": "^4.0.0" } }, "jest-leak-detector": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.5.0.tgz", - "integrity": "sha512-LZKBjGovFRx3cRBkqmIg+BZnxbrLqhQl09IziMk3oeh1OV81Hg30RUIx885mq8qBv1PA0comB9bjKcuyNO1bCQ==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", + "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", "dev": true, "requires": { - "pretty-format": "^24.5.0" + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" } }, "jest-matcher-utils": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.5.0.tgz", - "integrity": "sha512-QM1nmLROjLj8GMGzg5VBra3I9hLpjMPtF1YqzQS3rvWn2ltGZLrGAO1KQ9zUCVi5aCvrkbS5Ndm2evIP9yZg1Q==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", + "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", "dev": true, "requires": { "chalk": "^2.0.1", - "jest-diff": "^24.5.0", - "jest-get-type": "^24.3.0", - "pretty-format": "^24.5.0" + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" } }, "jest-message-util": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.5.0.tgz", - "integrity": "sha512-6ZYgdOojowCGiV0D8WdgctZEAe+EcFU+KrVds+0ZjvpZurUW2/oKJGltJ6FWY2joZwYXN5VL36GPV6pNVRqRnQ==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^24.5.0", - "@jest/types": "^24.5.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "@types/stack-utils": "^1.0.1", "chalk": "^2.0.1", "micromatch": "^3.1.10", @@ -4189,12 +4191,12 @@ } }, "jest-mock": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.5.0.tgz", - "integrity": "sha512-ZnAtkWrKf48eERgAOiUxVoFavVBziO2pAi2MfZ1+bGXVkDfxWLxU0//oJBkgwbsv6OAmuLBz4XFFqvCFMqnGUw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", + "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", "dev": true, "requires": { - "@jest/types": "^24.5.0" + "@jest/types": "^24.9.0" } }, "jest-pnp-resolver": { @@ -4204,18 +4206,18 @@ "dev": true }, "jest-regex-util": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.3.0.tgz", - "integrity": "sha512-tXQR1NEOyGlfylyEjg1ImtScwMq8Oh3iJbGTjN7p0J23EuVX1MA8rwU69K4sLbCmwzgCUbVkm0FkSF9TdzOhtg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", + "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", "dev": true }, "jest-resolve": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.5.0.tgz", - "integrity": "sha512-ZIfGqLX1Rg8xJpQqNjdoO8MuxHV1q/i2OO1hLXjgCWFWs5bsedS8UrOdgjUqqNae6DXA+pCyRmdcB7lQEEbXew==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", + "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", "dev": true, "requires": { - "@jest/types": "^24.5.0", + "@jest/types": "^24.9.0", "browser-resolve": "^1.11.3", "chalk": "^2.0.1", "jest-pnp-resolver": "^1.2.1", @@ -4223,112 +4225,210 @@ } }, "jest-resolve-dependencies": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.5.0.tgz", - "integrity": "sha512-dRVM1D+gWrFfrq2vlL5P9P/i8kB4BOYqYf3S7xczZ+A6PC3SgXYSErX/ScW/469pWMboM1uAhgLF+39nXlirCQ==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz", + "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", "dev": true, "requires": { - "@jest/types": "^24.5.0", + "@jest/types": "^24.9.0", "jest-regex-util": "^24.3.0", - "jest-snapshot": "^24.5.0" + "jest-snapshot": "^24.9.0" } }, "jest-runner": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.5.0.tgz", - "integrity": "sha512-oqsiS9TkIZV5dVkD+GmbNfWBRPIvxqmlTQ+AQUJUQ07n+4xTSDc40r+aKBynHw9/tLzafC00DIbJjB2cOZdvMA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", + "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", "dev": true, "requires": { - "@jest/console": "^24.3.0", - "@jest/environment": "^24.5.0", - "@jest/test-result": "^24.5.0", - "@jest/types": "^24.5.0", + "@jest/console": "^24.7.1", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "chalk": "^2.4.2", "exit": "^0.1.2", "graceful-fs": "^4.1.15", - "jest-config": "^24.5.0", + "jest-config": "^24.9.0", "jest-docblock": "^24.3.0", - "jest-haste-map": "^24.5.0", - "jest-jasmine2": "^24.5.0", - "jest-leak-detector": "^24.5.0", - "jest-message-util": "^24.5.0", - "jest-resolve": "^24.5.0", - "jest-runtime": "^24.5.0", - "jest-util": "^24.5.0", - "jest-worker": "^24.4.0", + "jest-haste-map": "^24.9.0", + "jest-jasmine2": "^24.9.0", + "jest-leak-detector": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-resolve": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.6.0", "source-map-support": "^0.5.6", "throat": "^4.0.0" } }, "jest-runtime": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.5.0.tgz", - "integrity": "sha512-GTFHzfLdwpaeoDPilNpBrorlPoNZuZrwKKzKJs09vWwHo+9TOsIIuszK8cWOuKC7ss07aN1922Ge8fsGdsqCuw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", + "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", "dev": true, "requires": { - "@jest/console": "^24.3.0", - "@jest/environment": "^24.5.0", + "@jest/console": "^24.7.1", + "@jest/environment": "^24.9.0", "@jest/source-map": "^24.3.0", - "@jest/transform": "^24.5.0", - "@jest/types": "^24.5.0", - "@types/yargs": "^12.0.2", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/yargs": "^13.0.0", "chalk": "^2.0.1", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.1.15", - "jest-config": "^24.5.0", - "jest-haste-map": "^24.5.0", - "jest-message-util": "^24.5.0", - "jest-mock": "^24.5.0", + "jest-config": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0", "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.5.0", - "jest-snapshot": "^24.5.0", - "jest-util": "^24.5.0", - "jest-validate": "^24.5.0", + "jest-resolve": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", "realpath-native": "^1.1.0", "slash": "^2.0.0", "strip-bom": "^3.0.0", - "yargs": "^12.0.2" + "yargs": "^13.3.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 + }, + "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" + } + }, + "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 + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "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" + } + }, + "yargs": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "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.1" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } } }, "jest-serializer": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.4.0.tgz", - "integrity": "sha512-k//0DtglVstc1fv+GY/VHDIjrtNjdYvYjMlbLUed4kxrE92sIUewOi5Hj3vrpB8CXfkJntRPDRjCrCvUhBdL8Q==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", + "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", "dev": true }, "jest-snapshot": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.5.0.tgz", - "integrity": "sha512-eBEeJb5ROk0NcpodmSKnCVgMOo+Qsu5z9EDl3tGffwPzK1yV37mjGWF2YeIz1NkntgTzP+fUL4s09a0+0dpVWA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", + "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", "dev": true, "requires": { "@babel/types": "^7.0.0", - "@jest/types": "^24.5.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", - "expect": "^24.5.0", - "jest-diff": "^24.5.0", - "jest-matcher-utils": "^24.5.0", - "jest-message-util": "^24.5.0", - "jest-resolve": "^24.5.0", + "expect": "^24.9.0", + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-resolve": "^24.9.0", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "pretty-format": "^24.5.0", - "semver": "^5.5.0" + "pretty-format": "^24.9.0", + "semver": "^6.2.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 + } } }, "jest-util": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.5.0.tgz", - "integrity": "sha512-Xy8JsD0jvBz85K7VsTIQDuY44s+hYJyppAhcsHsOsGisVtdhar6fajf2UOf2mEVEgh15ZSdA0zkCuheN8cbr1Q==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", + "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", "dev": true, "requires": { - "@jest/console": "^24.3.0", - "@jest/fake-timers": "^24.5.0", - "@jest/source-map": "^24.3.0", - "@jest/test-result": "^24.5.0", - "@jest/types": "^24.5.0", - "@types/node": "*", + "@jest/console": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/source-map": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "callsites": "^3.0.0", "chalk": "^2.0.1", "graceful-fs": "^4.1.15", @@ -4339,43 +4439,41 @@ } }, "jest-validate": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.5.0.tgz", - "integrity": "sha512-gg0dYszxjgK2o11unSIJhkOFZqNRQbWOAB2/LOUdsd2LfD9oXiMeuee8XsT0iRy5EvSccBgB4h/9HRbIo3MHgQ==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", + "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", "dev": true, "requires": { - "@jest/types": "^24.5.0", - "camelcase": "^5.0.0", + "@jest/types": "^24.9.0", + "camelcase": "^5.3.1", "chalk": "^2.0.1", - "jest-get-type": "^24.3.0", - "leven": "^2.1.0", - "pretty-format": "^24.5.0" + "jest-get-type": "^24.9.0", + "leven": "^3.1.0", + "pretty-format": "^24.9.0" } }, "jest-watcher": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.5.0.tgz", - "integrity": "sha512-/hCpgR6bg0nKvD3nv4KasdTxuhwfViVMHUATJlnGCD0r1QrmIssimPbmc5KfAQblAVxkD8xrzuij9vfPUk1/rA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz", + "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", "dev": true, "requires": { - "@jest/test-result": "^24.5.0", - "@jest/types": "^24.5.0", - "@types/node": "*", - "@types/yargs": "^12.0.9", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/yargs": "^13.0.0", "ansi-escapes": "^3.0.0", "chalk": "^2.0.1", - "jest-util": "^24.5.0", + "jest-util": "^24.9.0", "string-length": "^2.0.0" } }, "jest-worker": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.4.0.tgz", - "integrity": "sha512-BH9X/klG9vxwoO99ZBUbZFfV8qO0XNZ5SIiCyYK2zOuJBl6YJVAeNIQjcoOVNu4HGEHeYEKsUWws8kSlSbZ9YQ==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", "dev": true, "requires": { - "@types/node": "*", - "merge-stream": "^1.0.1", + "merge-stream": "^2.0.0", "supports-color": "^6.1.0" }, "dependencies": { @@ -4397,9 +4495,9 @@ "dev": true }, "js-yaml": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.0.tgz", - "integrity": "sha512-pZZoSxcCYco+DIKBTimr67J6Hy+EYGZDY/HCWC+iAEA9h1ByhMXAIVUXMcMFpOCxQ/xjXmPI2MkDL5HRm5eFrQ==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -4444,6 +4542,14 @@ "whatwg-url": "^6.4.1", "ws": "^5.2.0", "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + } } }, "jsesc": { @@ -4510,9 +4616,9 @@ "dev": true }, "kleur": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.2.tgz", - "integrity": "sha512-3h7B2WRT5LNXOtQiAaWonilegHcPSf9nLVXlSTci8lu1dZUuui61+EsPEZqSVxY7rXYmB2DVKMQILxaO5WL61Q==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, "latest-version": { @@ -4540,9 +4646,9 @@ "dev": true }, "leven": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", - "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "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": { @@ -4556,15 +4662,32 @@ } }, "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "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": { "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", + "parse-json": "^2.2.0", + "pify": "^2.0.0", "strip-bom": "^3.0.0" + }, + "dependencies": { + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } } }, "locate-path": { @@ -4578,9 +4701,9 @@ } }, "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, "lodash.sortby": { @@ -4695,13 +4818,10 @@ "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } + "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 }, "methods": { "version": "1.1.2", @@ -4730,21 +4850,21 @@ } }, "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "mime-db": { - "version": "1.38.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", - "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==" + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" }, "mime-types": { - "version": "2.1.22", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", - "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", "requires": { - "mime-db": "~1.38.0" + "mime-db": "1.40.0" } }, "mimic-fn": { @@ -4863,14 +4983,14 @@ "dev": true }, "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, "neo-async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", - "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", "dev": true }, "nice-try": { @@ -4892,9 +5012,9 @@ "dev": true }, "node-notifier": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.0.tgz", - "integrity": "sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ==", + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", + "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", "dev": true, "requires": { "growly": "^1.3.0", @@ -4995,9 +5115,9 @@ "dev": true }, "nwsapi": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.3.tgz", - "integrity": "sha512-RowAaJGEgYXEZfQ7tvvdtAQUKPyTR6T6wNu0fwlNsGQYr/h3yQc6oI8WnVZh3Y/Sylwc+dtAlvPqfFZjhTyk3A==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz", + "integrity": "sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw==", "dev": true }, "oauth-sign": { @@ -5037,6 +5157,11 @@ } } }, + "object-is": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", + "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=" + }, "object-keys": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.0.tgz", @@ -5070,6 +5195,18 @@ "isobject": "^3.0.1" } }, + "object.values": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", + "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -5119,6 +5256,12 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true } } }, @@ -5134,14 +5277,6 @@ "prelude-ls": "~1.1.2", "type-check": "~0.3.2", "wordwrap": "~1.0.0" - }, - "dependencies": { - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - } } }, "os-locale": { @@ -5183,15 +5318,15 @@ "dev": true }, "p-is-promise": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.0.0.tgz", - "integrity": "sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", "dev": true }, "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "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" @@ -5256,9 +5391,9 @@ "dev": true }, "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, "pascalcase": { "version": "0.1.1", @@ -5308,12 +5443,20 @@ "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "dev": true, "requires": { - "pify": "^3.0.0" + "pify": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } } }, "performance-now": { @@ -5338,12 +5481,57 @@ } }, "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==", + "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": "^3.0.0" + "find-up": "^2.1.0" + }, + "dependencies": { + "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" + } + }, + "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 + } } }, "pn": { @@ -5371,15 +5559,23 @@ "dev": true }, "pretty-format": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.5.0.tgz", - "integrity": "sha512-/3RuSghukCf8Riu5Ncve0iI+BzVkbRU5EeUoArKARZobREycuH5O4waxvaNIloEXdb0qwgmEAed5vTpX1HNROQ==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", "dev": true, "requires": { - "@jest/types": "^24.5.0", + "@jest/types": "^24.9.0", "ansi-regex": "^4.0.0", "ansi-styles": "^3.2.0", "react-is": "^16.8.4" + }, + "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 + } } }, "process-nextick-args": { @@ -5395,22 +5591,22 @@ "dev": true }, "prompts": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.0.4.tgz", - "integrity": "sha512-HTzM3UWp/99A0gk51gAegwo1QRYA7xjcZufMNe33rCclFszUYAuHe1fIN/3ZmiHeGPkUsNaRyQm1hHOfM0PKxA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.2.1.tgz", + "integrity": "sha512-VObPvJiWPhpZI6C5m60XOzTfnYg/xc/an+r9VYymj9WJW3B/DIH+REzjpAACPf8brwPeP+7vz3bIim3S+AaMjw==", "dev": true, "requires": { - "kleur": "^3.0.2", - "sisteransi": "^1.0.0" + "kleur": "^3.0.3", + "sisteransi": "^1.0.3" } }, "proxy-addr": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", - "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", + "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==", "requires": { "forwarded": "~0.1.2", - "ipaddr.js": "1.8.0" + "ipaddr.js": "1.9.0" } }, "pseudomap": { @@ -5420,9 +5616,9 @@ "dev": true }, "psl": { - "version": "1.1.31", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", - "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.3.0.tgz", + "integrity": "sha512-avHdspHO+9rQTLbv1RO+MPYeP/SzsCoxofjVnHanETfQhTJrmB0HlDoW+EiN/R+C0BZ+gERab9NY0lPN2TxNag==", "dev": true }, "pstree.remy": { @@ -5448,23 +5644,23 @@ "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==" + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" }, "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==" }, "raw-body": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", - "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.3", - "iconv-lite": "0.4.23", + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", "unpipe": "1.0.0" } }, @@ -5481,30 +5677,86 @@ } }, "react-is": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", - "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==", + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.9.0.tgz", + "integrity": "sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw==", "dev": true }, "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", + "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", "dev": true, "requires": { - "load-json-file": "^4.0.0", "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" + "parse-json": "^4.0.0", + "pify": "^3.0.0" } }, "read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "dev": true, "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "dependencies": { + "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" + } + }, + "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 + }, + "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" + } + } } }, "readable-stream": { @@ -5552,6 +5804,14 @@ "safe-regex": "^1.1.0" } }, + "regexp.prototype.flags": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz", + "integrity": "sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA==", + "requires": { + "define-properties": "^1.1.2" + } + }, "regexpp": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", @@ -5629,6 +5889,12 @@ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", "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 + }, "tough-cookie": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", @@ -5674,9 +5940,9 @@ "dev": true }, "resolve": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", - "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -5689,12 +5955,20 @@ "dev": true, "requires": { "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } } }, "resolve-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-url": { @@ -5729,9 +6003,9 @@ } }, "rsvp": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.4.tgz", - "integrity": "sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA==", + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", "dev": true }, "run-async": { @@ -5810,9 +6084,9 @@ } }, "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", "requires": { "debug": "2.6.9", "depd": "~1.1.2", @@ -5821,23 +6095,30 @@ "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", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "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==" + } } }, "serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "parseurl": "~1.3.2", - "send": "0.16.2" + "parseurl": "~1.3.3", + "send": "0.17.1" } }, "set-blocking": { @@ -5870,9 +6151,9 @@ } }, "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==" }, "shebang-command": { "version": "1.2.0", @@ -5902,9 +6183,9 @@ "dev": true }, "sisteransi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.0.tgz", - "integrity": "sha512-N+z4pHB4AmUv0SjveWRd6q1Nj5w62m5jodv+GD8lvmbY/83T/rpbJGZOnK5T149OldDj4Db07BSv9xY4K6NTPQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.3.tgz", + "integrity": "sha512-SbEG75TzH8G7eVXFSN5f9EExILKfly7SUvVY5DhhYLvfhKqhDFY0OzevWa/zwak0RLRfWS5AvfMWpd9gJvr5Yg==", "dev": true }, "slash": { @@ -6062,9 +6343,9 @@ } }, "source-map-support": { - "version": "0.5.11", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.11.tgz", - "integrity": "sha512-//sajEx/fGL3iw6fltKMdPvy8kL3kJ2O3iuYlRoT3k9Kb4BjOoZ+BZzaNHeuaruSt+Kf3Zk9tnfAQg9/AJqUVQ==", + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -6110,9 +6391,9 @@ } }, "spdx-license-ids": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz", - "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", "dev": true }, "split-string": { @@ -6175,9 +6456,9 @@ } }, "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, "stealthy-require": { "version": "1.1.1", @@ -6193,23 +6474,6 @@ "requires": { "astral-regex": "^1.0.0", "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } } }, "string-width": { @@ -6249,12 +6513,12 @@ } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^3.0.0" } }, "strip-bom": { @@ -6285,23 +6549,29 @@ } }, "symbol-tree": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", - "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", + "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": "5.4.1", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.1.tgz", - "integrity": "sha512-E6CK1/pZe2N75rGZQotFOdmzWQ1AILtgYbMAbAjvms0S1l5IDB47zG3nCnFGB/w+7nB3vKofbLXCH7HPBo864w==", + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", "dev": true, "requires": { - "ajv": "^6.9.1", - "lodash": "^4.17.11", + "ajv": "^6.10.2", + "lodash": "^4.17.14", "slice-ansi": "^2.1.0", "string-width": "^3.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 + }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -6312,6 +6582,15 @@ "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" + } } } }, @@ -6359,15 +6638,65 @@ } }, "test-exclude": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.1.0.tgz", - "integrity": "sha512-gwf0S2fFsANC55fSeSqpb8BYk6w3FDvwZxfNjeF6FRgvFa43r+7wRiA/Q0IxoRU37wB/LE8IQ4221BsNucTaCA==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", + "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", "dev": true, "requires": { - "arrify": "^1.0.1", + "glob": "^7.1.3", "minimatch": "^3.0.4", "read-pkg-up": "^4.0.0", - "require-main-filename": "^1.0.1" + "require-main-filename": "^2.0.0" + }, + "dependencies": { + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + } + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + } } }, "text-table": { @@ -6457,6 +6786,11 @@ "repeat-string": "^1.6.1" } }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, "touch": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", @@ -6498,9 +6832,9 @@ "dev": true }, "ts-jest": { - "version": "24.0.1", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-24.0.1.tgz", - "integrity": "sha512-mgNZmYPuGBNgYpUzchI7vdSr6zATQI0TrSyzREnXHuPCvlW8T1DQ/fdscgx4ivS5vAMUGUaoxGdWIVHC5I8imw==", + "version": "24.0.2", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-24.0.2.tgz", + "integrity": "sha512-h6ZCZiA1EQgjczxq+uGLXQlNgeg02WWJBbeT8j6nyIBRQdglqbvzDoHahTEIiS6Eor6x8mK6PfZ7brQ9Q6tzHw==", "dev": true, "requires": { "bs-logger": "0.x", @@ -6532,15 +6866,15 @@ } }, "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", "dev": true }, "tsutils": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.14.0.tgz", - "integrity": "sha512-SmzGbB0l+8I0QwsPgjooFRaRvHLBLNYM8SeQ0k6rtNDru5sCGeLJcZdwilNndN+GysuFjF5EIYgN8GfFG6UeUw==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", "dev": true, "requires": { "tslib": "^1.8.1" @@ -6571,28 +6905,28 @@ } }, "type-is": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "requires": { "media-typer": "0.3.0", - "mime-types": "~2.1.18" + "mime-types": "~2.1.24" } }, "typescript": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.1.tgz", - "integrity": "sha512-3NSMb2VzDQm8oBTLH6Nj55VVtUEpe/rgkIzMir0qVoLyjDZlnMBva0U6vDiV3IH+sl/Yu6oP5QwsAQtHPmDd2Q==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.6.2.tgz", + "integrity": "sha512-lmQ4L+J6mnu3xweP8+rOrUwzmN+MRAj7TgtJtDaXE5PMyX2kCrklhg3rvOsOIfNeAWMQWO2F1GPc1kMD2vLAfw==", "dev": true }, "uglify-js": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.3.tgz", - "integrity": "sha512-rIQPT2UMDnk4jRX+w4WO84/pebU2jiLsjgIyrCktYgSvx28enOE3iYQMr+BD1rHiitWnDmpu0cY/LfIEpKcjcw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", + "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", "dev": true, "optional": true, "requires": { - "commander": "~2.19.0", + "commander": "~2.20.0", "source-map": "~0.6.1" } }, @@ -6793,9 +7127,15 @@ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", "dev": true }, "validate-npm-package-license": { @@ -6855,17 +7195,6 @@ "dev": true, "requires": { "iconv-lite": "0.4.24" - }, - "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" - } - } } }, "whatwg-mimetype": { @@ -6910,9 +7239,9 @@ } }, "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, "wrap-ansi": { diff --git a/scheduler/package.json b/scheduler/package.json index 77cc80535..36fbb694a 100644 --- a/scheduler/package.json +++ b/scheduler/package.json @@ -21,28 +21,28 @@ "author": "", "dependencies": { "axios": "^0.19.0", - "deep-equal": "^1.0.1", - "express": "^4.16.4", + "deep-equal": "^1.1.0", + "express": "^4.17.1", "node-schedule": "^1.3.2" }, "devDependencies": { "@types/deep-equal": "^1.0.1", - "@types/express": "^4.16.1", - "@types/jest": "^24.0.11", - "@types/node-schedule": "^1.2.3", - "@typescript-eslint/eslint-plugin": "^1.8.0", - "@typescript-eslint/parser": "^1.11.0", - "concurrently": "^4.1.1", - "jest": "^24.5.0", + "@types/express": "^4.17.1", + "@types/jest": "^24.0.18", + "@types/node-schedule": "^1.2.4", + "@typescript-eslint/eslint-plugin": "^2.0.0", + "@typescript-eslint/parser": "^2.0.0", + "concurrently": "^4.1.2", + "jest": "^24.9.0", "nodemon": "^1.19.1", - "ts-jest": "^24.0.1", - "tslib": "^1.9.3", - "typescript": "^3.4.1", - "eslint": "^5.16.0", - "eslint-config-standard": "^12.0.0", - "eslint-plugin-import": "^2.17.2", - "eslint-plugin-node": "^9.0.1", - "eslint-plugin-promise": "^4.1.1", - "eslint-plugin-standard": "^4.0.0" + "ts-jest": "^24.0.2", + "tslib": "^1.10.0", + "typescript": "^3.6.2", + "eslint": "^6.2.2", + "eslint-config-standard": "^14.1.0", + "eslint-plugin-import": "^2.18.2", + "eslint-plugin-node": "^9.1.0", + "eslint-plugin-promise": "^4.2.1", + "eslint-plugin-standard": "^4.0.1" } } diff --git a/transformation/integration-test/package-lock.json b/transformation/integration-test/package-lock.json index 4ee0b7548..6e1b70225 100644 --- a/transformation/integration-test/package-lock.json +++ b/transformation/integration-test/package-lock.json @@ -5,31 +5,31 @@ "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", "dev": true, "requires": { "@babel/highlight": "^7.0.0" } }, "@babel/core": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.5.tgz", - "integrity": "sha512-OvjIh6aqXtlsA8ujtGKfC7LYWksYSX8yQcM8Ay3LuvVeQ63lcOKgoZWVqcpFwkd29aYU9rVx7jxhfhiEDV9MZA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.5.5.tgz", + "integrity": "sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.4", - "@babel/helpers": "^7.4.4", - "@babel/parser": "^7.4.5", + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helpers": "^7.5.5", + "@babel/parser": "^7.5.5", "@babel/template": "^7.4.4", - "@babel/traverse": "^7.4.5", - "@babel/types": "^7.4.4", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5", "convert-source-map": "^1.1.0", "debug": "^4.1.0", "json5": "^2.1.0", - "lodash": "^4.17.11", + "lodash": "^4.17.13", "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" @@ -59,14 +59,14 @@ } }, "@babel/generator": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", - "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", "dev": true, "requires": { - "@babel/types": "^7.4.4", + "@babel/types": "^7.5.5", "jsesc": "^2.5.1", - "lodash": "^4.17.11", + "lodash": "^4.17.13", "source-map": "^0.5.0", "trim-right": "^1.0.1" }, @@ -115,20 +115,20 @@ } }, "@babel/helpers": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.4.4.tgz", - "integrity": "sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.5.5.tgz", + "integrity": "sha512-nRq2BUhxZFnfEn/ciJuhklHvFOqjJUD5wpx+1bxUF2axL9C+v4DE/dmp5sT2dKnpOs4orZWzpAZqlCy8QqE/7g==", "dev": true, "requires": { "@babel/template": "^7.4.4", - "@babel/traverse": "^7.4.4", - "@babel/types": "^7.4.4" + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5" } }, "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", "dev": true, "requires": { "chalk": "^2.0.0", @@ -137,9 +137,9 @@ } }, "@babel/parser": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", - "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", + "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==", "dev": true }, "@babel/plugin-syntax-object-rest-spread": { @@ -163,20 +163,20 @@ } }, "@babel/traverse": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz", - "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.4", + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", "@babel/helper-function-name": "^7.1.0", "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.4.5", - "@babel/types": "^7.4.4", + "@babel/parser": "^7.5.5", + "@babel/types": "^7.5.5", "debug": "^4.1.0", "globals": "^11.1.0", - "lodash": "^4.17.11" + "lodash": "^4.17.13" }, "dependencies": { "debug": { @@ -197,13 +197,13 @@ } }, "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", "dev": true, "requires": { "esutils": "^2.0.2", - "lodash": "^4.17.11", + "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } }, @@ -217,85 +217,120 @@ "minimist": "^1.2.0" } }, + "@hapi/address": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.0.0.tgz", + "integrity": "sha512-mV6T0IYqb0xL1UALPFplXYQmR0twnXG0M6jUswpquqT2sD12BOiCiLy3EvMp/Fy7s3DZElC4/aPjEjo2jeZpvw==" + }, + "@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==" + }, + "@hapi/hoek": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.2.1.tgz", + "integrity": "sha512-JPiBy+oSmsq3St7XlipfN5pNA6bDJ1kpa73PrK/zR29CVClDVqy04AanM/M/qx5bSF+I61DdCfAvRrujau+zRg==" + }, + "@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==", + "requires": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "@hapi/topo": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.3.tgz", + "integrity": "sha512-JmS9/vQK6dcUYn7wc2YZTqzIKubAQcJKu2KCKAru6es482U5RT5fP1EXCPtlXpiK7PR0On/kpQKI4fRKkzpZBQ==", + "requires": { + "@hapi/hoek": "8.x.x" + } + }, "@jest/console": { - "version": "24.7.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.7.1.tgz", - "integrity": "sha512-iNhtIy2M8bXlAOULWVTUxmnelTLFneTNEkHCgPmgd+zNwy9zVddJ6oS5rZ9iwoscNdT5mMwUd0C51v/fSlzItg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", "dev": true, "requires": { - "@jest/source-map": "^24.3.0", + "@jest/source-map": "^24.9.0", "chalk": "^2.0.1", "slash": "^2.0.0" } }, "@jest/core": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.8.0.tgz", - "integrity": "sha512-R9rhAJwCBQzaRnrRgAdVfnglUuATXdwTRsYqs6NMdVcAl5euG8LtWDe+fVkN27YfKVBW61IojVsXKaOmSnqd/A==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", + "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", "dev": true, "requires": { "@jest/console": "^24.7.1", - "@jest/reporters": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/reporters": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", "ansi-escapes": "^3.0.0", "chalk": "^2.0.1", "exit": "^0.1.2", "graceful-fs": "^4.1.15", - "jest-changed-files": "^24.8.0", - "jest-config": "^24.8.0", - "jest-haste-map": "^24.8.0", - "jest-message-util": "^24.8.0", + "jest-changed-files": "^24.9.0", + "jest-config": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-message-util": "^24.9.0", "jest-regex-util": "^24.3.0", - "jest-resolve-dependencies": "^24.8.0", - "jest-runner": "^24.8.0", - "jest-runtime": "^24.8.0", - "jest-snapshot": "^24.8.0", - "jest-util": "^24.8.0", - "jest-validate": "^24.8.0", - "jest-watcher": "^24.8.0", + "jest-resolve": "^24.9.0", + "jest-resolve-dependencies": "^24.9.0", + "jest-runner": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "jest-watcher": "^24.9.0", "micromatch": "^3.1.10", "p-each-series": "^1.0.0", - "pirates": "^4.0.1", "realpath-native": "^1.1.0", "rimraf": "^2.5.4", + "slash": "^2.0.0", "strip-ansi": "^5.0.0" } }, "@jest/environment": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.8.0.tgz", - "integrity": "sha512-vlGt2HLg7qM+vtBrSkjDxk9K0YtRBi7HfRFaDxoRtyi+DyVChzhF20duvpdAnKVBV6W5tym8jm0U9EfXbDk1tw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", + "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", "dev": true, "requires": { - "@jest/fake-timers": "^24.8.0", - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", - "jest-mock": "^24.8.0" + "@jest/fake-timers": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0" } }, "@jest/fake-timers": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.8.0.tgz", - "integrity": "sha512-2M4d5MufVXwi6VzZhJ9f5S/wU4ud2ck0kxPof1Iz3zWx6Y+V2eJrES9jEktB6O3o/oEyk+il/uNu9PvASjWXQw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", + "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", "dev": true, "requires": { - "@jest/types": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-mock": "^24.8.0" + "@jest/types": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0" } }, "@jest/reporters": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.8.0.tgz", - "integrity": "sha512-eZ9TyUYpyIIXfYCrw0UHUWUvE35vx5I92HGMgS93Pv7du+GHIzl+/vh8Qj9MCWFK/4TqyttVBPakWMOfZRIfxw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", + "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", "dev": true, "requires": { - "@jest/environment": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", "exit": "^0.1.2", "glob": "^7.1.2", @@ -303,22 +338,22 @@ "istanbul-lib-instrument": "^3.0.1", "istanbul-lib-report": "^2.0.4", "istanbul-lib-source-maps": "^3.0.1", - "istanbul-reports": "^2.1.1", - "jest-haste-map": "^24.8.0", - "jest-resolve": "^24.8.0", - "jest-runtime": "^24.8.0", - "jest-util": "^24.8.0", + "istanbul-reports": "^2.2.6", + "jest-haste-map": "^24.9.0", + "jest-resolve": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-util": "^24.9.0", "jest-worker": "^24.6.0", - "node-notifier": "^5.2.1", + "node-notifier": "^5.4.2", "slash": "^2.0.0", "source-map": "^0.6.0", "string-length": "^2.0.0" } }, "@jest/source-map": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.3.0.tgz", - "integrity": "sha512-zALZt1t2ou8le/crCeeiRYzvdnTzaIlpOWaet45lNSqNJUnXbppUUFR4ZUAlzgDmKee4Q5P/tKXypI1RiHwgag==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", "dev": true, "requires": { "callsites": "^3.0.0", @@ -327,45 +362,46 @@ } }, "@jest/test-result": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.8.0.tgz", - "integrity": "sha512-+YdLlxwizlfqkFDh7Mc7ONPQAhA4YylU1s529vVM1rsf67vGZH/2GGm5uO8QzPeVyaVMobCQ7FTxl38QrKRlng==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", "dev": true, "requires": { - "@jest/console": "^24.7.1", - "@jest/types": "^24.8.0", + "@jest/console": "^24.9.0", + "@jest/types": "^24.9.0", "@types/istanbul-lib-coverage": "^2.0.0" } }, "@jest/test-sequencer": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.8.0.tgz", - "integrity": "sha512-OzL/2yHyPdCHXEzhoBuq37CE99nkme15eHkAzXRVqthreWZamEMA0WoetwstsQBCXABhczpK03JNbc4L01vvLg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", + "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", "dev": true, "requires": { - "@jest/test-result": "^24.8.0", - "jest-haste-map": "^24.8.0", - "jest-runner": "^24.8.0", - "jest-runtime": "^24.8.0" + "@jest/test-result": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-runner": "^24.9.0", + "jest-runtime": "^24.9.0" } }, "@jest/transform": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.8.0.tgz", - "integrity": "sha512-xBMfFUP7TortCs0O+Xtez2W7Zu1PLH9bvJgtraN1CDST6LBM/eTOZ9SfwS/lvV8yOfcDpFmwf9bq5cYbXvqsvA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", + "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "babel-plugin-istanbul": "^5.1.0", "chalk": "^2.0.1", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.8.0", - "jest-regex-util": "^24.3.0", - "jest-util": "^24.8.0", + "jest-haste-map": "^24.9.0", + "jest-regex-util": "^24.9.0", + "jest-util": "^24.9.0", "micromatch": "^3.1.10", + "pirates": "^4.0.1", "realpath-native": "^1.1.0", "slash": "^2.0.0", "source-map": "^0.6.1", @@ -373,14 +409,14 @@ } }, "@jest/types": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.8.0.tgz", - "integrity": "sha512-g17UxVr2YfBtaMUxn9u/4+siG1ptg9IGYAYwvpwn61nBg779RXnjE/m7CxYcIzEt0AbHZZAHSEZNhkE2WxURVg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^12.0.9" + "@types/yargs": "^13.0.0" } }, "@types/babel__core": { @@ -456,15 +492,24 @@ "dev": true }, "@types/yargs": { - "version": "12.0.12", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-12.0.12.tgz", - "integrity": "sha512-SOhuU4wNBxhhTHxYaiG5NY4HBhDIDnJF60GU+2LqHAdKKer86//e4yg69aENCtQ04n0ovz+tq2YPME5t5yp4pw==", + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.2.tgz", + "integrity": "sha512-lwwgizwk/bIIU+3ELORkyuOgDjCh7zuWDFqRtPPhhVgq9N1F7CvLNKg1TX4f2duwtKQ0p044Au9r1PLIXHrIzQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-13.0.0.tgz", + "integrity": "sha512-wBlsw+8n21e6eTd4yVv8YD/E3xq0O6nNnJIquutAsFGE7EyMKz7W6RNT6BRu1SmdgmlCZ9tb0X+j+D6HGr8pZw==", "dev": true }, "abab": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", - "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.1.tgz", + "integrity": "sha512-1zSbbCuoIjafKZ3mblY5ikvAb0ODUbqBnFuUb7f6uLeQhhGJ0vEV4ntmtxKLT2WgXCO94E07BjunsIw1jOMPZw==", "dev": true }, "acorn": { @@ -474,9 +519,9 @@ "dev": true }, "acorn-globals": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.2.tgz", - "integrity": "sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.3.tgz", + "integrity": "sha512-vkR40VwS2SYO98AIeFvzWWh+xyc2qi9s7OoXSFEGIP/rOJKzjnhykaZJNnHdoq4BL2gGxI5EZOU16z896EYnOQ==", "dev": true, "requires": { "acorn": "^6.0.1", @@ -484,23 +529,23 @@ }, "dependencies": { "acorn": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", - "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", "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": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", "dev": true }, "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", "requires": { "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", @@ -595,9 +640,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": { @@ -622,48 +667,49 @@ "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" }, "babel-jest": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.8.0.tgz", - "integrity": "sha512-+5/kaZt4I9efoXzPlZASyK/lN9qdRKmmUav9smVc0ruPQD7IsfucQ87gpOE8mn2jbDuS6M/YOW6n3v9ZoIfgnw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", + "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", "dev": true, "requires": { - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", "@types/babel__core": "^7.1.0", "babel-plugin-istanbul": "^5.1.0", - "babel-preset-jest": "^24.6.0", + "babel-preset-jest": "^24.9.0", "chalk": "^2.4.2", "slash": "^2.0.0" } }, "babel-plugin-istanbul": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.4.tgz", - "integrity": "sha512-dySz4VJMH+dpndj0wjJ8JPs/7i1TdSPb1nRrn56/92pKOF9VKC1FMFJmMXjzlGGusnCAqujP6PBCiKq0sVA+YQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", + "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", "dev": true, "requires": { + "@babel/helper-plugin-utils": "^7.0.0", "find-up": "^3.0.0", "istanbul-lib-instrument": "^3.3.0", "test-exclude": "^5.2.3" } }, "babel-plugin-jest-hoist": { - "version": "24.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.6.0.tgz", - "integrity": "sha512-3pKNH6hMt9SbOv0F3WVmy5CWQ4uogS3k0GY5XLyQHJ9EGpAT9XWkFd2ZiXXtkwFHdAHa5j7w7kfxSP5lAIwu7w==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", + "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", "dev": true, "requires": { "@types/babel__traverse": "^7.0.6" } }, "babel-preset-jest": { - "version": "24.6.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.6.0.tgz", - "integrity": "sha512-pdZqLEdmy1ZK5kyRUfvBb2IfTPb2BUvIJczlPspS8fWmBQslNNDBqVfh7BW5leOVJMDZKzjD8XEyABTk6gQ5yw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", + "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", "dev": true, "requires": { "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^24.6.0" + "babel-plugin-jest-hoist": "^24.9.0" } }, "balanced-match": { @@ -798,9 +844,9 @@ } }, "bser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", - "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.0.tgz", + "integrity": "sha512-8zsjWrQkkBoLK6uxASk1nJ2SKv97ltiGDo6A3wA0/yRPz+CwmEyDo0hUrhIuukG2JHpAl3bvFIixw2/3Hi0DOg==", "dev": true, "requires": { "node-int64": "^0.4.0" @@ -896,31 +942,14 @@ } }, "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" } }, "co": { @@ -929,12 +958,6 @@ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -1032,15 +1055,15 @@ } }, "cssom": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.6.tgz", - "integrity": "sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", "dev": true }, "cssstyle": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.2.2.tgz", - "integrity": "sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", + "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", "dev": true, "requires": { "cssom": "0.3.x" @@ -1167,9 +1190,9 @@ "dev": true }, "diff-sequences": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.3.0.tgz", - "integrity": "sha512-xLqpez+Zj9GKSnPWS0WZw1igGocZ+uua8+y+5dDNTT934N3QuY1sp2LkHzwiaYQGz60hMq0pjAshdeXm5VUOEw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", + "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", "dev": true }, "domexception": { @@ -1190,6 +1213,12 @@ "safer-buffer": "^2.1.0" } }, + "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 + }, "end-of-stream": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", @@ -1240,9 +1269,9 @@ "dev": true }, "escodegen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", - "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz", + "integrity": "sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==", "dev": true, "requires": { "esprima": "^3.1.3", @@ -1259,15 +1288,15 @@ "dev": true }, "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, "exec-sh": { @@ -1333,17 +1362,17 @@ } }, "expect": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-24.8.0.tgz", - "integrity": "sha512-/zYvP8iMDrzaaxHVa724eJBCKqSHmO0FA7EDkBiRHxg6OipmMn1fN+C8T9L9K8yr7UONkOifu6+LLH+z76CnaA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", + "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", "dev": true, "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "ansi-styles": "^3.2.0", - "jest-get-type": "^24.8.0", - "jest-matcher-utils": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-regex-util": "^24.3.0" + "jest-get-type": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-regex-util": "^24.9.0" } }, "extend": { @@ -2096,9 +2125,9 @@ "dev": true }, "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, "get-stream": { @@ -2145,9 +2174,9 @@ "dev": true }, "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", "dev": true }, "growly": { @@ -2235,15 +2264,10 @@ } } }, - "hoek": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-5.0.4.tgz", - "integrity": "sha512-Alr4ZQgoMlnere5FZJsIyfIjORBqZll5POhDsF4q64dPuJR6rNxXdDxtHSQq8OXRurhmx+PWYEE8bXRROY8h0w==" - }, "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.4.tgz", + "integrity": "sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==", "dev": true }, "html-encoding-sniffer": { @@ -2315,12 +2339,6 @@ "loose-envify": "^1.0.0" } }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", @@ -2507,14 +2525,6 @@ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, - "isemail": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/isemail/-/isemail-3.2.0.tgz", - "integrity": "sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg==", - "requires": { - "punycode": "2.x.x" - } - }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -2554,9 +2564,9 @@ }, "dependencies": { "semver": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz", - "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } @@ -2623,215 +2633,216 @@ } }, "jest": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-24.8.0.tgz", - "integrity": "sha512-o0HM90RKFRNWmAWvlyV8i5jGZ97pFwkeVoGvPW1EtLTgJc2+jcuqcbbqcSZLE/3f2S5pt0y2ZBETuhpWNl1Reg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", + "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", "dev": true, "requires": { "import-local": "^2.0.0", - "jest-cli": "^24.8.0" + "jest-cli": "^24.9.0" }, "dependencies": { "jest-cli": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.8.0.tgz", - "integrity": "sha512-+p6J00jSMPQ116ZLlHJJvdf8wbjNbZdeSX9ptfHX06/MSNaXmKihQzx5vQcw0q2G6JsdVkUIdWbOWtSnaYs3yA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", + "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", "dev": true, "requires": { - "@jest/core": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/core": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", "exit": "^0.1.2", "import-local": "^2.0.0", "is-ci": "^2.0.0", - "jest-config": "^24.8.0", - "jest-util": "^24.8.0", - "jest-validate": "^24.8.0", + "jest-config": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", "prompts": "^2.0.1", "realpath-native": "^1.1.0", - "yargs": "^12.0.2" + "yargs": "^13.3.0" } } } }, "jest-changed-files": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.8.0.tgz", - "integrity": "sha512-qgANC1Yrivsq+UrLXsvJefBKVoCsKB0Hv+mBb6NMjjZ90wwxCDmU3hsCXBya30cH+LnPYjwgcU65i6yJ5Nfuug==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", + "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", "dev": true, "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "execa": "^1.0.0", "throat": "^4.0.0" } }, "jest-config": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.8.0.tgz", - "integrity": "sha512-Czl3Nn2uEzVGsOeaewGWoDPD8GStxCpAe0zOYs2x2l0fZAgPbCr3uwUkgNKV3LwE13VXythM946cd5rdGkkBZw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", + "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^24.8.0", - "@jest/types": "^24.8.0", - "babel-jest": "^24.8.0", + "@jest/test-sequencer": "^24.9.0", + "@jest/types": "^24.9.0", + "babel-jest": "^24.9.0", "chalk": "^2.0.1", "glob": "^7.1.1", - "jest-environment-jsdom": "^24.8.0", - "jest-environment-node": "^24.8.0", - "jest-get-type": "^24.8.0", - "jest-jasmine2": "^24.8.0", + "jest-environment-jsdom": "^24.9.0", + "jest-environment-node": "^24.9.0", + "jest-get-type": "^24.9.0", + "jest-jasmine2": "^24.9.0", "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.8.0", - "jest-util": "^24.8.0", - "jest-validate": "^24.8.0", + "jest-resolve": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", "micromatch": "^3.1.10", - "pretty-format": "^24.8.0", + "pretty-format": "^24.9.0", "realpath-native": "^1.1.0" } }, "jest-diff": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.8.0.tgz", - "integrity": "sha512-wxetCEl49zUpJ/bvUmIFjd/o52J+yWcoc5ZyPq4/W1LUKGEhRYDIbP1KcF6t+PvqNrGAFk4/JhtxDq/Nnzs66g==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", + "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", "dev": true, "requires": { "chalk": "^2.0.1", - "diff-sequences": "^24.3.0", - "jest-get-type": "^24.8.0", - "pretty-format": "^24.8.0" + "diff-sequences": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" } }, "jest-docblock": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.3.0.tgz", - "integrity": "sha512-nlANmF9Yq1dufhFlKG9rasfQlrY7wINJbo3q01tu56Jv5eBU5jirylhF2O5ZBnLxzOVBGRDz/9NAwNyBtG4Nyg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz", + "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==", "dev": true, "requires": { "detect-newline": "^2.1.0" } }, "jest-each": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.8.0.tgz", - "integrity": "sha512-NrwK9gaL5+XgrgoCsd9svsoWdVkK4gnvyhcpzd6m487tXHqIdYeykgq3MKI1u4I+5Zf0tofr70at9dWJDeb+BA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", + "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", "dev": true, "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", - "jest-get-type": "^24.8.0", - "jest-util": "^24.8.0", - "pretty-format": "^24.8.0" + "jest-get-type": "^24.9.0", + "jest-util": "^24.9.0", + "pretty-format": "^24.9.0" } }, "jest-environment-jsdom": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.8.0.tgz", - "integrity": "sha512-qbvgLmR7PpwjoFjM/sbuqHJt/NCkviuq9vus9NBn/76hhSidO+Z6Bn9tU8friecegbJL8gzZQEMZBQlFWDCwAQ==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", + "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", "dev": true, "requires": { - "@jest/environment": "^24.8.0", - "@jest/fake-timers": "^24.8.0", - "@jest/types": "^24.8.0", - "jest-mock": "^24.8.0", - "jest-util": "^24.8.0", + "@jest/environment": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-util": "^24.9.0", "jsdom": "^11.5.1" } }, "jest-environment-node": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.8.0.tgz", - "integrity": "sha512-vIGUEScd1cdDgR6sqn2M08sJTRLQp6Dk/eIkCeO4PFHxZMOgy+uYLPMC4ix3PEfM5Au/x3uQ/5Tl0DpXXZsJ/Q==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", + "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", "dev": true, "requires": { - "@jest/environment": "^24.8.0", - "@jest/fake-timers": "^24.8.0", - "@jest/types": "^24.8.0", - "jest-mock": "^24.8.0", - "jest-util": "^24.8.0" + "@jest/environment": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-util": "^24.9.0" } }, "jest-get-type": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.8.0.tgz", - "integrity": "sha512-RR4fo8jEmMD9zSz2nLbs2j0zvPpk/KCEz3a62jJWbd2ayNo0cb+KFRxPHVhE4ZmgGJEQp0fosmNz84IfqM8cMQ==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", "dev": true }, "jest-haste-map": { - "version": "24.8.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.8.1.tgz", - "integrity": "sha512-SwaxMGVdAZk3ernAx2Uv2sorA7jm3Kx+lR0grp6rMmnY06Kn/urtKx1LPN2mGTea4fCT38impYT28FfcLUhX0g==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", + "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", "dev": true, "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "anymatch": "^2.0.0", "fb-watchman": "^2.0.0", "fsevents": "^1.2.7", "graceful-fs": "^4.1.15", "invariant": "^2.2.4", - "jest-serializer": "^24.4.0", - "jest-util": "^24.8.0", - "jest-worker": "^24.6.0", + "jest-serializer": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.9.0", "micromatch": "^3.1.10", "sane": "^4.0.3", "walker": "^1.0.7" } }, "jest-jasmine2": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.8.0.tgz", - "integrity": "sha512-cEky88npEE5LKd5jPpTdDCLvKkdyklnaRycBXL6GNmpxe41F0WN44+i7lpQKa/hcbXaQ+rc9RMaM4dsebrYong==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", + "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", "co": "^4.6.0", - "expect": "^24.8.0", + "expect": "^24.9.0", "is-generator-fn": "^2.0.0", - "jest-each": "^24.8.0", - "jest-matcher-utils": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-runtime": "^24.8.0", - "jest-snapshot": "^24.8.0", - "jest-util": "^24.8.0", - "pretty-format": "^24.8.0", + "jest-each": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "pretty-format": "^24.9.0", "throat": "^4.0.0" } }, "jest-leak-detector": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.8.0.tgz", - "integrity": "sha512-cG0yRSK8A831LN8lIHxI3AblB40uhv0z+SsQdW3GoMMVcK+sJwrIIyax5tu3eHHNJ8Fu6IMDpnLda2jhn2pD/g==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", + "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", "dev": true, "requires": { - "pretty-format": "^24.8.0" + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" } }, "jest-matcher-utils": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.8.0.tgz", - "integrity": "sha512-lex1yASY51FvUuHgm0GOVj7DCYEouWSlIYmCW7APSqB9v8mXmKSn5+sWVF0MhuASG0bnYY106/49JU1FZNl5hw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", + "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", "dev": true, "requires": { "chalk": "^2.0.1", - "jest-diff": "^24.8.0", - "jest-get-type": "^24.8.0", - "pretty-format": "^24.8.0" + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" } }, "jest-message-util": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.8.0.tgz", - "integrity": "sha512-p2k71rf/b6ns8btdB0uVdljWo9h0ovpnEe05ZKWceQGfXYr4KkzgKo3PBi8wdnd9OtNh46VpNIJynUn/3MKm1g==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "@types/stack-utils": "^1.0.1", "chalk": "^2.0.1", "micromatch": "^3.1.10", @@ -2840,12 +2851,12 @@ } }, "jest-mock": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.8.0.tgz", - "integrity": "sha512-6kWugwjGjJw+ZkK4mDa0Df3sDlUTsV47MSrT0nGQ0RBWJbpODDQ8MHDVtGtUYBne3IwZUhtB7elxHspU79WH3A==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", + "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", "dev": true, "requires": { - "@jest/types": "^24.8.0" + "@jest/types": "^24.9.0" } }, "jest-pnp-resolver": { @@ -2855,18 +2866,18 @@ "dev": true }, "jest-regex-util": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.3.0.tgz", - "integrity": "sha512-tXQR1NEOyGlfylyEjg1ImtScwMq8Oh3iJbGTjN7p0J23EuVX1MA8rwU69K4sLbCmwzgCUbVkm0FkSF9TdzOhtg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", + "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", "dev": true }, "jest-resolve": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.8.0.tgz", - "integrity": "sha512-+hjSzi1PoRvnuOICoYd5V/KpIQmkAsfjFO71458hQ2Whi/yf1GDeBOFj8Gxw4LrApHsVJvn5fmjcPdmoUHaVKw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", + "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", "dev": true, "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "browser-resolve": "^1.11.3", "chalk": "^2.0.1", "jest-pnp-resolver": "^1.2.1", @@ -2874,111 +2885,120 @@ } }, "jest-resolve-dependencies": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.8.0.tgz", - "integrity": "sha512-hyK1qfIf/krV+fSNyhyJeq3elVMhK9Eijlwy+j5jqmZ9QsxwKBiP6qukQxaHtK8k6zql/KYWwCTQ+fDGTIJauw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz", + "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", "dev": true, "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "jest-regex-util": "^24.3.0", - "jest-snapshot": "^24.8.0" + "jest-snapshot": "^24.9.0" } }, "jest-runner": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.8.0.tgz", - "integrity": "sha512-utFqC5BaA3JmznbissSs95X1ZF+d+4WuOWwpM9+Ak356YtMhHE/GXUondZdcyAAOTBEsRGAgH/0TwLzfI9h7ow==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", + "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", "dev": true, "requires": { "@jest/console": "^24.7.1", - "@jest/environment": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "chalk": "^2.4.2", "exit": "^0.1.2", "graceful-fs": "^4.1.15", - "jest-config": "^24.8.0", + "jest-config": "^24.9.0", "jest-docblock": "^24.3.0", - "jest-haste-map": "^24.8.0", - "jest-jasmine2": "^24.8.0", - "jest-leak-detector": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-resolve": "^24.8.0", - "jest-runtime": "^24.8.0", - "jest-util": "^24.8.0", + "jest-haste-map": "^24.9.0", + "jest-jasmine2": "^24.9.0", + "jest-leak-detector": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-resolve": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-util": "^24.9.0", "jest-worker": "^24.6.0", "source-map-support": "^0.5.6", "throat": "^4.0.0" } }, "jest-runtime": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.8.0.tgz", - "integrity": "sha512-Mq0aIXhvO/3bX44ccT+czU1/57IgOMyy80oM0XR/nyD5zgBcesF84BPabZi39pJVA6UXw+fY2Q1N+4BiVUBWOA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", + "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", "dev": true, "requires": { "@jest/console": "^24.7.1", - "@jest/environment": "^24.8.0", + "@jest/environment": "^24.9.0", "@jest/source-map": "^24.3.0", - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", - "@types/yargs": "^12.0.2", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/yargs": "^13.0.0", "chalk": "^2.0.1", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.1.15", - "jest-config": "^24.8.0", - "jest-haste-map": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-mock": "^24.8.0", + "jest-config": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0", "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.8.0", - "jest-snapshot": "^24.8.0", - "jest-util": "^24.8.0", - "jest-validate": "^24.8.0", + "jest-resolve": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", "realpath-native": "^1.1.0", "slash": "^2.0.0", "strip-bom": "^3.0.0", - "yargs": "^12.0.2" + "yargs": "^13.3.0" } }, "jest-serializer": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.4.0.tgz", - "integrity": "sha512-k//0DtglVstc1fv+GY/VHDIjrtNjdYvYjMlbLUed4kxrE92sIUewOi5Hj3vrpB8CXfkJntRPDRjCrCvUhBdL8Q==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", + "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", "dev": true }, "jest-snapshot": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.8.0.tgz", - "integrity": "sha512-5ehtWoc8oU9/cAPe6fez6QofVJLBKyqkY2+TlKTOf0VllBB/mqUNdARdcjlZrs9F1Cv+/HKoCS/BknT0+tmfPg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", + "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", "dev": true, "requires": { "@babel/types": "^7.0.0", - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", - "expect": "^24.8.0", - "jest-diff": "^24.8.0", - "jest-matcher-utils": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-resolve": "^24.8.0", + "expect": "^24.9.0", + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-resolve": "^24.9.0", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "pretty-format": "^24.8.0", - "semver": "^5.5.0" + "pretty-format": "^24.9.0", + "semver": "^6.2.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 + } } }, "jest-util": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.8.0.tgz", - "integrity": "sha512-DYZeE+XyAnbNt0BG1OQqKy/4GVLPtzwGx5tsnDrFcax36rVE3lTA5fbvgmbVPUZf9w77AJ8otqR4VBbfFJkUZA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", + "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", "dev": true, "requires": { - "@jest/console": "^24.7.1", - "@jest/fake-timers": "^24.8.0", - "@jest/source-map": "^24.3.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/console": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/source-map": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "callsites": "^3.0.0", "chalk": "^2.0.1", "graceful-fs": "^4.1.15", @@ -2989,41 +3009,41 @@ } }, "jest-validate": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.8.0.tgz", - "integrity": "sha512-+/N7VOEMW1Vzsrk3UWBDYTExTPwf68tavEPKDnJzrC6UlHtUDU/fuEdXqFoHzv9XnQ+zW6X3qMZhJ3YexfeLDA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", + "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", "dev": true, "requires": { - "@jest/types": "^24.8.0", - "camelcase": "^5.0.0", + "@jest/types": "^24.9.0", + "camelcase": "^5.3.1", "chalk": "^2.0.1", - "jest-get-type": "^24.8.0", - "leven": "^2.1.0", - "pretty-format": "^24.8.0" + "jest-get-type": "^24.9.0", + "leven": "^3.1.0", + "pretty-format": "^24.9.0" } }, "jest-watcher": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.8.0.tgz", - "integrity": "sha512-SBjwHt5NedQoVu54M5GEx7cl7IGEFFznvd/HNT8ier7cCAx/Qgu9ZMlaTQkvK22G1YOpcWBLQPFSImmxdn3DAw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz", + "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", "dev": true, "requires": { - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", - "@types/yargs": "^12.0.9", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/yargs": "^13.0.0", "ansi-escapes": "^3.0.0", "chalk": "^2.0.1", - "jest-util": "^24.8.0", + "jest-util": "^24.9.0", "string-length": "^2.0.0" } }, "jest-worker": { - "version": "24.6.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.6.0.tgz", - "integrity": "sha512-jDwgW5W9qGNvpI1tNnvajh0a5IE/PuGLFmHk6aR/BZFz8tSgGw17GsDPXAJ6p91IvYDjOw8GpFbvvZGAK+DPQQ==", + "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": "^1.0.1", + "merge-stream": "^2.0.0", "supports-color": "^6.1.0" }, "dependencies": { @@ -3038,16 +3058,6 @@ } } }, - "joi": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-13.7.0.tgz", - "integrity": "sha512-xuY5VkHfeOYK3Hdi91ulocfuFopwgbSORmIwzcwHKESQhC7w1kD5jaVSPnqDxS2I8t3RZ9omCKAxNwXN5zG1/Q==", - "requires": { - "hoek": "5.x.x", - "isemail": "3.x.x", - "topo": "3.x.x" - } - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -3152,15 +3162,6 @@ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, "left-pad": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", @@ -3168,9 +3169,9 @@ "dev": true }, "leven": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", - "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "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": { @@ -3206,9 +3207,9 @@ } }, "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, "lodash.sortby": { @@ -3253,15 +3254,6 @@ "tmpl": "1.0.x" } }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -3277,25 +3269,11 @@ "object-visit": "^1.0.0" } }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - } - }, "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } + "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 }, "methods": { "version": "1.1.2", @@ -3343,12 +3321,6 @@ "mime-db": "1.40.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 - }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -3364,9 +3336,9 @@ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" }, "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "dev": true, "requires": { "for-in": "^1.0.2", @@ -3464,9 +3436,9 @@ "dev": true }, "node-notifier": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.0.tgz", - "integrity": "sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ==", + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", + "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", "dev": true, "requires": { "growly": "^1.3.0", @@ -3506,12 +3478,6 @@ "path-key": "^2.0.0" } }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, "nwsapi": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz", @@ -3637,23 +3603,6 @@ } } }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, "p-each-series": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", @@ -3669,16 +3618,10 @@ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true - }, "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "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" @@ -3808,12 +3751,12 @@ "dev": true }, "pretty-format": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.8.0.tgz", - "integrity": "sha512-P952T7dkrDEplsR+TuY7q3VXDae5Sr7zmQb12JU/NDQa/3CH7/QW0yvqLcGN6jL+zQFKaoJcPc+yJxMTGmosqw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", "dev": true, "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "ansi-regex": "^4.0.0", "ansi-styles": "^3.2.0", "react-is": "^16.8.4" @@ -3826,19 +3769,19 @@ "dev": true }, "prompts": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.1.0.tgz", - "integrity": "sha512-+x5TozgqYdOwWsQFZizE/Tra3fKvAoy037kOyU6cgz84n8f6zxngLOV4O32kTwt9FcLCxAqw0P/c8rOr9y+Gfg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.2.1.tgz", + "integrity": "sha512-VObPvJiWPhpZI6C5m60XOzTfnYg/xc/an+r9VYymj9WJW3B/DIH+REzjpAACPf8brwPeP+7vz3bIim3S+AaMjw==", "dev": true, "requires": { - "kleur": "^3.0.2", - "sisteransi": "^1.0.0" + "kleur": "^3.0.3", + "sisteransi": "^1.0.3" } }, "psl": { - "version": "1.1.32", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.32.tgz", - "integrity": "sha512-MHACAkHpihU/REGGPLj4sEfc/XKW2bheigvHO1dUqjaKigMp1C8+WLQYRGgeKFMsw5PMfegZcaN8IDXK/cD0+g==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.3.0.tgz", + "integrity": "sha512-avHdspHO+9rQTLbv1RO+MPYeP/SzsCoxofjVnHanETfQhTJrmB0HlDoW+EiN/R+C0BZ+gERab9NY0lPN2TxNag==" }, "pump": { "version": "3.0.0", @@ -3861,9 +3804,9 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, "react-is": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", - "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==", + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.9.0.tgz", + "integrity": "sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw==", "dev": true }, "read-pkg": { @@ -4015,9 +3958,9 @@ "dev": true }, "resolve": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz", - "integrity": "sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -4051,9 +3994,9 @@ "dev": true }, "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "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" @@ -4113,9 +4056,9 @@ "dev": true }, "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, "set-blocking": { @@ -4125,9 +4068,9 @@ "dev": true }, "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "dev": true, "requires": { "extend-shallow": "^2.0.1", @@ -4175,9 +4118,9 @@ "dev": true }, "sisteransi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.0.tgz", - "integrity": "sha512-N+z4pHB4AmUv0SjveWRd6q1Nj5w62m5jodv+GD8lvmbY/83T/rpbJGZOnK5T149OldDj4Db07BSv9xY4K6NTPQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.3.tgz", + "integrity": "sha512-SbEG75TzH8G7eVXFSN5f9EExILKfly7SUvVY5DhhYLvfhKqhDFY0OzevWa/zwak0RLRfWS5AvfMWpd9gJvr5Yg==", "dev": true }, "slash": { @@ -4319,9 +4262,9 @@ } }, "source-map-support": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", - "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -4361,9 +4304,9 @@ } }, "spdx-license-ids": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", - "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", "dev": true }, "split-string": { @@ -4452,30 +4395,14 @@ } }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { + "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } + "strip-ansi": "^5.1.0" } }, "string_decoder": { @@ -4640,21 +4567,6 @@ "repeat-string": "^1.6.1" } }, - "topo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/topo/-/topo-3.0.3.tgz", - "integrity": "sha512-IgpPtvD4kjrJ7CRA3ov2FhWQADwv+Tdqbsf1ZnPUSAtCJ9e1Z44MmoSGDXGk4IppoZA7jd/QRkNddlLJWlUZsQ==", - "requires": { - "hoek": "6.x.x" - }, - "dependencies": { - "hoek": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-6.1.3.tgz", - "integrity": "sha512-YXXAAhmF9zpQbC7LEcREFtXfGq5K1fmd+4PHkBq8NUqmzW3G+Dq10bI/i0KucLRwss3YYFQ0fSfoxBZYiGUqtQ==" - } - } - }, "tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -4714,38 +4626,15 @@ } }, "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "dev": true, "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } + "set-value": "^2.0.1" } }, "unset-value": { @@ -4825,9 +4714,9 @@ } }, "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" }, "validate-npm-package-license": { "version": "3.0.4", @@ -4859,12 +4748,12 @@ } }, "wait-on": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-3.2.0.tgz", - "integrity": "sha512-QUGNKlKLDyY6W/qHdxaRlXUAgLPe+3mLL/tRByHpRNcHs/c7dZXbu+OnJWGNux6tU1WFh/Z8aEwvbuzSAu79Zg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-3.3.0.tgz", + "integrity": "sha512-97dEuUapx4+Y12aknWZn7D25kkjMk16PbWoYzpSdA8bYpVfS6hpl2a2pOWZ3c+Tyt3/i4/pglyZctG3J4V1hWQ==", "requires": { - "core-js": "^2.5.7", - "joi": "^13.0.0", + "@hapi/joi": "^15.0.3", + "core-js": "^2.6.5", "minimist": "^1.2.0", "request": "^2.88.0", "rx": "^4.1.0" @@ -4933,50 +4822,14 @@ "dev": true }, "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "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 - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "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" - } - } + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" } }, "wrappy": { @@ -5018,37 +4871,27 @@ "dev": true }, "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", "dev": true, "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", + "cliui": "^5.0.0", "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", + "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", + "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^2.0.0", + "string-width": "^3.0.0", "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - }, - "dependencies": { - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - } + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" } }, "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", "dev": true, "requires": { "camelcase": "^5.0.0", diff --git a/transformation/integration-test/package.json b/transformation/integration-test/package.json index 0bf8dab36..238836a27 100644 --- a/transformation/integration-test/package.json +++ b/transformation/integration-test/package.json @@ -6,13 +6,13 @@ "test": "jest" }, "devDependencies": { - "jest": "^24.8.0", + "jest": "^24.9.0", "supertest": "^4.0.2" }, "jest": { "testEnvironment": "node" }, "dependencies": { - "wait-on": "^3.2.0" + "wait-on": "^3.3.0" } } diff --git a/transformation/package-lock.json b/transformation/package-lock.json index e5e949f63..31cf820fe 100644 --- a/transformation/package-lock.json +++ b/transformation/package-lock.json @@ -5,31 +5,31 @@ "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", "dev": true, "requires": { "@babel/highlight": "^7.0.0" } }, "@babel/core": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.5.tgz", - "integrity": "sha512-OvjIh6aqXtlsA8ujtGKfC7LYWksYSX8yQcM8Ay3LuvVeQ63lcOKgoZWVqcpFwkd29aYU9rVx7jxhfhiEDV9MZA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.5.5.tgz", + "integrity": "sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.4", - "@babel/helpers": "^7.4.4", - "@babel/parser": "^7.4.5", + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helpers": "^7.5.5", + "@babel/parser": "^7.5.5", "@babel/template": "^7.4.4", - "@babel/traverse": "^7.4.5", - "@babel/types": "^7.4.4", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5", "convert-source-map": "^1.1.0", "debug": "^4.1.0", "json5": "^2.1.0", - "lodash": "^4.17.11", + "lodash": "^4.17.13", "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" @@ -59,14 +59,14 @@ } }, "@babel/generator": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", - "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", "dev": true, "requires": { - "@babel/types": "^7.4.4", + "@babel/types": "^7.5.5", "jsesc": "^2.5.1", - "lodash": "^4.17.11", + "lodash": "^4.17.13", "source-map": "^0.5.0", "trim-right": "^1.0.1" }, @@ -115,20 +115,20 @@ } }, "@babel/helpers": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.4.4.tgz", - "integrity": "sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.5.5.tgz", + "integrity": "sha512-nRq2BUhxZFnfEn/ciJuhklHvFOqjJUD5wpx+1bxUF2axL9C+v4DE/dmp5sT2dKnpOs4orZWzpAZqlCy8QqE/7g==", "dev": true, "requires": { "@babel/template": "^7.4.4", - "@babel/traverse": "^7.4.4", - "@babel/types": "^7.4.4" + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5" } }, "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", "dev": true, "requires": { "chalk": "^2.0.0", @@ -137,9 +137,9 @@ } }, "@babel/parser": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", - "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", + "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==", "dev": true }, "@babel/plugin-syntax-object-rest-spread": { @@ -163,20 +163,20 @@ } }, "@babel/traverse": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz", - "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.4", + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", "@babel/helper-function-name": "^7.1.0", "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.4.5", - "@babel/types": "^7.4.4", + "@babel/parser": "^7.5.5", + "@babel/types": "^7.5.5", "debug": "^4.1.0", "globals": "^11.1.0", - "lodash": "^4.17.11" + "lodash": "^4.17.13" }, "dependencies": { "debug": { @@ -197,13 +197,13 @@ } }, "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", "dev": true, "requires": { "esutils": "^2.0.2", - "lodash": "^4.17.11", + "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } }, @@ -218,84 +218,102 @@ } }, "@jest/console": { - "version": "24.7.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.7.1.tgz", - "integrity": "sha512-iNhtIy2M8bXlAOULWVTUxmnelTLFneTNEkHCgPmgd+zNwy9zVddJ6oS5rZ9iwoscNdT5mMwUd0C51v/fSlzItg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", "dev": true, "requires": { - "@jest/source-map": "^24.3.0", + "@jest/source-map": "^24.9.0", "chalk": "^2.0.1", "slash": "^2.0.0" } }, "@jest/core": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.8.0.tgz", - "integrity": "sha512-R9rhAJwCBQzaRnrRgAdVfnglUuATXdwTRsYqs6NMdVcAl5euG8LtWDe+fVkN27YfKVBW61IojVsXKaOmSnqd/A==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", + "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", "dev": true, "requires": { "@jest/console": "^24.7.1", - "@jest/reporters": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/reporters": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", "ansi-escapes": "^3.0.0", "chalk": "^2.0.1", "exit": "^0.1.2", "graceful-fs": "^4.1.15", - "jest-changed-files": "^24.8.0", - "jest-config": "^24.8.0", - "jest-haste-map": "^24.8.0", - "jest-message-util": "^24.8.0", + "jest-changed-files": "^24.9.0", + "jest-config": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-message-util": "^24.9.0", "jest-regex-util": "^24.3.0", - "jest-resolve-dependencies": "^24.8.0", - "jest-runner": "^24.8.0", - "jest-runtime": "^24.8.0", - "jest-snapshot": "^24.8.0", - "jest-util": "^24.8.0", - "jest-validate": "^24.8.0", - "jest-watcher": "^24.8.0", + "jest-resolve": "^24.9.0", + "jest-resolve-dependencies": "^24.9.0", + "jest-runner": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "jest-watcher": "^24.9.0", "micromatch": "^3.1.10", "p-each-series": "^1.0.0", - "pirates": "^4.0.1", "realpath-native": "^1.1.0", "rimraf": "^2.5.4", + "slash": "^2.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" + } + } } }, "@jest/environment": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.8.0.tgz", - "integrity": "sha512-vlGt2HLg7qM+vtBrSkjDxk9K0YtRBi7HfRFaDxoRtyi+DyVChzhF20duvpdAnKVBV6W5tym8jm0U9EfXbDk1tw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", + "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", "dev": true, "requires": { - "@jest/fake-timers": "^24.8.0", - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", - "jest-mock": "^24.8.0" + "@jest/fake-timers": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0" } }, "@jest/fake-timers": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.8.0.tgz", - "integrity": "sha512-2M4d5MufVXwi6VzZhJ9f5S/wU4ud2ck0kxPof1Iz3zWx6Y+V2eJrES9jEktB6O3o/oEyk+il/uNu9PvASjWXQw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", + "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", "dev": true, "requires": { - "@jest/types": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-mock": "^24.8.0" + "@jest/types": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0" } }, "@jest/reporters": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.8.0.tgz", - "integrity": "sha512-eZ9TyUYpyIIXfYCrw0UHUWUvE35vx5I92HGMgS93Pv7du+GHIzl+/vh8Qj9MCWFK/4TqyttVBPakWMOfZRIfxw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", + "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", "dev": true, "requires": { - "@jest/environment": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", "exit": "^0.1.2", "glob": "^7.1.2", @@ -303,22 +321,22 @@ "istanbul-lib-instrument": "^3.0.1", "istanbul-lib-report": "^2.0.4", "istanbul-lib-source-maps": "^3.0.1", - "istanbul-reports": "^2.1.1", - "jest-haste-map": "^24.8.0", - "jest-resolve": "^24.8.0", - "jest-runtime": "^24.8.0", - "jest-util": "^24.8.0", + "istanbul-reports": "^2.2.6", + "jest-haste-map": "^24.9.0", + "jest-resolve": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-util": "^24.9.0", "jest-worker": "^24.6.0", - "node-notifier": "^5.2.1", + "node-notifier": "^5.4.2", "slash": "^2.0.0", "source-map": "^0.6.0", "string-length": "^2.0.0" } }, "@jest/source-map": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.3.0.tgz", - "integrity": "sha512-zALZt1t2ou8le/crCeeiRYzvdnTzaIlpOWaet45lNSqNJUnXbppUUFR4ZUAlzgDmKee4Q5P/tKXypI1RiHwgag==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", "dev": true, "requires": { "callsites": "^3.0.0", @@ -327,45 +345,46 @@ } }, "@jest/test-result": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.8.0.tgz", - "integrity": "sha512-+YdLlxwizlfqkFDh7Mc7ONPQAhA4YylU1s529vVM1rsf67vGZH/2GGm5uO8QzPeVyaVMobCQ7FTxl38QrKRlng==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", "dev": true, "requires": { - "@jest/console": "^24.7.1", - "@jest/types": "^24.8.0", + "@jest/console": "^24.9.0", + "@jest/types": "^24.9.0", "@types/istanbul-lib-coverage": "^2.0.0" } }, "@jest/test-sequencer": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.8.0.tgz", - "integrity": "sha512-OzL/2yHyPdCHXEzhoBuq37CE99nkme15eHkAzXRVqthreWZamEMA0WoetwstsQBCXABhczpK03JNbc4L01vvLg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", + "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", "dev": true, "requires": { - "@jest/test-result": "^24.8.0", - "jest-haste-map": "^24.8.0", - "jest-runner": "^24.8.0", - "jest-runtime": "^24.8.0" + "@jest/test-result": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-runner": "^24.9.0", + "jest-runtime": "^24.9.0" } }, "@jest/transform": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.8.0.tgz", - "integrity": "sha512-xBMfFUP7TortCs0O+Xtez2W7Zu1PLH9bvJgtraN1CDST6LBM/eTOZ9SfwS/lvV8yOfcDpFmwf9bq5cYbXvqsvA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", + "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "babel-plugin-istanbul": "^5.1.0", "chalk": "^2.0.1", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.8.0", - "jest-regex-util": "^24.3.0", - "jest-util": "^24.8.0", + "jest-haste-map": "^24.9.0", + "jest-regex-util": "^24.9.0", + "jest-util": "^24.9.0", "micromatch": "^3.1.10", + "pirates": "^4.0.1", "realpath-native": "^1.1.0", "slash": "^2.0.0", "source-map": "^0.6.1", @@ -373,14 +392,14 @@ } }, "@jest/types": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.8.0.tgz", - "integrity": "sha512-g17UxVr2YfBtaMUxn9u/4+siG1ptg9IGYAYwvpwn61nBg779RXnjE/m7CxYcIzEt0AbHZZAHSEZNhkE2WxURVg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^12.0.9" + "@types/yargs": "^13.0.0" } }, "@types/babel__core": { @@ -425,9 +444,9 @@ } }, "@types/body-parser": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.0.tgz", - "integrity": "sha512-a2+YeUjPkztKJu5aIF2yArYFQQp8d51wZ7DavSHjFuY1mqVgidGyzEQ41JIVNy82fXj8yPgy2vJmfIywgESW6w==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.1.tgz", + "integrity": "sha512-RoX2EZjMiFMjZh9lmYrwgoP9RTpAjSHiJxdp4oidAQVO02T7HER3xj9UKue5534ULWeqVEkujhWcyvUce+d68w==", "dev": true, "requires": { "@types/connect": "*", @@ -444,18 +463,18 @@ } }, "@types/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-GmK8AKu8i+s+EChK/uZ5IbrXPcPaQKWaNSGevDT/7o3gFObwSUQwqb1jMqxuo+YPvj0ckGzINI+EO7EHcmJjKg==", + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-invOmosX0DqbpA+cE2yoHGUlF/blyf7nB0OGYBBiH27crcVm5NmFaZkLP4Ta1hGaesckCi5lVLlydNJCxkTOSg==", "dev": true, "requires": { "@types/express": "*" } }, "@types/express": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.0.tgz", - "integrity": "sha512-CjaMu57cjgjuZbh9DpkloeGxV45CnMGlVd+XpG7Gm9QgVrd7KFq+X4HY0vM+2v0bczS48Wg7bvnMY5TN+Xmcfw==", + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.1.tgz", + "integrity": "sha512-VfH/XCP0QbQk5B5puLqTLEeFgR8lfCJHZJKkInZ9mkYd+u8byX0kztXEQxEk4wZXJs8HI+7km2ALXjn4YKcX9w==", "dev": true, "requires": { "@types/body-parser": "*", @@ -464,9 +483,9 @@ } }, "@types/express-serve-static-core": { - "version": "4.16.7", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.16.7.tgz", - "integrity": "sha512-847KvL8Q1y3TtFLRTXcVakErLJQgdpFSaq+k043xefz9raEf0C7HalpSY7OW5PyjCnY8P7bPW5t/Co9qqp+USg==", + "version": "4.16.9", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.16.9.tgz", + "integrity": "sha512-GqpaVWR0DM8FnRUJYKlWgyARoBUAVfRIeVDZQKOttLFp5SmhhF9YFIYeTPwMd/AXfxlP7xVO2dj1fGu0Q+krKQ==", "dev": true, "requires": { "@types/node": "*", @@ -474,9 +493,9 @@ } }, "@types/express-session": { - "version": "1.15.13", - "resolved": "https://registry.npmjs.org/@types/express-session/-/express-session-1.15.13.tgz", - "integrity": "sha512-BLRzO/ZfjTTLSRakUJxB0p5I5NmBHuyHkXDyh8sezdCMYxpqXrvMljKwle81I9AeCAzdq6nfz6qafmYLQ/rU9A==", + "version": "1.15.14", + "resolved": "https://registry.npmjs.org/@types/express-session/-/express-session-1.15.14.tgz", + "integrity": "sha512-7kVzFTT0Jy0zmUYDt9ik76XbcqyS9NalV4gn4eLwhk1nGQn+lS/HjPODhG3Oi/GBR2w1LQHUdkz/5KICYMACiw==", "dev": true, "requires": { "@types/express": "*", @@ -509,9 +528,9 @@ } }, "@types/jest": { - "version": "24.0.15", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.0.15.tgz", - "integrity": "sha512-MU1HIvWUme74stAoc3mgAi+aMlgKOudgEvQDIm1v4RkrDudBh1T+NFp5sftpBAdXdx1J0PbdpJ+M2EsSOi1djA==", + "version": "24.0.18", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.0.18.tgz", + "integrity": "sha512-jcDDXdjTcrQzdN06+TSVsPPqxvsZA/5QkYfIZlq1JMw7FdP5AZylbOc+6B/cuDurctRe+MziUMtQ3xQdrbjqyQ==", "dev": true, "requires": { "@types/jest-diff": "*" @@ -539,9 +558,9 @@ "dev": true }, "@types/node": { - "version": "12.0.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.0.10.tgz", - "integrity": "sha512-LcsGbPomWsad6wmMNv7nBLw7YYYyfdYcz6xryKYQhx89c3XXan+8Q6AJ43G5XDIaklaVkK3mE4fCb0SBvMiPSQ==", + "version": "12.7.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.2.tgz", + "integrity": "sha512-dyYO+f6ihZEtNPDcWNR1fkoTDf3zAK3lAABDze3mz6POyIercH0lEUawUFXlG8xaQZmm1yEBON/4TsYv/laDYg==", "dev": true }, "@types/range-parser": { @@ -551,9 +570,9 @@ "dev": true }, "@types/serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-/BZ4QRLpH/bNYgZgwhKEh+5AsboDBcUdlBYgzoLX0fpj3Y2gp6EApyOlM3bK53wQS/OE1SrdSYBAbux2D1528Q==", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.3.tgz", + "integrity": "sha512-oprSwp094zOglVrXdlo/4bAHtKTAxX6VT8FOZlBKrmyLbNvE1zxZyJ6yikMVtHIvwP45+ZQGJn+FdXGKTozq0g==", "dev": true, "requires": { "@types/express-serve-static-core": "*", @@ -567,15 +586,24 @@ "dev": true }, "@types/yargs": { - "version": "12.0.12", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-12.0.12.tgz", - "integrity": "sha512-SOhuU4wNBxhhTHxYaiG5NY4HBhDIDnJF60GU+2LqHAdKKer86//e4yg69aENCtQ04n0ovz+tq2YPME5t5yp4pw==", + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.2.tgz", + "integrity": "sha512-lwwgizwk/bIIU+3ELORkyuOgDjCh7zuWDFqRtPPhhVgq9N1F7CvLNKg1TX4f2duwtKQ0p044Au9r1PLIXHrIzQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-13.0.0.tgz", + "integrity": "sha512-wBlsw+8n21e6eTd4yVv8YD/E3xq0O6nNnJIquutAsFGE7EyMKz7W6RNT6BRu1SmdgmlCZ9tb0X+j+D6HGr8pZw==", "dev": true }, "abab": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", - "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.1.tgz", + "integrity": "sha512-1zSbbCuoIjafKZ3mblY5ikvAb0ODUbqBnFuUb7f6uLeQhhGJ0vEV4ntmtxKLT2WgXCO94E07BjunsIw1jOMPZw==", "dev": true }, "abbrev": { @@ -585,12 +613,12 @@ "dev": true }, "accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", "requires": { - "mime-types": "~2.1.18", - "negotiator": "0.6.1" + "mime-types": "~2.1.24", + "negotiator": "0.6.2" } }, "acorn": { @@ -600,9 +628,9 @@ "dev": true }, "acorn-globals": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.2.tgz", - "integrity": "sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.3.tgz", + "integrity": "sha512-vkR40VwS2SYO98AIeFvzWWh+xyc2qi9s7OoXSFEGIP/rOJKzjnhykaZJNnHdoq4BL2gGxI5EZOU16z896EYnOQ==", "dev": true, "requires": { "acorn": "^6.0.1", @@ -610,23 +638,23 @@ }, "dependencies": { "acorn": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", - "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", "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": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", "dev": true }, "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", "dev": true, "requires": { "fast-deep-equal": "^2.0.1", @@ -651,9 +679,9 @@ "dev": true }, "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, "ansi-styles": { @@ -754,9 +782,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": { @@ -784,48 +812,49 @@ "dev": true }, "babel-jest": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.8.0.tgz", - "integrity": "sha512-+5/kaZt4I9efoXzPlZASyK/lN9qdRKmmUav9smVc0ruPQD7IsfucQ87gpOE8mn2jbDuS6M/YOW6n3v9ZoIfgnw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", + "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", "dev": true, "requires": { - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", "@types/babel__core": "^7.1.0", "babel-plugin-istanbul": "^5.1.0", - "babel-preset-jest": "^24.6.0", + "babel-preset-jest": "^24.9.0", "chalk": "^2.4.2", "slash": "^2.0.0" } }, "babel-plugin-istanbul": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.4.tgz", - "integrity": "sha512-dySz4VJMH+dpndj0wjJ8JPs/7i1TdSPb1nRrn56/92pKOF9VKC1FMFJmMXjzlGGusnCAqujP6PBCiKq0sVA+YQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", + "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", "dev": true, "requires": { + "@babel/helper-plugin-utils": "^7.0.0", "find-up": "^3.0.0", "istanbul-lib-instrument": "^3.3.0", "test-exclude": "^5.2.3" } }, "babel-plugin-jest-hoist": { - "version": "24.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.6.0.tgz", - "integrity": "sha512-3pKNH6hMt9SbOv0F3WVmy5CWQ4uogS3k0GY5XLyQHJ9EGpAT9XWkFd2ZiXXtkwFHdAHa5j7w7kfxSP5lAIwu7w==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", + "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", "dev": true, "requires": { "@types/babel__traverse": "^7.0.6" } }, "babel-preset-jest": { - "version": "24.6.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.6.0.tgz", - "integrity": "sha512-pdZqLEdmy1ZK5kyRUfvBb2IfTPb2BUvIJczlPspS8fWmBQslNNDBqVfh7BW5leOVJMDZKzjD8XEyABTk6gQ5yw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", + "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", "dev": true, "requires": { "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^24.6.0" + "babel-plugin-jest-hoist": "^24.9.0" } }, "balanced-match": { @@ -910,20 +939,20 @@ "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" }, "body-parser": { - "version": "1.18.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", - "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", "requires": { - "bytes": "3.0.0", + "bytes": "3.1.0", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", - "http-errors": "~1.6.3", - "iconv-lite": "0.4.23", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.5.2", - "raw-body": "2.3.3", - "type-is": "~1.6.16" + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" } }, "boxen": { @@ -1041,9 +1070,9 @@ "dev": true }, "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" }, "cache-base": { "version": "1.0.1", @@ -1178,23 +1207,6 @@ "string-width": "^2.1.1", "strip-ansi": "^4.0.0", "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } } }, "co": { @@ -1263,20 +1275,20 @@ "dev": true }, "concurrently": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-4.1.1.tgz", - "integrity": "sha512-48+FE5RJ0qc8azwKv4keVQWlni1hZeSjcWr8shBelOBtBHcKj1aJFM9lHRiSc1x7lq416pkvsqfBMhSRja+Lhw==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-4.1.2.tgz", + "integrity": "sha512-Kim9SFrNr2jd8/0yNYqDTFALzUX1tvimmwFWxmp/D4mRI+kbqIIwE2RkBDrxS2ic25O1UgQMI5AtBqdtX3ynYg==", "dev": true, "requires": { - "chalk": "^2.4.1", - "date-fns": "^1.23.0", - "lodash": "^4.17.10", + "chalk": "^2.4.2", + "date-fns": "^1.30.1", + "lodash": "^4.17.15", "read-pkg": "^4.0.1", - "rxjs": "^6.3.3", + "rxjs": "^6.5.2", "spawn-command": "^0.0.2-1", "supports-color": "^4.5.0", - "tree-kill": "^1.1.0", - "yargs": "^12.0.1" + "tree-kill": "^1.2.1", + "yargs": "^12.0.5" }, "dependencies": { "has-flag": { @@ -1285,17 +1297,6 @@ "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", "dev": true }, - "read-pkg": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", - "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", - "dev": true, - "requires": { - "normalize-package-data": "^2.3.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0" - } - }, "supports-color": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", @@ -1333,9 +1334,12 @@ } }, "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } }, "content-type": { "version": "1.0.4", @@ -1352,9 +1356,9 @@ } }, "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" }, "cookie-signature": { "version": "1.0.6", @@ -1382,11 +1386,6 @@ "vary": "^1" } }, - "crc": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.4.4.tgz", - "integrity": "sha1-naHpgOO9RPxck79as9ozeNheRms=" - }, "create-error-class": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", @@ -1416,15 +1415,15 @@ "dev": true }, "cssom": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.6.tgz", - "integrity": "sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", "dev": true }, "cssstyle": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.2.2.tgz", - "integrity": "sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", + "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", "dev": true, "requires": { "cssom": "0.3.x" @@ -1574,9 +1573,9 @@ "dev": true }, "diff-sequences": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.3.0.tgz", - "integrity": "sha512-xLqpez+Zj9GKSnPWS0WZw1igGocZ+uua8+y+5dDNTT934N3QuY1sp2LkHzwiaYQGz60hMq0pjAshdeXm5VUOEw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", + "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", "dev": true }, "domexception": { @@ -1619,9 +1618,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "elliptic": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", - "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.0.tgz", + "integrity": "sha512-eFOJTMyCYb7xtE/caJ6JJu+bhi67WCYNbkGSknu20pmM8Ke/bqOfdnZWxyoGN26JgfxTbXrsCkEw4KheCT/KGg==", "requires": { "bn.js": "^4.4.0", "brorand": "^1.0.1", @@ -1632,6 +1631,12 @@ "minimalistic-crypto-utils": "^1.0.0" } }, + "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 + }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -1692,9 +1697,9 @@ "dev": true }, "escodegen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", - "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz", + "integrity": "sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==", "dev": true, "requires": { "esprima": "^3.1.3", @@ -1711,15 +1716,15 @@ "dev": true }, "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, "etag": { @@ -1790,77 +1795,81 @@ } }, "expect": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-24.8.0.tgz", - "integrity": "sha512-/zYvP8iMDrzaaxHVa724eJBCKqSHmO0FA7EDkBiRHxg6OipmMn1fN+C8T9L9K8yr7UONkOifu6+LLH+z76CnaA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", + "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", "dev": true, "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "ansi-styles": "^3.2.0", - "jest-get-type": "^24.8.0", - "jest-matcher-utils": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-regex-util": "^24.3.0" + "jest-get-type": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-regex-util": "^24.9.0" } }, "express": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", - "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", "requires": { - "accepts": "~1.3.5", + "accepts": "~1.3.7", "array-flatten": "1.1.1", - "body-parser": "1.18.3", - "content-disposition": "0.5.2", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", "content-type": "~1.0.4", - "cookie": "0.3.1", + "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.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.2", + "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.4", - "qs": "6.5.2", - "range-parser": "~1.2.0", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", "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", + "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": { - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" - } } }, "express-session": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.15.6.tgz", - "integrity": "sha512-r0nrHTCYtAMrFwZ0kBzZEXa1vtPVrw0dKvGSrKP4dahwBQ1BJpF2/y1Pp4sCD/0kvxV4zZeclyvfmw0B4RMJQA==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.16.2.tgz", + "integrity": "sha512-oy0sRsdw6n93E9wpCNWKRnSsxYnSDX9Dnr9mhZgqUEEorzcq5nshGYSZ4ZReHFhKQ80WI5iVUUSPW7u3GaKauw==", "requires": { "cookie": "0.3.1", "cookie-signature": "1.0.6", - "crc": "3.4.4", "debug": "2.6.9", - "depd": "~1.1.1", - "on-headers": "~1.0.1", - "parseurl": "~1.3.2", - "uid-safe": "~2.1.5", - "utils-merge": "1.0.1" + "depd": "~2.0.0", + "on-headers": "~1.0.2", + "parseurl": "~1.3.3", + "safe-buffer": "5.1.2", + "uid-safe": "~2.1.5" + }, + "dependencies": { + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + } } }, "extend": { @@ -2012,24 +2021,17 @@ } }, "finalhandler": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", - "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "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", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", "unpipe": "~1.0.0" - }, - "dependencies": { - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" - } } }, "find-up": { @@ -2863,9 +2865,9 @@ } }, "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.4.tgz", + "integrity": "sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==", "dev": true }, "html-encoding-sniffer": { @@ -2878,14 +2880,15 @@ } }, "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=", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", "requires": { "depd": "~1.1.2", "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" } }, "http-signature": { @@ -2900,9 +2903,9 @@ } }, "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -2972,9 +2975,9 @@ "dev": true }, "ipaddr.js": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", - "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" + "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==" }, "is-accessor-descriptor": { "version": "0.1.6", @@ -3270,9 +3273,9 @@ }, "dependencies": { "semver": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.2.tgz", - "integrity": "sha512-z4PqiCpomGtWj8633oeAdXm1Kn1W++3T8epkZYnwiVgIYIJ0QHszhInYSJTYxebByQH7KVCEAn8R9duzZW2PhQ==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } @@ -3339,215 +3342,304 @@ } }, "jest": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-24.8.0.tgz", - "integrity": "sha512-o0HM90RKFRNWmAWvlyV8i5jGZ97pFwkeVoGvPW1EtLTgJc2+jcuqcbbqcSZLE/3f2S5pt0y2ZBETuhpWNl1Reg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", + "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", "dev": true, "requires": { "import-local": "^2.0.0", - "jest-cli": "^24.8.0" + "jest-cli": "^24.9.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 + }, + "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" + } + }, + "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 + }, "jest-cli": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.8.0.tgz", - "integrity": "sha512-+p6J00jSMPQ116ZLlHJJvdf8wbjNbZdeSX9ptfHX06/MSNaXmKihQzx5vQcw0q2G6JsdVkUIdWbOWtSnaYs3yA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", + "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", "dev": true, "requires": { - "@jest/core": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/core": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", "exit": "^0.1.2", "import-local": "^2.0.0", "is-ci": "^2.0.0", - "jest-config": "^24.8.0", - "jest-util": "^24.8.0", - "jest-validate": "^24.8.0", + "jest-config": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", "prompts": "^2.0.1", "realpath-native": "^1.1.0", - "yargs": "^12.0.2" + "yargs": "^13.3.0" + } + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "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" + } + }, + "yargs": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "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.1" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } }, "jest-changed-files": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.8.0.tgz", - "integrity": "sha512-qgANC1Yrivsq+UrLXsvJefBKVoCsKB0Hv+mBb6NMjjZ90wwxCDmU3hsCXBya30cH+LnPYjwgcU65i6yJ5Nfuug==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", + "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", "dev": true, "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "execa": "^1.0.0", "throat": "^4.0.0" } }, "jest-config": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.8.0.tgz", - "integrity": "sha512-Czl3Nn2uEzVGsOeaewGWoDPD8GStxCpAe0zOYs2x2l0fZAgPbCr3uwUkgNKV3LwE13VXythM946cd5rdGkkBZw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", + "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^24.8.0", - "@jest/types": "^24.8.0", - "babel-jest": "^24.8.0", + "@jest/test-sequencer": "^24.9.0", + "@jest/types": "^24.9.0", + "babel-jest": "^24.9.0", "chalk": "^2.0.1", "glob": "^7.1.1", - "jest-environment-jsdom": "^24.8.0", - "jest-environment-node": "^24.8.0", - "jest-get-type": "^24.8.0", - "jest-jasmine2": "^24.8.0", + "jest-environment-jsdom": "^24.9.0", + "jest-environment-node": "^24.9.0", + "jest-get-type": "^24.9.0", + "jest-jasmine2": "^24.9.0", "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.8.0", - "jest-util": "^24.8.0", - "jest-validate": "^24.8.0", + "jest-resolve": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", "micromatch": "^3.1.10", - "pretty-format": "^24.8.0", + "pretty-format": "^24.9.0", "realpath-native": "^1.1.0" } }, "jest-diff": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.8.0.tgz", - "integrity": "sha512-wxetCEl49zUpJ/bvUmIFjd/o52J+yWcoc5ZyPq4/W1LUKGEhRYDIbP1KcF6t+PvqNrGAFk4/JhtxDq/Nnzs66g==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", + "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", "dev": true, "requires": { "chalk": "^2.0.1", - "diff-sequences": "^24.3.0", - "jest-get-type": "^24.8.0", - "pretty-format": "^24.8.0" + "diff-sequences": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" } }, "jest-docblock": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.3.0.tgz", - "integrity": "sha512-nlANmF9Yq1dufhFlKG9rasfQlrY7wINJbo3q01tu56Jv5eBU5jirylhF2O5ZBnLxzOVBGRDz/9NAwNyBtG4Nyg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz", + "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==", "dev": true, "requires": { "detect-newline": "^2.1.0" } }, "jest-each": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.8.0.tgz", - "integrity": "sha512-NrwK9gaL5+XgrgoCsd9svsoWdVkK4gnvyhcpzd6m487tXHqIdYeykgq3MKI1u4I+5Zf0tofr70at9dWJDeb+BA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", + "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", "dev": true, "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", - "jest-get-type": "^24.8.0", - "jest-util": "^24.8.0", - "pretty-format": "^24.8.0" + "jest-get-type": "^24.9.0", + "jest-util": "^24.9.0", + "pretty-format": "^24.9.0" } }, "jest-environment-jsdom": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.8.0.tgz", - "integrity": "sha512-qbvgLmR7PpwjoFjM/sbuqHJt/NCkviuq9vus9NBn/76hhSidO+Z6Bn9tU8friecegbJL8gzZQEMZBQlFWDCwAQ==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", + "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", "dev": true, "requires": { - "@jest/environment": "^24.8.0", - "@jest/fake-timers": "^24.8.0", - "@jest/types": "^24.8.0", - "jest-mock": "^24.8.0", - "jest-util": "^24.8.0", + "@jest/environment": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-util": "^24.9.0", "jsdom": "^11.5.1" } }, "jest-environment-node": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.8.0.tgz", - "integrity": "sha512-vIGUEScd1cdDgR6sqn2M08sJTRLQp6Dk/eIkCeO4PFHxZMOgy+uYLPMC4ix3PEfM5Au/x3uQ/5Tl0DpXXZsJ/Q==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", + "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", "dev": true, "requires": { - "@jest/environment": "^24.8.0", - "@jest/fake-timers": "^24.8.0", - "@jest/types": "^24.8.0", - "jest-mock": "^24.8.0", - "jest-util": "^24.8.0" + "@jest/environment": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-util": "^24.9.0" } }, "jest-get-type": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.8.0.tgz", - "integrity": "sha512-RR4fo8jEmMD9zSz2nLbs2j0zvPpk/KCEz3a62jJWbd2ayNo0cb+KFRxPHVhE4ZmgGJEQp0fosmNz84IfqM8cMQ==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", "dev": true }, "jest-haste-map": { - "version": "24.8.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.8.1.tgz", - "integrity": "sha512-SwaxMGVdAZk3ernAx2Uv2sorA7jm3Kx+lR0grp6rMmnY06Kn/urtKx1LPN2mGTea4fCT38impYT28FfcLUhX0g==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", + "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", "dev": true, "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "anymatch": "^2.0.0", "fb-watchman": "^2.0.0", "fsevents": "^1.2.7", "graceful-fs": "^4.1.15", "invariant": "^2.2.4", - "jest-serializer": "^24.4.0", - "jest-util": "^24.8.0", - "jest-worker": "^24.6.0", + "jest-serializer": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.9.0", "micromatch": "^3.1.10", "sane": "^4.0.3", "walker": "^1.0.7" } }, "jest-jasmine2": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.8.0.tgz", - "integrity": "sha512-cEky88npEE5LKd5jPpTdDCLvKkdyklnaRycBXL6GNmpxe41F0WN44+i7lpQKa/hcbXaQ+rc9RMaM4dsebrYong==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", + "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", "co": "^4.6.0", - "expect": "^24.8.0", + "expect": "^24.9.0", "is-generator-fn": "^2.0.0", - "jest-each": "^24.8.0", - "jest-matcher-utils": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-runtime": "^24.8.0", - "jest-snapshot": "^24.8.0", - "jest-util": "^24.8.0", - "pretty-format": "^24.8.0", + "jest-each": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "pretty-format": "^24.9.0", "throat": "^4.0.0" } }, "jest-leak-detector": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.8.0.tgz", - "integrity": "sha512-cG0yRSK8A831LN8lIHxI3AblB40uhv0z+SsQdW3GoMMVcK+sJwrIIyax5tu3eHHNJ8Fu6IMDpnLda2jhn2pD/g==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", + "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", "dev": true, "requires": { - "pretty-format": "^24.8.0" + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" } }, "jest-matcher-utils": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.8.0.tgz", - "integrity": "sha512-lex1yASY51FvUuHgm0GOVj7DCYEouWSlIYmCW7APSqB9v8mXmKSn5+sWVF0MhuASG0bnYY106/49JU1FZNl5hw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", + "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", "dev": true, "requires": { "chalk": "^2.0.1", - "jest-diff": "^24.8.0", - "jest-get-type": "^24.8.0", - "pretty-format": "^24.8.0" + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" } }, "jest-message-util": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.8.0.tgz", - "integrity": "sha512-p2k71rf/b6ns8btdB0uVdljWo9h0ovpnEe05ZKWceQGfXYr4KkzgKo3PBi8wdnd9OtNh46VpNIJynUn/3MKm1g==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "@types/stack-utils": "^1.0.1", "chalk": "^2.0.1", "micromatch": "^3.1.10", @@ -3556,12 +3648,12 @@ } }, "jest-mock": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.8.0.tgz", - "integrity": "sha512-6kWugwjGjJw+ZkK4mDa0Df3sDlUTsV47MSrT0nGQ0RBWJbpODDQ8MHDVtGtUYBne3IwZUhtB7elxHspU79WH3A==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", + "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", "dev": true, "requires": { - "@jest/types": "^24.8.0" + "@jest/types": "^24.9.0" } }, "jest-pnp-resolver": { @@ -3571,18 +3663,18 @@ "dev": true }, "jest-regex-util": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.3.0.tgz", - "integrity": "sha512-tXQR1NEOyGlfylyEjg1ImtScwMq8Oh3iJbGTjN7p0J23EuVX1MA8rwU69K4sLbCmwzgCUbVkm0FkSF9TdzOhtg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", + "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", "dev": true }, "jest-resolve": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.8.0.tgz", - "integrity": "sha512-+hjSzi1PoRvnuOICoYd5V/KpIQmkAsfjFO71458hQ2Whi/yf1GDeBOFj8Gxw4LrApHsVJvn5fmjcPdmoUHaVKw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", + "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", "dev": true, "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "browser-resolve": "^1.11.3", "chalk": "^2.0.1", "jest-pnp-resolver": "^1.2.1", @@ -3590,111 +3682,210 @@ } }, "jest-resolve-dependencies": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.8.0.tgz", - "integrity": "sha512-hyK1qfIf/krV+fSNyhyJeq3elVMhK9Eijlwy+j5jqmZ9QsxwKBiP6qukQxaHtK8k6zql/KYWwCTQ+fDGTIJauw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz", + "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", "dev": true, "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "jest-regex-util": "^24.3.0", - "jest-snapshot": "^24.8.0" + "jest-snapshot": "^24.9.0" } }, "jest-runner": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.8.0.tgz", - "integrity": "sha512-utFqC5BaA3JmznbissSs95X1ZF+d+4WuOWwpM9+Ak356YtMhHE/GXUondZdcyAAOTBEsRGAgH/0TwLzfI9h7ow==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", + "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", "dev": true, "requires": { "@jest/console": "^24.7.1", - "@jest/environment": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "chalk": "^2.4.2", "exit": "^0.1.2", "graceful-fs": "^4.1.15", - "jest-config": "^24.8.0", + "jest-config": "^24.9.0", "jest-docblock": "^24.3.0", - "jest-haste-map": "^24.8.0", - "jest-jasmine2": "^24.8.0", - "jest-leak-detector": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-resolve": "^24.8.0", - "jest-runtime": "^24.8.0", - "jest-util": "^24.8.0", + "jest-haste-map": "^24.9.0", + "jest-jasmine2": "^24.9.0", + "jest-leak-detector": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-resolve": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-util": "^24.9.0", "jest-worker": "^24.6.0", "source-map-support": "^0.5.6", "throat": "^4.0.0" } }, "jest-runtime": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.8.0.tgz", - "integrity": "sha512-Mq0aIXhvO/3bX44ccT+czU1/57IgOMyy80oM0XR/nyD5zgBcesF84BPabZi39pJVA6UXw+fY2Q1N+4BiVUBWOA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", + "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", "dev": true, "requires": { "@jest/console": "^24.7.1", - "@jest/environment": "^24.8.0", + "@jest/environment": "^24.9.0", "@jest/source-map": "^24.3.0", - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", - "@types/yargs": "^12.0.2", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/yargs": "^13.0.0", "chalk": "^2.0.1", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.1.15", - "jest-config": "^24.8.0", - "jest-haste-map": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-mock": "^24.8.0", + "jest-config": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0", "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.8.0", - "jest-snapshot": "^24.8.0", - "jest-util": "^24.8.0", - "jest-validate": "^24.8.0", + "jest-resolve": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", "realpath-native": "^1.1.0", "slash": "^2.0.0", "strip-bom": "^3.0.0", - "yargs": "^12.0.2" + "yargs": "^13.3.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 + }, + "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" + } + }, + "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 + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "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" + } + }, + "yargs": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "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.1" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } } }, "jest-serializer": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.4.0.tgz", - "integrity": "sha512-k//0DtglVstc1fv+GY/VHDIjrtNjdYvYjMlbLUed4kxrE92sIUewOi5Hj3vrpB8CXfkJntRPDRjCrCvUhBdL8Q==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", + "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", "dev": true }, "jest-snapshot": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.8.0.tgz", - "integrity": "sha512-5ehtWoc8oU9/cAPe6fez6QofVJLBKyqkY2+TlKTOf0VllBB/mqUNdARdcjlZrs9F1Cv+/HKoCS/BknT0+tmfPg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", + "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", "dev": true, "requires": { "@babel/types": "^7.0.0", - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", - "expect": "^24.8.0", - "jest-diff": "^24.8.0", - "jest-matcher-utils": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-resolve": "^24.8.0", + "expect": "^24.9.0", + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-resolve": "^24.9.0", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "pretty-format": "^24.8.0", - "semver": "^5.5.0" + "pretty-format": "^24.9.0", + "semver": "^6.2.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 + } } }, "jest-util": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.8.0.tgz", - "integrity": "sha512-DYZeE+XyAnbNt0BG1OQqKy/4GVLPtzwGx5tsnDrFcax36rVE3lTA5fbvgmbVPUZf9w77AJ8otqR4VBbfFJkUZA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", + "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", "dev": true, "requires": { - "@jest/console": "^24.7.1", - "@jest/fake-timers": "^24.8.0", - "@jest/source-map": "^24.3.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/console": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/source-map": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "callsites": "^3.0.0", "chalk": "^2.0.1", "graceful-fs": "^4.1.15", @@ -3705,41 +3896,41 @@ } }, "jest-validate": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.8.0.tgz", - "integrity": "sha512-+/N7VOEMW1Vzsrk3UWBDYTExTPwf68tavEPKDnJzrC6UlHtUDU/fuEdXqFoHzv9XnQ+zW6X3qMZhJ3YexfeLDA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", + "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", "dev": true, "requires": { - "@jest/types": "^24.8.0", - "camelcase": "^5.0.0", + "@jest/types": "^24.9.0", + "camelcase": "^5.3.1", "chalk": "^2.0.1", - "jest-get-type": "^24.8.0", - "leven": "^2.1.0", - "pretty-format": "^24.8.0" + "jest-get-type": "^24.9.0", + "leven": "^3.1.0", + "pretty-format": "^24.9.0" } }, "jest-watcher": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.8.0.tgz", - "integrity": "sha512-SBjwHt5NedQoVu54M5GEx7cl7IGEFFznvd/HNT8ier7cCAx/Qgu9ZMlaTQkvK22G1YOpcWBLQPFSImmxdn3DAw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz", + "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", "dev": true, "requires": { - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", - "@types/yargs": "^12.0.9", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/yargs": "^13.0.0", "ansi-escapes": "^3.0.0", "chalk": "^2.0.1", - "jest-util": "^24.8.0", + "jest-util": "^24.9.0", "string-length": "^2.0.0" } }, "jest-worker": { - "version": "24.6.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.6.0.tgz", - "integrity": "sha512-jDwgW5W9qGNvpI1tNnvajh0a5IE/PuGLFmHk6aR/BZFz8tSgGw17GsDPXAJ6p91IvYDjOw8GpFbvvZGAK+DPQQ==", + "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": "^1.0.1", + "merge-stream": "^2.0.0", "supports-color": "^6.1.0" }, "dependencies": { @@ -3862,9 +4053,9 @@ } }, "keycloak-connect": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/keycloak-connect/-/keycloak-connect-5.0.0.tgz", - "integrity": "sha512-9SDZc6bbNzWY1di1qEQAW4RY94t/z6hWvkj6RNro3sWV3PSuT/DNXsCyfZpEJlj5Vz60w8p496HuNdMyqsV7AQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/keycloak-connect/-/keycloak-connect-7.0.0.tgz", + "integrity": "sha512-zKwv+yS8rt8lHiRhi8Cv/9oJ7IwqR07Hj9VXH/RqszfVovyCbit1Q3/x03VEuoPnKHE4xyQq0K+w+5yGsCV+og==", "requires": { "jwk-to-pem": "^2.0.0" } @@ -3906,9 +4097,9 @@ "dev": true }, "leven": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", - "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "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": { @@ -3944,9 +4135,9 @@ } }, "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, "lodash.sortby": { @@ -4059,13 +4250,10 @@ "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } + "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 }, "methods": { "version": "1.1.2", @@ -4094,21 +4282,21 @@ } }, "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "mime-db": { - "version": "1.37.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", - "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" }, "mime-types": { - "version": "2.1.21", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", - "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", "requires": { - "mime-db": "~1.37.0" + "mime-db": "1.40.0" } }, "mimic-fn": { @@ -4218,9 +4406,9 @@ "dev": true }, "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, "neo-async": { "version": "2.6.1", @@ -4247,9 +4435,9 @@ "dev": true }, "node-notifier": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.0.tgz", - "integrity": "sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ==", + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", + "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", "dev": true, "requires": { "growly": "^1.3.0", @@ -4522,9 +4710,9 @@ "dev": true }, "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "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" @@ -4580,9 +4768,9 @@ "dev": true }, "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, "pascalcase": { "version": "0.1.1", @@ -4695,15 +4883,23 @@ "dev": true }, "pretty-format": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.8.0.tgz", - "integrity": "sha512-P952T7dkrDEplsR+TuY7q3VXDae5Sr7zmQb12JU/NDQa/3CH7/QW0yvqLcGN6jL+zQFKaoJcPc+yJxMTGmosqw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", "dev": true, "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "ansi-regex": "^4.0.0", "ansi-styles": "^3.2.0", "react-is": "^16.8.4" + }, + "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 + } } }, "process-nextick-args": { @@ -4713,22 +4909,22 @@ "dev": true }, "prompts": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.1.0.tgz", - "integrity": "sha512-+x5TozgqYdOwWsQFZizE/Tra3fKvAoy037kOyU6cgz84n8f6zxngLOV4O32kTwt9FcLCxAqw0P/c8rOr9y+Gfg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.2.1.tgz", + "integrity": "sha512-VObPvJiWPhpZI6C5m60XOzTfnYg/xc/an+r9VYymj9WJW3B/DIH+REzjpAACPf8brwPeP+7vz3bIim3S+AaMjw==", "dev": true, "requires": { - "kleur": "^3.0.2", - "sisteransi": "^1.0.0" + "kleur": "^3.0.3", + "sisteransi": "^1.0.3" } }, "proxy-addr": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", - "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", + "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==", "requires": { "forwarded": "~0.1.2", - "ipaddr.js": "1.8.0" + "ipaddr.js": "1.9.0" } }, "pseudomap": { @@ -4738,9 +4934,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.3.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.3.0.tgz", + "integrity": "sha512-avHdspHO+9rQTLbv1RO+MPYeP/SzsCoxofjVnHanETfQhTJrmB0HlDoW+EiN/R+C0BZ+gERab9NY0lPN2TxNag==", "dev": true }, "pstree.remy": { @@ -4766,9 +4962,9 @@ "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==" + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" }, "random-bytes": { "version": "1.0.0", @@ -4776,18 +4972,18 @@ "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=" }, "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==" }, "raw-body": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", - "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.3", - "iconv-lite": "0.4.23", + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", "unpipe": "1.0.0" } }, @@ -4804,20 +5000,20 @@ } }, "react-is": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", - "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==", + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.9.0.tgz", + "integrity": "sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw==", "dev": true }, "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", + "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", "dev": true, "requires": { - "load-json-file": "^4.0.0", "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" + "parse-json": "^4.0.0", + "pify": "^3.0.0" } }, "read-pkg-up": { @@ -4828,6 +5024,19 @@ "requires": { "find-up": "^3.0.0", "read-pkg": "^3.0.0" + }, + "dependencies": { + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + } } }, "readable-stream": { @@ -4946,6 +5155,12 @@ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", "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 + }, "tough-cookie": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", @@ -4985,9 +5200,9 @@ "dev": true }, "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", "dev": true }, "resolve": { @@ -5027,9 +5242,9 @@ "dev": true }, "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "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" @@ -5108,9 +5323,9 @@ } }, "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", "requires": { "debug": "2.6.9", "depd": "~1.1.2", @@ -5119,30 +5334,30 @@ "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", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" + "range-parser": "~1.2.1", + "statuses": "~1.5.0" }, "dependencies": { - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + "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==" } } }, "serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "parseurl": "~1.3.2", - "send": "0.16.2" + "parseurl": "~1.3.3", + "send": "0.17.1" } }, "set-blocking": { @@ -5175,9 +5390,9 @@ } }, "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==" }, "shebang-command": { "version": "1.2.0", @@ -5207,9 +5422,9 @@ "dev": true }, "sisteransi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.0.tgz", - "integrity": "sha512-N+z4pHB4AmUv0SjveWRd6q1Nj5w62m5jodv+GD8lvmbY/83T/rpbJGZOnK5T149OldDj4Db07BSv9xY4K6NTPQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.3.tgz", + "integrity": "sha512-SbEG75TzH8G7eVXFSN5f9EExILKfly7SUvVY5DhhYLvfhKqhDFY0OzevWa/zwak0RLRfWS5AvfMWpd9gJvr5Yg==", "dev": true }, "slash": { @@ -5351,9 +5566,9 @@ } }, "source-map-support": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", - "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -5399,9 +5614,9 @@ } }, "spdx-license-ids": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", - "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", "dev": true }, "split-string": { @@ -5476,23 +5691,6 @@ "requires": { "astral-regex": "^1.0.0", "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } } }, "string-width": { @@ -5532,12 +5730,12 @@ } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^3.0.0" } }, "strip-bom": { @@ -5626,6 +5824,14 @@ "minimatch": "^3.0.4", "read-pkg-up": "^4.0.0", "require-main-filename": "^2.0.0" + }, + "dependencies": { + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + } } }, "throat": { @@ -5694,6 +5900,11 @@ "repeat-string": "^1.6.1" } }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, "touch": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", @@ -5799,18 +6010,18 @@ } }, "type-is": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "requires": { "media-typer": "0.3.0", - "mime-types": "~2.1.18" + "mime-types": "~2.1.24" } }, "typescript": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.2.tgz", - "integrity": "sha512-7KxJovlYhTX5RaRbUdkAXN1KUZ8PwWlTzQdHV6xNqvuFOs7+WBo10TQUqT19Q/Jz2hk5v9TQDIhyLhhJY4p5AA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.6.2.tgz", + "integrity": "sha512-lmQ4L+J6mnu3xweP8+rOrUwzmN+MRAj7TgtJtDaXE5PMyX2kCrklhg3rvOsOIfNeAWMQWO2F1GPc1kMD2vLAfw==", "dev": true }, "uglify-js": { @@ -6006,9 +6217,9 @@ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", "dev": true }, "validate-npm-package-license": { @@ -6038,9 +6249,9 @@ } }, "vm2": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.8.2.tgz", - "integrity": "sha512-FE9slf0o4YoD2Jf7VEjytHTac2SMt2J4ahf9Tw9YLLVqJm0DQiMpmN+I0+RsnOZ0kb7PyeR1rLxathXZWJ23kg==" + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.8.3.tgz", + "integrity": "sha512-ENQFzvyofYuR6ADLwK7v3eTVXPx8R4EPDoOBb4vDZ18doMH6UR2xe735VZKz+BrgIpi5SAt9laBqZJf1FlqHTw==" }, "w3c-hr-time": { "version": "1.0.1", @@ -6073,17 +6284,6 @@ "dev": true, "requires": { "iconv-lite": "0.4.24" - }, - "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" - } - } } }, "whatwg-mimetype": { @@ -6248,14 +6448,6 @@ "which-module": "^2.0.0", "y18n": "^3.2.1 || ^4.0.0", "yargs-parser": "^11.1.1" - }, - "dependencies": { - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - } } }, "yargs-parser": { diff --git a/transformation/package.json b/transformation/package.json index 7a97d5b0f..b31f4b9fc 100644 --- a/transformation/package.json +++ b/transformation/package.json @@ -20,24 +20,24 @@ "author": "", "license": "ISC", "dependencies": { - "body-parser": "^1.18.3", + "body-parser": "^1.19.0", "cors": "^2.8.5", - "express": "^4.16.4", - "express-session": "^1.15.6", - "keycloak-connect": "^5.0.0", - "vm2": "^3.8.2" + "express": "^4.17.1", + "express-session": "^1.16.2", + "keycloak-connect": "^7.0.0", + "vm2": "^3.8.3" }, "devDependencies": { - "@types/cors": "^2.8.5", - "@types/express": "^4.16.1", - "@types/express-session": "^1.15.13", - "@types/jest": "^24.0.11", + "@types/cors": "^2.8.6", + "@types/express": "^4.17.1", + "@types/express-session": "^1.15.14", + "@types/jest": "^24.0.18", "@types/keycloak-connect": "^4.5.1", - "concurrently": "^4.1.1", - "jest": "^24.5.0", + "concurrently": "^4.1.2", + "jest": "^24.9.0", "nodemon": "^1.19.1", - "ts-jest": "^24.0.1", - "tslib": "^1.9.3", - "typescript": "^3.4.1" + "ts-jest": "^24.0.2", + "tslib": "^1.10.0", + "typescript": "^3.6.2" } } diff --git a/ui/package-lock.json b/ui/package-lock.json index ce6fb43db..f9ac8b383 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -5,47 +5,63 @@ "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", "dev": true, "requires": { "@babel/highlight": "^7.0.0" } }, "@babel/core": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.5.4.tgz", - "integrity": "sha512-+DaeBEpYq6b2+ZmHx3tHspC+ZRflrvLqwfv8E3hNr5LVQoyBnL8RPKSBCg+rK2W2My9PWlujBiqd0ZPsR9Q6zQ==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.5.5.tgz", + "integrity": "sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.5.0", - "@babel/helpers": "^7.5.4", - "@babel/parser": "^7.5.0", + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helpers": "^7.5.5", + "@babel/parser": "^7.5.5", "@babel/template": "^7.4.4", - "@babel/traverse": "^7.5.0", - "@babel/types": "^7.5.0", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5", "convert-source-map": "^1.1.0", "debug": "^4.1.0", "json5": "^2.1.0", - "lodash": "^4.17.11", + "lodash": "^4.17.13", "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } } }, "@babel/generator": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.0.tgz", - "integrity": "sha512-1TTVrt7J9rcG5PMjvO7VEG3FrEoEJNHxumRq66GemPmzboLWtIjjcJgk8rokuAS7IiRSpgVSu5Vb9lc99iJkOA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", "dev": true, "requires": { - "@babel/types": "^7.5.0", + "@babel/types": "^7.5.5", "jsesc": "^2.5.1", - "lodash": "^4.17.11", + "lodash": "^4.17.13", "source-map": "^0.5.0", "trim-right": "^1.0.1" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } } }, "@babel/helper-annotate-as-pure": { @@ -79,28 +95,36 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.5.0.tgz", - "integrity": "sha512-EAoMc3hE5vE5LNhMqDOwB1usHvmRjCDAnH8CD4PVkX9/Yr3W/tcz8xE8QvdZxfsFBDICwZnF2UTHIqslRpvxmA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.5.5.tgz", + "integrity": "sha512-ZsxkyYiRA7Bg+ZTRpPvB6AbOFKTFFK4LrvTet8lInm0V468MWCaSYJE+I7v2z2r8KNLtYiV+K5kTCnR7dvyZjg==", "dev": true, "requires": { "@babel/helper-function-name": "^7.1.0", - "@babel/helper-member-expression-to-functions": "^7.0.0", + "@babel/helper-member-expression-to-functions": "^7.5.5", "@babel/helper-optimise-call-expression": "^7.0.0", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.4.4", + "@babel/helper-replace-supers": "^7.5.5", "@babel/helper-split-export-declaration": "^7.4.4" } }, "@babel/helper-define-map": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.4.4.tgz", - "integrity": "sha512-IX3Ln8gLhZpSuqHJSnTNBWGDE9kdkTEWl21A/K7PQ00tseBwbqCHTvNLHSBd9M0R5rER4h5Rsvj9vw0R5SieBg==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz", + "integrity": "sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg==", "dev": true, "requires": { "@babel/helper-function-name": "^7.1.0", - "@babel/types": "^7.4.4", - "lodash": "^4.17.11" + "@babel/types": "^7.5.5", + "lodash": "^4.17.13" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } } }, "@babel/helper-explode-assignable-expression": { @@ -143,12 +167,12 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz", - "integrity": "sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz", + "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==", "dev": true, "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.5.5" } }, "@babel/helper-module-imports": { @@ -161,17 +185,25 @@ } }, "@babel/helper-module-transforms": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.4.4.tgz", - "integrity": "sha512-3Z1yp8TVQf+B4ynN7WoHPKS8EkdTbgAEy0nU0rs/1Kw4pDgmvYH3rz3aI11KgxKCba2cn7N+tqzV1mY2HMN96w==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz", + "integrity": "sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.0.0", "@babel/helper-simple-access": "^7.1.0", "@babel/helper-split-export-declaration": "^7.4.4", "@babel/template": "^7.4.4", - "@babel/types": "^7.4.4", - "lodash": "^4.17.11" + "@babel/types": "^7.5.5", + "lodash": "^4.17.13" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } } }, "@babel/helper-optimise-call-expression": { @@ -190,12 +222,20 @@ "dev": true }, "@babel/helper-regex": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.4.4.tgz", - "integrity": "sha512-Y5nuB/kESmR3tKjU8Nkn1wMGEx1tjJX076HBMeL3XLQCu6vA/YRzuTW0bbb+qRnXvQGn+d6Rx953yffl8vEy7Q==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.5.5.tgz", + "integrity": "sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw==", "dev": true, "requires": { - "lodash": "^4.17.11" + "lodash": "^4.17.13" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } } }, "@babel/helper-remap-async-to-generator": { @@ -212,15 +252,15 @@ } }, "@babel/helper-replace-supers": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.4.4.tgz", - "integrity": "sha512-04xGEnd+s01nY1l15EuMS1rfKktNF+1CkKmHoErDppjAAZL+IUBZpzT748x262HF7fibaQPhbvWUl5HeSt1EXg==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz", + "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.0.0", + "@babel/helper-member-expression-to-functions": "^7.5.5", "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/traverse": "^7.4.4", - "@babel/types": "^7.4.4" + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5" } }, "@babel/helper-simple-access": { @@ -255,14 +295,14 @@ } }, "@babel/helpers": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.5.4.tgz", - "integrity": "sha512-6LJ6xwUEJP51w0sIgKyfvFMJvIb9mWAfohJp0+m6eHJigkFdcH8duZ1sfhn0ltJRzwUIT/yqqhdSfRpCpL7oow==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.5.5.tgz", + "integrity": "sha512-nRq2BUhxZFnfEn/ciJuhklHvFOqjJUD5wpx+1bxUF2axL9C+v4DE/dmp5sT2dKnpOs4orZWzpAZqlCy8QqE/7g==", "dev": true, "requires": { "@babel/template": "^7.4.4", - "@babel/traverse": "^7.5.0", - "@babel/types": "^7.5.0" + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5" } }, "@babel/highlight": { @@ -277,9 +317,9 @@ } }, "@babel/parser": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.0.tgz", - "integrity": "sha512-I5nW8AhGpOXGCCNYGc+p7ExQIBxRFnS2fd/d862bNOKvmoEPjYPcfIjsfdy0ujagYOIYPczKgD9l3FsgTkAzKA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", + "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==", "dev": true }, "@babel/plugin-proposal-async-generator-functions": { @@ -294,12 +334,12 @@ } }, "@babel/plugin-proposal-class-properties": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.5.0.tgz", - "integrity": "sha512-9L/JfPCT+kShiiTTzcnBJ8cOwdKVmlC1RcCf9F0F9tERVrM4iWtWnXtjWCRqNm2la2BxO1MPArWNsU9zsSJWSQ==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.5.5.tgz", + "integrity": "sha512-AF79FsnWFxjlaosgdi421vmYG6/jg79bVD0dpD44QdgobzHKuLZ6S3vl8la9qIeSwGi8i1fS0O1mfuDAAdo1/A==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.5.0", + "@babel/helper-create-class-features-plugin": "^7.5.5", "@babel/helper-plugin-utils": "^7.0.0" } }, @@ -325,9 +365,9 @@ } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.4.tgz", - "integrity": "sha512-KCx0z3y7y8ipZUMAEEJOyNi11lMb/FOPUjjB113tfowgw0c16EGYos7worCKBcUAh2oG+OBnoUhsnTSoLpV9uA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz", + "integrity": "sha512-F2DxJJSQ7f64FyTVl5cw/9MWn6naXGdk3Q3UhDbFEEHv+EilCPoeRD3Zh/Utx1CJz4uyKlQ4uH+bJPbEhMV7Zw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", @@ -448,27 +488,35 @@ } }, "@babel/plugin-transform-block-scoping": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.4.tgz", - "integrity": "sha512-jkTUyWZcTrwxu5DD4rWz6rDB5Cjdmgz6z7M7RLXOJyCUkFBawssDGcGh8M/0FTSB87avyJI1HsTwUXp9nKA1PA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.5.5.tgz", + "integrity": "sha512-82A3CLRRdYubkG85lKwhZB0WZoHxLGsJdux/cOVaJCJpvYFl1LVzAIFyRsa7CvXqW8rBM4Zf3Bfn8PHt5DP0Sg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "lodash": "^4.17.11" + "lodash": "^4.17.13" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } } }, "@babel/plugin-transform-classes": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.4.tgz", - "integrity": "sha512-/e44eFLImEGIpL9qPxSRat13I5QNRgBLu2hOQJCF7VLy/otSM/sypV1+XaIw5+502RX/+6YaSAPmldk+nhHDPw==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz", + "integrity": "sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-define-map": "^7.4.4", + "@babel/helper-define-map": "^7.5.5", "@babel/helper-function-name": "^7.1.0", "@babel/helper-optimise-call-expression": "^7.0.0", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.4.4", + "@babel/helper-replace-supers": "^7.5.5", "@babel/helper-split-export-declaration": "^7.4.4", "globals": "^11.1.0" } @@ -612,13 +660,13 @@ } }, "@babel/plugin-transform-object-super": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz", - "integrity": "sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz", + "integrity": "sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.1.0" + "@babel/helper-replace-supers": "^7.5.5" } }, "@babel/plugin-transform-parameters": { @@ -642,9 +690,9 @@ } }, "@babel/plugin-transform-runtime": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.5.0.tgz", - "integrity": "sha512-LmPIZOAgTLl+86gR9KjLXex6P/lRz1fWEjTz6V6QZMmKie51ja3tvzdwORqhHc4RWR8TcZ5pClpRWs0mlaA2ng==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.5.5.tgz", + "integrity": "sha512-6Xmeidsun5rkwnGfMOp6/z9nSzWpHFNVr2Jx7kwoq4mVatQfQx5S56drBgEHF+XQbKOdIaOiMIINvp/kAwMN+w==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.0.0", @@ -654,9 +702,9 @@ }, "dependencies": { "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true } } @@ -771,18 +819,18 @@ } }, "@babel/runtime": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.4.tgz", - "integrity": "sha512-Na84uwyImZZc3FKf4aUF1tysApzwf3p2yuFBIyBfbzT5glzKTdvYI4KVW4kcgjrzoGUjC7w3YyCHcJKaRxsr2Q==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.5.tgz", + "integrity": "sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ==", "dev": true, "requires": { "regenerator-runtime": "^0.13.2" } }, "@babel/runtime-corejs2": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.5.4.tgz", - "integrity": "sha512-sHv74OzyZ18d6tjHU0HmlVES3+l+lydkOMTiKsJSTGWcTBpIMfXLEgduahlJrQjknW9RCQAqLIEdLOHjBmq/hg==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.5.5.tgz", + "integrity": "sha512-FYATQVR00NSNi7mUfpPDp7E8RYMXDuO8gaix7u/w3GekfUinKgX1AcTxs7SoiEmoEW9mbpjrwqWSW6zCmw5h8A==", "dev": true, "requires": { "core-js": "^2.6.5", @@ -801,31 +849,47 @@ } }, "@babel/traverse": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.0.tgz", - "integrity": "sha512-SnA9aLbyOCcnnbQEGwdfBggnc142h/rbqqsXcaATj2hZcegCl903pUD/lfpsNBlBSuWow/YDfRyJuWi2EPR5cg==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.5.0", + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", "@babel/helper-function-name": "^7.1.0", "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.5.0", - "@babel/types": "^7.5.0", + "@babel/parser": "^7.5.5", + "@babel/types": "^7.5.5", "debug": "^4.1.0", "globals": "^11.1.0", - "lodash": "^4.17.11" + "lodash": "^4.17.13" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } } }, "@babel/types": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.0.tgz", - "integrity": "sha512-UFpDVqRABKsW01bvw7/wSUe56uy6RXM5+VJibVVAybDGxEW25jdwiFJEf7ASvSaC7sN7rbE/l3cLp2izav+CtQ==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", "dev": true, "requires": { "esutils": "^2.0.2", - "lodash": "^4.17.11", + "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } } }, "@hapi/address": { @@ -834,45 +898,37 @@ "integrity": "sha512-mV6T0IYqb0xL1UALPFplXYQmR0twnXG0M6jUswpquqT2sD12BOiCiLy3EvMp/Fy7s3DZElC4/aPjEjo2jeZpvw==", "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": "6.2.4", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-6.2.4.tgz", - "integrity": "sha512-HOJ20Kc93DkDVvjwHyHawPwPkX44sIrbXazAUDiUXaY2R9JwQGo2PhFfnQtdrsIe4igjG2fPgMra7NYw7qhy0A==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.2.1.tgz", + "integrity": "sha512-JPiBy+oSmsq3St7XlipfN5pNA6bDJ1kpa73PrK/zR29CVClDVqy04AanM/M/qx5bSF+I61DdCfAvRrujau+zRg==", "dev": true }, "@hapi/joi": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.0.tgz", - "integrity": "sha512-n6kaRQO8S+kepUTbXL9O/UOL788Odqs38/VOfoCrATDtTvyfiO3fgjlSRaNkHabpTLgM7qru9ifqXlXbXk8SeQ==", + "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": { "@hapi/address": "2.x.x", - "@hapi/hoek": "6.x.x", - "@hapi/marker": "1.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", "@hapi/topo": "3.x.x" } }, - "@hapi/marker": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@hapi/marker/-/marker-1.0.0.tgz", - "integrity": "sha512-JOfdekTXnJexfE8PyhZFyHvHjt81rBFSAbTIRAhF2vv/2Y1JzoKsGqxH/GpZJoF7aEfYok8JVcAHmSz1gkBieA==", - "dev": true - }, "@hapi/topo": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.2.tgz", - "integrity": "sha512-r+aumOqJ5QbD6aLPJWqVjMAPsx5pZKz+F5yPqXZ/WWG9JTtHbQqlzrJoknJ0iJxLj9vlXtmpSdjlkszseeG8OA==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.3.tgz", + "integrity": "sha512-JmS9/vQK6dcUYn7wc2YZTqzIKubAQcJKu2KCKAru6es482U5RT5fP1EXCPtlXpiK7PR0On/kpQKI4fRKkzpZBQ==", "dev": true, "requires": { "@hapi/hoek": "8.x.x" - }, - "dependencies": { - "@hapi/hoek": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.0.2.tgz", - "integrity": "sha512-O6o6mrV4P65vVccxymuruucb+GhP2zl9NLCG8OdoFRS8BEGw3vwpPp20wpAtpbQQxz1CEUtmxJGgWhjq1XA3qw==", - "dev": true - } } }, "@intervolga/optimize-cssnano-plugin": { @@ -887,9 +943,9 @@ } }, "@mdi/font": { - "version": "3.7.95", - "resolved": "https://registry.npmjs.org/@mdi/font/-/font-3.7.95.tgz", - "integrity": "sha512-JFQSv1GwhilTN6mj2SHu+YH+jZAIPn6sir/gGYoMSgyEM94nzlLGc7Ew21mnDEr0+W3LhFaInu8dqZFvNUx1bA==", + "version": "4.2.95", + "resolved": "https://registry.npmjs.org/@mdi/font/-/font-4.2.95.tgz", + "integrity": "sha512-pCJ9hR8yQH1tMk6KTZYfJsZkI/XQ1rR9Fe/q50ATDDVUoDk7Wl7n9WqT6dYWn0mnCLgrTQl/WNjyrnTo5rKu+A==", "dev": true }, "@mrmlnc/readdir-enhanced": { @@ -985,9 +1041,9 @@ } }, "@types/jest": { - "version": "24.0.15", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.0.15.tgz", - "integrity": "sha512-MU1HIvWUme74stAoc3mgAi+aMlgKOudgEvQDIm1v4RkrDudBh1T+NFp5sftpBAdXdx1J0PbdpJ+M2EsSOi1djA==", + "version": "24.0.18", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.0.18.tgz", + "integrity": "sha512-jcDDXdjTcrQzdN06+TSVsPPqxvsZA/5QkYfIZlq1JMw7FdP5AZylbOc+6B/cuDurctRe+MziUMtQ3xQdrbjqyQ==", "dev": true, "requires": { "@types/jest-diff": "*" @@ -999,6 +1055,12 @@ "integrity": "sha512-yALhelO3i0hqZwhjtcr6dYyaLoCHbAMshwtj6cGxTvHZAKXHsYGdff6E8EPw3xLKY0ELUTQ69Q1rQiJENnccMA==", "dev": true }, + "@types/json-schema": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.3.tgz", + "integrity": "sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A==", + "dev": true + }, "@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", @@ -1006,9 +1068,9 @@ "dev": true }, "@types/node": { - "version": "12.6.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.6.2.tgz", - "integrity": "sha512-gojym4tX0FWeV2gsW4Xmzo5wxGjXGm550oVUII7f7G5o4BV6c7DBdiG1RRQd+y1bvqRyYtPfMK85UM95vsapqQ==" + "version": "12.7.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.2.tgz", + "integrity": "sha512-dyYO+f6ihZEtNPDcWNR1fkoTDf3zAK3lAABDze3mz6POyIercH0lEUawUFXlG8xaQZmm1yEBON/4TsYv/laDYg==" }, "@types/normalize-package-data": { "version": "2.4.0", @@ -1041,48 +1103,68 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.11.0.tgz", - "integrity": "sha512-mXv9ccCou89C8/4avKHuPB2WkSZyY/XcTQUXd5LFZAcLw1I3mWYVjUu6eS9Ja0QkP/ClolbcW9tb3Ov/pMdcqw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.0.0.tgz", + "integrity": "sha512-Mo45nxTTELODdl7CgpZKJISvLb+Fu64OOO2ZFc2x8sYSnUpFrBUW3H+H/ZGYmEkfnL6VkdtOSxgdt+Av79j0sA==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "1.11.0", - "eslint-utils": "^1.3.1", + "@typescript-eslint/experimental-utils": "2.0.0", + "eslint-utils": "^1.4.0", "functional-red-black-tree": "^1.0.1", "regexpp": "^2.0.1", - "tsutils": "^3.7.0" + "tsutils": "^3.14.0" + }, + "dependencies": { + "eslint-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.2.tgz", + "integrity": "sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.0.0" + } + } } }, "@typescript-eslint/experimental-utils": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-1.11.0.tgz", - "integrity": "sha512-7LbfaqF6B8oa8cp/315zxKk8FFzosRzzhF8Kn/ZRsRsnpm7Qcu25cR/9RnAQo5utZ2KIWVgaALr+ZmcbG47ruw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.0.0.tgz", + "integrity": "sha512-XGJG6GNBXIEx/mN4eTRypN/EUmsd0VhVGQ1AG+WTgdvjHl0G8vHhVBHrd/5oI6RRYBRnedNymSYWW1HAdivtmg==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "1.11.0", + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "2.0.0", "eslint-scope": "^4.0.0" } }, "@typescript-eslint/parser": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-1.11.0.tgz", - "integrity": "sha512-5xBExyXaxVyczrZvbRKEXvaTUFFq7gIM9BynXukXZE0zF3IQP/FxF4mPmmh3gJ9egafZFqByCpPTFm3dk4SY7Q==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.0.0.tgz", + "integrity": "sha512-ibyMBMr0383ZKserIsp67+WnNVoM402HKkxqXGlxEZsXtnGGurbnY90pBO3e0nBUM7chEEOcxUhgw9aPq7fEBA==", "dev": true, "requires": { "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "1.11.0", - "@typescript-eslint/typescript-estree": "1.11.0", + "@typescript-eslint/experimental-utils": "2.0.0", + "@typescript-eslint/typescript-estree": "2.0.0", "eslint-visitor-keys": "^1.0.0" } }, "@typescript-eslint/typescript-estree": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-1.11.0.tgz", - "integrity": "sha512-fquUHF5tAx1sM2OeRCC7wVxFd1iMELWMGCzOSmJ3pLzArj9+kRixdlC4d5MncuzXpjEqc6045p3KwM0o/3FuUA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.0.0.tgz", + "integrity": "sha512-NXbmzA3vWrSgavymlzMWNecgNOuiMMp62MO3kI7awZRLRcsA1QrYWo6q08m++uuAGVbXH/prZi2y1AWuhSu63w==", "dev": true, "requires": { "lodash.unescape": "4.0.1", - "semver": "5.5.0" + "semver": "^6.2.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 + } } }, "@vue/babel-helper-vue-jsx-merge-props": { @@ -1106,9 +1188,9 @@ } }, "@vue/babel-preset-app": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-3.9.2.tgz", - "integrity": "sha512-0suuCbu4jkVcVYBjPmuKxeDbrhwThYZHu3DUmtsVuOzFEGeXmco60VmXveniL/bnDUdZyknSuYP4FxgS34gw9w==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-3.11.0.tgz", + "integrity": "sha512-fcCq9nuGGx1WGnyaKHvIC8RnWjISXGf1rJH4mN9+bymDfosgDbwnfV4TYvTZlyK1/aTHEEpIoO3XimTXBo7QBw==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.0.0", @@ -1127,9 +1209,9 @@ } }, "@vue/babel-preset-jsx": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.0.0.tgz", - "integrity": "sha512-5CbDu/QHS+TtQNw5aYAffiMxBBB2Eo9+RJpS8X+6FJbdG5Rvc4TVipEqkrg0pJviWadNg7TEy0Uz4o7VNXeIZw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.1.0.tgz", + "integrity": "sha512-EeZ9gwEmu79B4A6LMLAw5cPCVYIcbKWgJgJafWtLzh1S+SgERUmTkVQ9Vx4k8zYBiCuxHK3XziZ3VJIMau7THA==", "dev": true, "requires": { "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0", @@ -1137,7 +1219,7 @@ "@vue/babel-sugar-functional-vue": "^1.0.0", "@vue/babel-sugar-inject-h": "^1.0.0", "@vue/babel-sugar-v-model": "^1.0.0", - "@vue/babel-sugar-v-on": "^1.0.0" + "@vue/babel-sugar-v-on": "^1.1.0" } }, "@vue/babel-sugar-functional-vue": { @@ -1173,9 +1255,9 @@ } }, "@vue/babel-sugar-v-on": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.0.0.tgz", - "integrity": "sha512-2aqJaDLKdSSGlxZU+GjFERaSNUaa6DQreV+V/K4W/6Lxj8520/r1lChWEa/zuAoPD2Vhy0D2QrqqO+I0D6CkKw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.1.0.tgz", + "integrity": "sha512-8DwAj/RLpmrDP4eZ3erJcKcyuLArLUYagNODTsSQrMdG5zmLJoFFtEjODfYRh/XxM2wXv9Wxe+HAB41FQxxwQA==", "dev": true, "requires": { "@babel/plugin-syntax-jsx": "^7.2.0", @@ -1184,47 +1266,47 @@ } }, "@vue/cli-overlay": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@vue/cli-overlay/-/cli-overlay-3.9.0.tgz", - "integrity": "sha512-QfyvpJl2ChehBT2qzb5EvW921JxW94uFL3+lHa6VT42ImH8awrvkTGZmxTQWhHvATa7r0LKy7M7ZRMyo547esg==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@vue/cli-overlay/-/cli-overlay-3.11.0.tgz", + "integrity": "sha512-yYZP27vjioWmohwXQ9mTPHHxktfAaTM6RDehyG83yvY07wcdxhwrNNCMm8eE9My/K2F8oAPf8uoDZZmkr/EXBw==", "dev": true }, "@vue/cli-plugin-babel": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@vue/cli-plugin-babel/-/cli-plugin-babel-3.9.2.tgz", - "integrity": "sha512-XqfmGjUGnnJ3NA+HC31F6nkBvB9pFDhk4Lxeao8ZNJcEjKNEBYjlmHunJQdIe/jEXXum6U+U/ZE6DjDStHTIMw==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-babel/-/cli-plugin-babel-3.11.0.tgz", + "integrity": "sha512-RSq9goefilvUMYxbeQS8cZxt6zZnvBIb1xK4NWX0NBtqKzJmIjtJzDAQvKgjnZ/USRu6p6X2IRj4Wum8UCUqow==", "dev": true, "requires": { "@babel/core": "^7.0.0", - "@vue/babel-preset-app": "^3.9.2", - "@vue/cli-shared-utils": "^3.9.0", + "@vue/babel-preset-app": "^3.11.0", + "@vue/cli-shared-utils": "^3.11.0", "babel-loader": "^8.0.5", - "webpack": ">=4 < 4.29" + "webpack": "^4.0.0" } }, "@vue/cli-plugin-typescript": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@vue/cli-plugin-typescript/-/cli-plugin-typescript-3.9.0.tgz", - "integrity": "sha512-QXL98MLM2gdqcrLkEG3bjwyQDIhzKdJqUdVghH/ZAttSj5G3hDKklI5HPqz3TJV7FVDOocFr1szP2BcXCCLh8Q==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-typescript/-/cli-plugin-typescript-3.11.0.tgz", + "integrity": "sha512-oL0ctNVvbD7gZr3DDv6gxxWjw0lUrh4sGMk7InCakEooo/790DqZRX6lx9stXEv/+zELkgddcY3hjNEopbJg+w==", "dev": true, "requires": { "@types/webpack-env": "^1.13.9", - "@vue/cli-shared-utils": "^3.9.0", + "@vue/cli-shared-utils": "^3.11.0", "fork-ts-checker-webpack-plugin": "^0.5.2", "globby": "^9.2.0", "ts-loader": "^5.3.3", "tslint": "^5.15.0", - "webpack": ">=4 < 4.29", + "webpack": "^4.0.0", "yorkie": "^2.0.0" } }, "@vue/cli-plugin-unit-jest": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@vue/cli-plugin-unit-jest/-/cli-plugin-unit-jest-3.9.0.tgz", - "integrity": "sha512-FzUeTXXM7VUbjNDrqbj/AoUXZd0FZVrW936VO0W57r7uDgv+bh5hcEyzZnOaqFUOHYNFhl0RYD528/Uq5Dgm0A==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-unit-jest/-/cli-plugin-unit-jest-3.11.0.tgz", + "integrity": "sha512-UwdySXhSar9npsYmLJ45Rk4kljOwNQDHRMvmWtGIUqmES0wBYsWLed3dpcumTXTsumXrVdrY6o74L9yqCNT/xw==", "dev": true, "requires": { - "@vue/cli-shared-utils": "^3.9.0", + "@vue/cli-shared-utils": "^3.11.0", "babel-jest": "^23.6.0", "babel-plugin-transform-es2015-modules-commonjs": "^6.26.2", "jest": "^23.6.0", @@ -1235,16 +1317,16 @@ } }, "@vue/cli-service": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@vue/cli-service/-/cli-service-3.9.2.tgz", - "integrity": "sha512-R4L9tCMpJ4DzLgu/aU9CEtl5QYsj/FXRrtEgXSKm+71OVtA/o2rkLTC8SLB2Bu7wHP/HCYbaoy4NZqSEQzTuLw==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@vue/cli-service/-/cli-service-3.11.0.tgz", + "integrity": "sha512-HSU4wHlYKQt8O968JUz/AeYvFSokxJjMkr7dgVNVb6rpBn859Emkr960plWGr1z1hc3qNOwLuSUGk5OSfq1inA==", "dev": true, "requires": { "@intervolga/optimize-cssnano-plugin": "^1.0.5", "@soda/friendly-errors-webpack-plugin": "^1.7.1", - "@vue/cli-overlay": "^3.9.0", - "@vue/cli-shared-utils": "^3.9.0", - "@vue/component-compiler-utils": "^2.6.0", + "@vue/cli-overlay": "^3.11.0", + "@vue/cli-shared-utils": "^3.11.0", + "@vue/component-compiler-utils": "^3.0.0", "@vue/preload-webpack-plugin": "^1.1.0", "@vue/web-component-wrapper": "^1.2.0", "acorn": "^6.1.1", @@ -1273,7 +1355,7 @@ "hash-sum": "^1.0.2", "html-webpack-plugin": "^3.2.0", "launch-editor-middleware": "^2.2.1", - "lodash.defaultsdeep": "^4.6.0", + "lodash.defaultsdeep": "^4.6.1", "lodash.mapvalues": "^4.6.0", "lodash.transform": "^4.6.0", "mini-css-extract-plugin": "^0.6.0", @@ -1291,19 +1373,13 @@ "thread-loader": "^2.1.2", "url-loader": "^1.1.2", "vue-loader": "^15.7.0", - "webpack": ">=4 < 4.29", + "webpack": "^4.0.0", "webpack-bundle-analyzer": "^3.3.0", "webpack-chain": "^4.11.0", "webpack-dev-server": "^3.4.1", "webpack-merge": "^4.2.1" }, "dependencies": { - "acorn": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.0.tgz", - "integrity": "sha512-8oe72N3WPMjA+2zVG71Ia0nXZ8DpQH+QyyHO+p06jT8eg8FGG3FbcUIi8KziHlAfheJQZeoqbvq1mQSQHXKYLw==", - "dev": true - }, "cliui": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", @@ -1340,9 +1416,9 @@ } }, "semver": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz", - "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, "string-width": { @@ -1370,9 +1446,9 @@ } }, "@vue/cli-shared-utils": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-3.9.0.tgz", - "integrity": "sha512-wumeMZTz5aQ+1Y6uxTKegIsgOXEWT3hT8f9sW2mj5SwNDVyQ+AHZTgSynYExTUJg3dH81uKgFDUpPdAvGxzh8g==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-3.11.0.tgz", + "integrity": "sha512-D7pst/4v9H1DD66fLxlZOwRR09R03MV0ROdKxBHmh3FmnApCA/RiaolFA/8w+B3CnevYMlV3SJ5fOAgedbswbA==", "dev": true, "requires": { "@hapi/joi": "^15.0.1", @@ -1390,17 +1466,17 @@ }, "dependencies": { "semver": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz", - "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, "@vue/component-compiler-utils": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-2.6.0.tgz", - "integrity": "sha512-IHjxt7LsOFYc0DkTncB7OXJL7UzwOLPPQCfEUNyxL2qt+tF12THV+EO33O1G2Uk4feMSWua3iD39Itszx0f0bw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.0.0.tgz", + "integrity": "sha512-am+04/0UX7ektcmvhYmrf84BDVAD8afFOf4asZjN84q8xzxFclbk5x0MtxuKGfp+zjN5WWPJn3fjFAWtDdIGSw==", "dev": true, "requires": { "consolidate": "^0.15.1", @@ -1446,12 +1522,60 @@ "requires": { "@typescript-eslint/eslint-plugin": "^1.1.0", "@typescript-eslint/parser": "^1.1.0" + }, + "dependencies": { + "@typescript-eslint/eslint-plugin": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.13.0.tgz", + "integrity": "sha512-WQHCozMnuNADiqMtsNzp96FNox5sOVpU8Xt4meaT4em8lOG1SrOv92/mUbEHQVh90sldKSfcOc/I0FOb/14G1g==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "1.13.0", + "eslint-utils": "^1.3.1", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^2.0.1", + "tsutils": "^3.7.0" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-1.13.0.tgz", + "integrity": "sha512-zmpS6SyqG4ZF64ffaJ6uah6tWWWgZ8m+c54XXgwFtUv0jNz8aJAVx8chMCvnk7yl6xwn8d+d96+tWp7fXzTuDg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "1.13.0", + "eslint-scope": "^4.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-1.13.0.tgz", + "integrity": "sha512-ITMBs52PCPgLb2nGPoeT4iU3HdQZHcPaZVw+7CsFagRJHUhyeTgorEwHXhFf3e7Evzi8oujKNpHc8TONth8AdQ==", + "dev": true, + "requires": { + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "1.13.0", + "@typescript-eslint/typescript-estree": "1.13.0", + "eslint-visitor-keys": "^1.0.0" + } + }, + "@typescript-eslint/typescript-estree": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-1.13.0.tgz", + "integrity": "sha512-b5rCmd2e6DCC6tCTN9GSUAuxdYwCM/k/2wdjHGrIRGPSJotWMCe/dGpi66u42bhuh8q3QBzqM4TMA1GUUCJvdw==", + "dev": true, + "requires": { + "lodash.unescape": "4.0.1", + "semver": "5.5.0" + } + } } }, "@vue/preload-webpack-plugin": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.0.tgz", - "integrity": "sha512-rcn2KhSHESBFMPj5vc5X2pI9bcBNQQixvJXhD5gZ4rN2iym/uH2qfDSQfUS5+qwiz0a85TCkeUs6w6jxFDudbw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.1.tgz", + "integrity": "sha512-8VCoJeeH8tCkzhkpfOkt+abALQkS11OIHhte5MBzYaKMTqK0A3ZAKEUVAffsOklhEv7t0yrQt696Opnu9oAx+w==", "dev": true }, "@vue/test-utils": { @@ -1471,175 +1595,179 @@ "dev": true }, "@webassemblyjs/ast": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.11.tgz", - "integrity": "sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", "dev": true, "requires": { - "@webassemblyjs/helper-module-context": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/wast-parser": "1.7.11" + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz", - "integrity": "sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz", - "integrity": "sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", + "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz", - "integrity": "sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", + "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", "dev": true }, "@webassemblyjs/helper-code-frame": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz", - "integrity": "sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", + "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", "dev": true, "requires": { - "@webassemblyjs/wast-printer": "1.7.11" + "@webassemblyjs/wast-printer": "1.8.5" } }, "@webassemblyjs/helper-fsm": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz", - "integrity": "sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", + "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", "dev": true }, "@webassemblyjs/helper-module-context": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz", - "integrity": "sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg==", - "dev": true + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", + "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz", - "integrity": "sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz", - "integrity": "sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", + "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-buffer": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/wasm-gen": "1.7.11" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" } }, "@webassemblyjs/ieee754": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz", - "integrity": "sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.11.tgz", - "integrity": "sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", + "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", "dev": true, "requires": { - "@xtuc/long": "4.2.1" + "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.11.tgz", - "integrity": "sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz", - "integrity": "sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", + "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-buffer": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/helper-wasm-section": "1.7.11", - "@webassemblyjs/wasm-gen": "1.7.11", - "@webassemblyjs/wasm-opt": "1.7.11", - "@webassemblyjs/wasm-parser": "1.7.11", - "@webassemblyjs/wast-printer": "1.7.11" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" } }, "@webassemblyjs/wasm-gen": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz", - "integrity": "sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", + "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/ieee754": "1.7.11", - "@webassemblyjs/leb128": "1.7.11", - "@webassemblyjs/utf8": "1.7.11" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" } }, "@webassemblyjs/wasm-opt": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz", - "integrity": "sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", + "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-buffer": "1.7.11", - "@webassemblyjs/wasm-gen": "1.7.11", - "@webassemblyjs/wasm-parser": "1.7.11" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" } }, "@webassemblyjs/wasm-parser": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz", - "integrity": "sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", + "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-api-error": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/ieee754": "1.7.11", - "@webassemblyjs/leb128": "1.7.11", - "@webassemblyjs/utf8": "1.7.11" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" } }, "@webassemblyjs/wast-parser": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz", - "integrity": "sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", + "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/floating-point-hex-parser": "1.7.11", - "@webassemblyjs/helper-api-error": "1.7.11", - "@webassemblyjs/helper-code-frame": "1.7.11", - "@webassemblyjs/helper-fsm": "1.7.11", - "@xtuc/long": "4.2.1" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" } }, "@webassemblyjs/wast-printer": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz", - "integrity": "sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", + "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/wast-parser": "1.7.11", - "@xtuc/long": "4.2.1" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" } }, "@xtuc/ieee754": { @@ -1649,15 +1777,15 @@ "dev": true }, "@xtuc/long": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.1.tgz", - "integrity": "sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, "abab": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", - "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.1.tgz", + "integrity": "sha512-1zSbbCuoIjafKZ3mblY5ikvAb0ODUbqBnFuUb7f6uLeQhhGJ0vEV4ntmtxKLT2WgXCO94E07BjunsIw1jOMPZw==", "dev": true }, "abbrev": { @@ -1677,36 +1805,19 @@ } }, "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", "dev": true }, - "acorn-dynamic-import": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", - "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", - "dev": true, - "requires": { - "acorn": "^5.0.0" - } - }, "acorn-globals": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.2.tgz", - "integrity": "sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.3.tgz", + "integrity": "sha512-vkR40VwS2SYO98AIeFvzWWh+xyc2qi9s7OoXSFEGIP/rOJKzjnhykaZJNnHdoq4BL2gGxI5EZOU16z896EYnOQ==", "dev": true, "requires": { "acorn": "^6.0.1", "acorn-walk": "^6.0.1" - }, - "dependencies": { - "acorn": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.0.tgz", - "integrity": "sha512-8oe72N3WPMjA+2zVG71Ia0nXZ8DpQH+QyyHO+p06jT8eg8FGG3FbcUIi8KziHlAfheJQZeoqbvq1mQSQHXKYLw==", - "dev": true - } } }, "acorn-jsx": { @@ -1722,15 +1833,15 @@ "dev": true }, "address": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/address/-/address-1.1.0.tgz", - "integrity": "sha512-4diPfzWbLEIElVG4AnqP+00SULlPzNuyJFNnmMrLgyaxG6tZXJ1sn7mjBu4fHrJE+Yp/jgylOweJn2xsLMFggQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", "dev": true }, "ajv": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.1.tgz", - "integrity": "sha512-w1YQaVGNC6t2UCPjEawK/vo/dG8OOrVtUmhBT1uJJYxbl5kU2Tj3v6LGqBcsysN1yhuCStJCCA3GqdvKY8sqXQ==", + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", "dev": true, "requires": { "fast-deep-equal": "^2.0.1", @@ -1871,12 +1982,6 @@ "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", "dev": true }, - "array-filter": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", - "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", - "dev": true - }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -1893,18 +1998,6 @@ "es-abstract": "^1.7.0" } }, - "array-map": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", - "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", - "dev": true - }, - "array-reduce": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", - "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", - "dev": true - }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", @@ -1998,12 +2091,20 @@ "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" + "lodash": "^4.17.14" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } } }, "async-each": { @@ -2013,9 +2114,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": { @@ -2046,9 +2147,9 @@ }, "dependencies": { "postcss-value-parser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.0.tgz", - "integrity": "sha512-ESPktioptiSUchCKgggAkzdmkgzKfmp0EU8jXH+5kbIUB+unr0Y4CY9SRMvibuvYUBjNh1ACLbxqYNpdTQOteQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", + "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==", "dev": true } } @@ -2549,9 +2650,9 @@ } }, "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", "dev": true }, "batch": { @@ -2814,13 +2915,13 @@ } }, "browserslist": { - "version": "4.6.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.4.tgz", - "integrity": "sha512-ErJT8qGfRt/VWHSr1HeqZzz50DvxHtr1fVL1m5wf20aGrG8e1ce8fpZ2EjZEfs09DDZYSvtRaDlMpWslBf8Low==", + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.6.tgz", + "integrity": "sha512-D2Nk3W9JL9Fp/gIcWei8LrERCS+eXu9AM5cfXA8WEZ84lFks+ARnZ0q/R69m2SV3Wjma83QDDPxsNKXUwdIsyA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000981", - "electron-to-chromium": "^1.3.188", + "caniuse-lite": "^1.0.30000984", + "electron-to-chromium": "^1.3.191", "node-releases": "^1.1.25" } }, @@ -2890,9 +2991,9 @@ "dev": true }, "cacache": { - "version": "11.3.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz", - "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==", + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", + "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", "dev": true, "requires": { "bluebird": "^3.5.5", @@ -2900,6 +3001,7 @@ "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", @@ -2939,19 +3041,6 @@ "neo-async": "^2.6.0", "normalize-path": "^3.0.0", "schema-utils": "^1.0.0" - }, - "dependencies": { - "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": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } } }, "call-me-maybe": { @@ -3013,9 +3102,9 @@ } }, "caniuse-lite": { - "version": "1.0.30000983", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000983.tgz", - "integrity": "sha512-/llD1bZ6qwNkt41AsvjsmwNOoA4ZB+8iqmf5LVyeSXuBODT/hAMFNVOh84NdUzoiYiSKqo5vQ3ZzeYHSi/olDQ==", + "version": "1.0.30000989", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000989.tgz", + "integrity": "sha512-vrMcvSuMz16YY6GSVZ0dWDTJP8jqk3iFQ/Aq5iqblPwxSVVZI+zxDyTX0VPqtQsDnfdrBDcsmhgTEOh5R8Lbpw==", "dev": true }, "capture-exit": { @@ -3063,9 +3152,9 @@ "dev": true }, "chokidar": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", - "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", "dev": true, "requires": { "anymatch": "^2.0.0", @@ -3201,21 +3290,6 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -3226,38 +3300,10 @@ "path-exists": "^3.0.0" } }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.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 - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "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" @@ -3307,22 +3353,21 @@ } }, "yargs": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", - "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", "dev": true, "requires": { "cliui": "^5.0.0", "find-up": "^3.0.0", "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", "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.0" + "yargs-parser": "^13.1.1" } }, "yargs-parser": { @@ -3350,9 +3395,9 @@ "dev": true }, "clipboard-copy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/clipboard-copy/-/clipboard-copy-3.0.0.tgz", - "integrity": "sha512-1wgoaIRbRGTuv82jTpUgUkUFUQDF8H9hDa8IlkQfdETDHGk0CuisNPvFWNnPT/s3drikxhN33tvv54190c9lYA==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/clipboard-copy/-/clipboard-copy-3.1.0.tgz", + "integrity": "sha512-Xsu1NddBXB89IUauda5BIq3Zq73UWkjkaQlPQbLNvNsd5WBMnTWPNKYR6HGaySOxGYZ+BKxP2E9X4ElnI3yiPA==" }, "clipboardy": { "version": "2.1.0", @@ -4094,12 +4139,12 @@ } }, "css-tree": { - "version": "1.0.0-alpha.28", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.28.tgz", - "integrity": "sha512-joNNW1gCp3qFFzj4St6zk+Wh/NBv0vM5YbEreZk0SD4S23S+1xBKb6cLDg2uj4P4k/GUMlIm6cKIDqIG+vdt0w==", + "version": "1.0.0-alpha.33", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.33.tgz", + "integrity": "sha512-SPt57bh5nQnpsTBsx/IXbO14sRc9xXu5MtMAVuo0BaQQmyf0NupNPPSoMaqiAF5tDFafYsTkfeH4Q/HCKXkg4w==", "dev": true, "requires": { - "mdn-data": "~1.1.0", + "mdn-data": "2.0.4", "source-map": "^0.5.3" } }, @@ -4109,12 +4154,6 @@ "integrity": "sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY=", "dev": true }, - "css-url-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/css-url-regex/-/css-url-regex-1.1.0.tgz", - "integrity": "sha1-g4NCMMyfdMRX3lnuvRVD/uuDt+w=", - "dev": true - }, "css-what": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", @@ -4222,6 +4261,12 @@ "mdn-data": "~1.1.0", "source-map": "^0.5.3" } + }, + "mdn-data": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz", + "integrity": "sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA==", + "dev": true } } }, @@ -4232,12 +4277,12 @@ "dev": true }, "cssstyle": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.3.0.tgz", - "integrity": "sha512-wXsoRfsRfsLVNaVzoKdqvEmK/5PFaEXNspVT22Ots6K/cnJdpoDKuQFw+qlMiXnmaif1OgeC466X1zISgAOcGg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", + "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", "dev": true, "requires": { - "cssom": "~0.3.6" + "cssom": "0.3.x" } }, "current-script-polyfill": { @@ -4325,10 +4370,18 @@ "dev": true }, "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", - "dev": true + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.0.tgz", + "integrity": "sha512-ZbfWJq/wN1Z273o7mUSjILYqehAktR2NVoSrOukDkU9kg2v/Uv89yU4Cvz8seJeAmtN5oqiefKq8FPuXOboqLw==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } }, "deep-is": { "version": "0.1.3", @@ -4343,13 +4396,88 @@ "dev": true }, "default-gateway": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-5.0.2.tgz", - "integrity": "sha512-wXuT0q8T5vxQNecrTgz/KbU2lPUMRc98I9Y5dnH3yhFB3BGYqtADK4lhivLlG0OfjhmfKx1PGILG2jR4zjI+WA==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-5.0.3.tgz", + "integrity": "sha512-zW+ld9xtN0+q48wIwhitUzhfERJN7BPgvijPhuCKG6bfWqnoqtSNSnrXfvAME2ZJLpgYpz6UorpBddGfLzrJBw==", "dev": true, "requires": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" + "execa": "^2.0.3" + }, + "dependencies": { + "execa": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/execa/-/execa-2.0.4.tgz", + "integrity": "sha512-VcQfhuGD51vQUQtKIq2fjGDLDbL6N1DTQVpYzxZ7LPIXw3HqTuIz6uxRmpV1qf8i31LHf2kjiaGI+GdHwRgbnQ==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.5", + "get-stream": "^5.0.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^3.0.0", + "onetime": "^5.1.0", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "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 + }, + "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 + }, + "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 + }, + "npm-run-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz", + "integrity": "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "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" + } + }, + "p-finally": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", + "dev": true + }, + "path-key": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.0.tgz", + "integrity": "sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg==", + "dev": true + } } }, "default-require-extensions": { @@ -4583,13 +4711,21 @@ "dev": true }, "dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.1.tgz", + "integrity": "sha512-sK3ujri04WyjwQXVoK4PU3y8ula1stq10GJZpqHIUgoGZdsGzAGu65BnU3d08aTVSvO7mGPZUc0wTEDL+qGE0Q==", "dev": true, "requires": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "dev": true + } } }, "domain-browser": { @@ -4710,9 +4846,9 @@ } }, "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, "yallist": { @@ -4736,9 +4872,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.189", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.189.tgz", - "integrity": "sha512-C26Kv6/rLNmGDaPR5HORMtTQat9aWBBKjQk9aFtN1Bk6cQBSw8cYdsel/mcrQlNlMMjt1sAKsTYqf77+sK2uTw==", + "version": "1.3.244", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.244.tgz", + "integrity": "sha512-nEfPd2EKnFeLuZ/+JsRG3KixRQwWf2SPpp09ftNt5ouGhg408N759+oXvdXy57+TcM34ykfJYj2JMkc1O3R0lQ==", "dev": true }, "elliptic": { @@ -4795,9 +4931,9 @@ } }, "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", "dev": true }, "errno": { @@ -4819,9 +4955,9 @@ } }, "error-stack-parser": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.2.tgz", - "integrity": "sha512-E1fPutRDdIj/hohG0UpT5mayXNCxXP9d+snxFsPU9X0XgccOumKraa3juDMwTUyi7+Bu5+mCGagjg4IYeNbOdw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.3.tgz", + "integrity": "sha512-vRC4rKv87twMZy92X4+TmUdv3iYMsmePbpG/YguHsfzmZ8bYJZYYep7yrXH09yFUaCEPKgNK5X79+Yq7hwLVOA==", "dev": true, "requires": { "stackframe": "^1.0.4" @@ -4865,9 +5001,9 @@ "dev": true }, "escodegen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", - "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz", + "integrity": "sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==", "dev": true, "requires": { "esprima": "^3.1.3", @@ -4893,9 +5029,9 @@ } }, "eslint": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.0.1.tgz", - "integrity": "sha512-DyQRaMmORQ+JsWShYsSg4OPTjY56u1nCjAmICrE8vLWqyLKxhFXOthwMj1SA8xwfrv0CofLNVnqbfyhwCkaO0w==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.2.2.tgz", + "integrity": "sha512-mf0elOkxHbdyGX1IJEUsNBzCDdyoUgljF3rRlgfyYh0pwGnreLc0jjD6ZuleOibjmnUWZLY2eXwSooeOgGJ2jw==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -4904,44 +5040,73 @@ "cross-spawn": "^6.0.5", "debug": "^4.0.1", "doctrine": "^3.0.0", - "eslint-scope": "^4.0.3", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^6.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.2", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.1", "esquery": "^1.0.1", "esutils": "^2.0.2", "file-entry-cache": "^5.0.1", "functional-red-black-tree": "^1.0.1", - "glob-parent": "^3.1.0", + "glob-parent": "^5.0.0", "globals": "^11.7.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^6.2.2", + "inquirer": "^6.4.1", "is-glob": "^4.0.0", "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.3.0", - "lodash": "^4.17.11", + "lodash": "^4.17.14", "minimatch": "^3.0.4", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", "optionator": "^0.8.2", "progress": "^2.0.0", "regexpp": "^2.0.1", - "semver": "^5.5.1", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", "table": "^5.2.3", - "text-table": "^0.2.0" + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.2.tgz", + "integrity": "sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.0.0" + } + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", "dev": true }, + "glob-parent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.0.0.tgz", + "integrity": "sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, "import-fresh": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", @@ -4952,6 +5117,12 @@ "resolve-from": "^4.0.0" } }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -4959,26 +5130,23 @@ "dev": true }, "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "dev": true } } }, "eslint-config-standard": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-13.0.0.tgz", - "integrity": "sha512-GRvEpe2lnML3qPqNryLPjgbU0nDeGBEWOC/IMfn/DjDLyO7DoASyDtGtPhN+Z+XDGUzrHWF8dKDLdDx2bO6CGw==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-14.1.0.tgz", + "integrity": "sha512-EF6XkrrGVbvv8hL/kYa/m6vnvmUT+K82pJJc4JJVMM6+Qgqh0pnwprSxdduDLB9p/7bIxD+YV5O0wfb8lmcPbA==", "dev": true }, "eslint-import-resolver-node": { @@ -5009,9 +5177,9 @@ } }, "eslint-module-utils": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.0.tgz", - "integrity": "sha512-14tltLm38Eu3zS+mt0KvILC3q8jyIAH518MlG+HO0p+yK885Lb1UHTY/UgR91eOyGdmxAPb+OLoW4znqIT6Ndw==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.1.tgz", + "integrity": "sha512-H6DOj+ejw7Tesdgbfs4jeS4YMFrT8uI8xwd1gtQqXssaR0EQ26L+2O/w6wkYFy2MymON0fTwHmXBvvfLNZVZEw==", "dev": true, "requires": { "debug": "^2.6.8", @@ -5055,9 +5223,9 @@ } }, "eslint-plugin-import": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.18.0.tgz", - "integrity": "sha512-PZpAEC4gj/6DEMMoU2Df01C5c50r7zdGIN52Yfi7CvvWaYssG7Jt5R9nFG5gmqodxNOz9vQS87xk6Izdtpdrig==", + "version": "2.18.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz", + "integrity": "sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ==", "dev": true, "requires": { "array-includes": "^3.0.3", @@ -5067,8 +5235,8 @@ "eslint-import-resolver-node": "^0.3.2", "eslint-module-utils": "^2.4.0", "has": "^1.0.3", - "lodash": "^4.17.11", "minimatch": "^3.0.4", + "object.values": "^1.1.0", "read-pkg-up": "^2.0.0", "resolve": "^1.11.0" }, @@ -5189,9 +5357,9 @@ "dev": true }, "eslint-plugin-standard": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.0.tgz", - "integrity": "sha512-OwxJkR6TQiYMmt1EsNRMe5qG3GsbjlcOhbGUBY4LtavF9DsLaTcoR+j2Tdjqi23oUwKNUqX7qcn5fPStafMdlA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz", + "integrity": "sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ==", "dev": true }, "eslint-plugin-vue": { @@ -5226,20 +5394,32 @@ "dev": true }, "espree": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.0.0.tgz", - "integrity": "sha512-lJvCS6YbCn3ImT3yKkPe0+tJ+mH6ljhGNjHQH9mRtiO6gjhVAOhVXW1yjnwqGwTkK3bGbye+hb00nFNmu0l/1Q==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.1.tgz", + "integrity": "sha512-EYbr8XZUhWbYCqQRW0duU5LxzL5bETN6AjKBGy1302qqzPaCH10QbRg3Wvco79Z8x9WbiE8HYB4e75xl6qUYvQ==", "dev": true, "requires": { - "acorn": "^6.0.7", - "acorn-jsx": "^5.0.0", - "eslint-visitor-keys": "^1.0.0" + "acorn": "^7.0.0", + "acorn-jsx": "^5.0.2", + "eslint-visitor-keys": "^1.1.0" }, "dependencies": { "acorn": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.0.tgz", - "integrity": "sha512-8oe72N3WPMjA+2zVG71Ia0nXZ8DpQH+QyyHO+p06jT8eg8FGG3FbcUIi8KziHlAfheJQZeoqbvq1mQSQHXKYLw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.0.0.tgz", + "integrity": "sha512-PaF/MduxijYYt7unVGRuds1vBC9bFxbNf+VWqhOClfdgy7RlVkQqt610ig1/yxTgsDIfW1cWDel5EBbOy3jdtQ==", + "dev": true + }, + "acorn-jsx": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.2.tgz", + "integrity": "sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw==", + "dev": true + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", "dev": true } } @@ -5275,9 +5455,9 @@ "dev": true }, "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, "etag": { @@ -5735,19 +5915,6 @@ "requires": { "loader-utils": "^1.0.2", "schema-utils": "^1.0.0" - }, - "dependencies": { - "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": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } } }, "filename-regex": { @@ -5874,6 +6041,17 @@ "flatted": "^2.0.0", "rimraf": "2.6.3", "write": "1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, "flatted": { @@ -5893,12 +6071,12 @@ } }, "follow-redirects": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz", - "integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.8.1.tgz", + "integrity": "sha512-micCIbldHioIegeKs41DoH0KS3AXfFzgS30qVkM6z/XOE/GJgvmsoc839NUqa1B9udYe9dQxgv7KFwng6+p/dw==", "dev": true, "requires": { - "debug": "^3.2.6" + "debug": "^3.0.0" }, "dependencies": { "debug": { @@ -6708,9 +6886,9 @@ } }, "graceful-fs": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", - "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", "dev": true }, "growly": { @@ -6880,9 +7058,9 @@ "dev": true }, "highlight.js": { - "version": "9.15.8", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.15.8.tgz", - "integrity": "sha512-RrapkKQWwE+wKdF73VsOa2RQdIoO3mxwJ4P8mhbI6KYJUraUHRKM5w5zQQKXNk0xNL4UVRdulV9SBJcmzJNzVA==", + "version": "9.15.10", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.15.10.tgz", + "integrity": "sha512-RoV7OkQm0T3os3Dd2VHLNMoaoDVx77Wygln3n9l5YV172XonWG6rgQD3XnF/BuFFZw9A0TJgmMSO8FEWQgvcXw==", "dev": true }, "hmac-drbg": { @@ -6913,9 +7091,9 @@ "dev": true }, "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.4.tgz", + "integrity": "sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==", "dev": true }, "hpack.js": { @@ -7071,6 +7249,12 @@ "readable-stream": "^3.1.1" }, "dependencies": { + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, "readable-stream": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", @@ -7279,6 +7463,12 @@ "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", @@ -7302,9 +7492,9 @@ "dev": true }, "inquirer": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.0.tgz", - "integrity": "sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", "dev": true, "requires": { "ansi-escapes": "^3.2.0", @@ -7323,9 +7513,9 @@ }, "dependencies": { "lodash": { - "version": "4.17.14", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.14.tgz", - "integrity": "sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw==", + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true } } @@ -7411,6 +7601,12 @@ } } }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "dev": true + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -8943,9 +9139,9 @@ } }, "js-beautify": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.10.0.tgz", - "integrity": "sha512-OMwf/tPDpE/BLlYKqZOhqWsd3/z2N3KOlyn1wsCRGFwViE8LOQTcDtathQvHvZc+q+zWmcNAbwKSC+iJoMaH2Q==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.10.2.tgz", + "integrity": "sha512-ZtBYyNUYJIsBWERnQP0rPN9KjkrDfJcMjuVGcvXOUJrD1zmOGwhRwQ4msG+HJ+Ni/FA7+sRQEMYVzdTQDvnzvQ==", "dev": true, "requires": { "config-chain": "^1.1.12", @@ -9030,6 +9226,14 @@ "whatwg-url": "^6.4.1", "ws": "^5.2.0", "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + } } }, "jsesc": { @@ -9092,12 +9296,6 @@ "graceful-fs": "^4.1.6" } }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -9352,9 +9550,9 @@ }, "dependencies": { "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true } } @@ -9374,6 +9572,12 @@ "tmpl": "1.0.x" } }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", + "dev": true + }, "map-age-cleaner": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", @@ -9416,9 +9620,9 @@ } }, "mdn-data": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz", - "integrity": "sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA==", + "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": { @@ -9485,9 +9689,9 @@ } }, "merge2": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz", - "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.4.tgz", + "integrity": "sha512-FYE8xI+6pjFOhokZu0We3S5NKCirLbCzSh2Usf3qEyr4X8U+0jNg9P8RZ4qz+V2UoECLVwSyzU3LxXBaLGtD3A==", "dev": true }, "methods": { @@ -9576,17 +9780,6 @@ "query-string": "^5.0.1", "sort-keys": "^2.0.0" } - }, - "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": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } } } }, @@ -9786,13 +9979,13 @@ } }, "node-cache": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-4.2.0.tgz", - "integrity": "sha512-obRu6/f7S024ysheAjoYFEEBqqDWv4LOMNJEuO8vMeEw2AT4z+NCzO4hlc2lhI4vATzbCQv6kke9FVdx0RbCOw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-4.2.1.tgz", + "integrity": "sha512-BOb67bWg2dTyax5kdef5WfU3X8xu4wPg+zHzkvls0Q/QpYycIFRLEEIdAx9Wma43DxG6Qzn4illdZoYseKWa4A==", "dev": true, "requires": { "clone": "2.x", - "lodash": "4.x" + "lodash": "^4.17.15" }, "dependencies": { "clone": { @@ -9800,6 +9993,12 @@ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", "dev": true + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true } } }, @@ -9866,9 +10065,9 @@ } }, "node-notifier": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.0.tgz", - "integrity": "sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ==", + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", + "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", "dev": true, "requires": { "growly": "^1.3.0", @@ -9879,9 +10078,9 @@ } }, "node-releases": { - "version": "1.1.25", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.25.tgz", - "integrity": "sha512-fI5BXuk83lKEoZDdH3gRhtsNgh05/wZacuXkgbiYkceE7+QIMXOg98n9ZV7mz27B+kFHnqHcUpscZZlGRSmTpQ==", + "version": "1.1.28", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.28.tgz", + "integrity": "sha512-AQw4emh6iSXnCpDiFe0phYcThiccmkNWMZnFZ+lDJjAP8J0m2fVd59duvUUyuTirQOhIAajTFkzG6FHCLBO59g==", "dev": true, "requires": { "semver": "^5.3.0" @@ -10006,6 +10205,12 @@ } } }, + "object-is": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", + "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=", + "dev": true + }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -10593,9 +10798,9 @@ } }, "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "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" @@ -10634,9 +10839,9 @@ "dev": true }, "portfinder": { - "version": "1.0.20", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.20.tgz", - "integrity": "sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw==", + "version": "1.0.23", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.23.tgz", + "integrity": "sha512-B729mL/uLklxtxuiJKfQ84WPxNw5a7Yhx3geQZdcA4GjNjZSTSSMMWyoennMVnTWSmAR0lMdzWYN0JLnHrg1KQ==", "dev": true, "requires": { "async": "^1.5.2", @@ -10792,19 +10997,6 @@ "postcss": "^7.0.0", "postcss-load-config": "^2.0.0", "schema-utils": "^1.0.0" - }, - "dependencies": { - "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": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } } }, "postcss-merge-longhand": { @@ -11339,9 +11531,9 @@ "dev": true }, "psl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.2.0.tgz", - "integrity": "sha512-GEn74ZffufCmkDDLNcl3uuyF/aSD6exEyh1v/ZSdAomB82t6G9hzJVRx0jBmLDW+VfZqks3aScmMw9DszwUalA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.3.0.tgz", + "integrity": "sha512-avHdspHO+9rQTLbv1RO+MPYeP/SzsCoxofjVnHanETfQhTJrmB0HlDoW+EiN/R+C0BZ+gERab9NY0lPN2TxNag==", "dev": true }, "public-encrypt": { @@ -11606,15 +11798,15 @@ } }, "regenerator-runtime": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", - "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==", + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", "dev": true }, "regenerator-transform": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.0.tgz", - "integrity": "sha512-rtOelq4Cawlbmq9xuMR5gdFmv7ku/sFoB7sRiywx7aq53bc52b4j6zvH7Te1Vt/X2YveDKnCGUbioieU7FEL3w==", + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz", + "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==", "dev": true, "requires": { "private": "^0.1.6" @@ -11640,11 +11832,20 @@ } }, "regexp-tree": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.11.tgz", - "integrity": "sha512-7/l/DgapVVDzZobwMCCgMlqiqyLFJ0cduo/j+3BcDJIB+yJdsYCfKuI3l/04NV+H/rfNRdPIDbXNZHM9XvQatg==", + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.12.tgz", + "integrity": "sha512-TsXZ8+cv2uxMEkLfgwO0E068gsNMLfuYwMMhiUxf0Kw2Vcgzq93vgl6wIlIYuPmfMqMjfQ9zAporiozqCnwLuQ==", "dev": true }, + "regexp.prototype.flags": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz", + "integrity": "sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2" + } + }, "regexpp": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", @@ -11652,13 +11853,13 @@ "dev": true }, "regexpu-core": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.4.tgz", - "integrity": "sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ==", + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.5.tgz", + "integrity": "sha512-FpI67+ky9J+cDizQUJlIlNZFKual/lUkFr1AG6zOCpwZ9cLrg8UUVakyUQJD7fCDIe9Z2nwTQJNPyonatNmDFQ==", "dev": true, "requires": { "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.0.2", + "regenerate-unicode-properties": "^8.1.0", "regjsgen": "^0.5.0", "regjsparser": "^0.6.0", "unicode-match-property-ecmascript": "^1.0.4", @@ -11910,9 +12111,9 @@ "dev": true }, "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "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" @@ -11999,6 +12200,15 @@ "watch": "~0.18.0" } }, + "sass": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.22.10.tgz", + "integrity": "sha512-DUpS1tVMGCH6gr/N9cXCoemrjoNdOLhAHfQ37fJw2A5ZM4gSI9ej/8Xi95Xwus03RqZ2zdSnKZGULL7oS+jfMA==", + "dev": true, + "requires": { + "chokidar": ">=2.0.0 <4.0.0" + } + }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", @@ -12006,12 +12216,13 @@ "dev": true }, "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "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": { "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", "ajv-keywords": "^3.1.0" } }, @@ -12089,9 +12300,9 @@ } }, "serialize-javascript": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.7.0.tgz", - "integrity": "sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.8.0.tgz", + "integrity": "sha512-3tHgtF4OzDmeKYj6V9nSyceRS0UJ3C7VqyD2Yj28vC/z2j6jG5FmFGahOKMD9CrglxTm3tETr87jEypaYV8DUg==", "dev": true }, "serve-index": { @@ -12229,16 +12440,10 @@ "dev": true }, "shell-quote": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", - "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", - "dev": true, - "requires": { - "array-filter": "~0.0.0", - "array-map": "~0.0.0", - "array-reduce": "~0.0.0", - "jsonify": "~0.0.0" - } + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.1.tgz", + "integrity": "sha512-2kUqeAGnMAu6YrTPX4E3LfxacH9gKljzVjlkUeSqY0soGwK4KLl7TURXCem712tkhBCeeaFP9QK4dKn88s3Icg==", + "dev": true }, "shellwords": { "version": "0.1.1", @@ -12499,9 +12704,9 @@ } }, "source-map-support": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", - "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -12555,9 +12760,9 @@ "dev": true }, "spdy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.0.tgz", - "integrity": "sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", + "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", "dev": true, "requires": { "debug": "^4.1.0", @@ -12840,6 +13045,12 @@ "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": "2.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", @@ -12892,17 +13103,16 @@ "dev": true }, "svgo": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.2.2.tgz", - "integrity": "sha512-rAfulcwp2D9jjdGu+0CuqlrAUin6bBWrpoqXWwKDZZZJfXcUXQSxLJOFJCQCSA0x0pP2U0TxSlJu2ROq5Bq6qA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.0.tgz", + "integrity": "sha512-MLfUA6O+qauLDbym+mMZgtXCGRfIxyQoeH6IKVcFslyODEe/ElJNwr0FohQ3xG4C6HK6bk3KYPPXwHVJk3V5NQ==", "dev": true, "requires": { "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.28", - "css-url-regex": "^1.1.0", + "css-tree": "1.0.0-alpha.33", "csso": "^3.5.1", "js-yaml": "^3.13.1", "mkdirp": "~0.5.1", @@ -12920,17 +13130,23 @@ "dev": true }, "table": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.1.tgz", - "integrity": "sha512-E6CK1/pZe2N75rGZQotFOdmzWQ1AILtgYbMAbAjvms0S1l5IDB47zG3nCnFGB/w+7nB3vKofbLXCH7HPBo864w==", + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", "dev": true, "requires": { - "ajv": "^6.9.1", - "lodash": "^4.17.11", + "ajv": "^6.10.2", + "lodash": "^4.17.14", "slice-ansi": "^2.1.0", "string-width": "^3.0.0" }, "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -12951,9 +13167,9 @@ "dev": true }, "terser": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.1.2.tgz", - "integrity": "sha512-jvNoEQSPXJdssFwqPSgWjsOrb+ELoE+ILpHPKXC83tIxOlh2U75F1KuB2luLD/3a6/7K3Vw5pDn+hvu0C4AzSw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.2.1.tgz", + "integrity": "sha512-cGbc5utAcX4a9+2GGVX4DsenG6v0x3glnDi5hx8816X1McEAwPlPgRtXPJzSBsbpILxZ8MQMT0KvArLuE0HP5A==", "dev": true, "requires": { "commander": "^2.20.0", @@ -12970,34 +13186,22 @@ } }, "terser-webpack-plugin": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.3.0.tgz", - "integrity": "sha512-W2YWmxPjjkUcOWa4pBEv4OP4er1aeQJlSo2UhtCFQCuRXEHjOFscO8VyWHj9JLlA0RzQb8Y2/Ta78XZvT54uGg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz", + "integrity": "sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg==", "dev": true, "requires": { - "cacache": "^11.3.2", - "find-cache-dir": "^2.0.0", + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", "is-wsl": "^1.1.0", - "loader-utils": "^1.2.3", "schema-utils": "^1.0.0", "serialize-javascript": "^1.7.0", "source-map": "^0.6.1", - "terser": "^4.0.0", - "webpack-sources": "^1.3.0", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", "worker-farm": "^1.7.0" }, "dependencies": { - "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": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -13144,9 +13348,9 @@ } }, "thread-loader": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/thread-loader/-/thread-loader-2.1.2.tgz", - "integrity": "sha512-7xpuc9Ifg6WU+QYw/8uUqNdRwMD+N5gjwHKMqETrs96Qn+7BHwECpt2Brzr4HFlf4IAkZsayNhmGdbkBsTJ//w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/thread-loader/-/thread-loader-2.1.3.tgz", + "integrity": "sha512-wNrVKH2Lcf8ZrWxDF/khdlLlsTMczdcwPA9VEK4c2exlEPynYWxi9op3nPTo5lAnDIkE0rQEB3VBP+4Zncc9Hg==", "dev": true, "requires": { "loader-runner": "^2.3.1", @@ -13183,9 +13387,9 @@ "dev": true }, "timers-browserify": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", - "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", "dev": true, "requires": { "setimmediate": "^1.0.4" @@ -13391,9 +13595,9 @@ "dev": true }, "tslint": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.18.0.tgz", - "integrity": "sha512-Q3kXkuDEijQ37nXZZLKErssQVnwCV/+23gFEMROi8IlbaBG6tXqLPQJ5Wjcyt/yHPKBC+hD5SzuGaMora+ZS6w==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.19.0.tgz", + "integrity": "sha512-1LwwtBxfRJZnUvoS9c0uj8XQtAnyhWr9KlNvDIdB+oXyT+VpsOAaEhEgKi1HrZ8rq0ki/AAnbGSv4KM6/AfVZw==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -13423,9 +13627,9 @@ } }, "tsutils": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.14.0.tgz", - "integrity": "sha512-SmzGbB0l+8I0QwsPgjooFRaRvHLBLNYM8SeQ0k6rtNDru5sCGeLJcZdwilNndN+GysuFjF5EIYgN8GfFG6UeUw==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", "dev": true, "requires": { "tslib": "^1.8.1" @@ -13484,9 +13688,9 @@ "dev": true }, "typescript": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.3.tgz", - "integrity": "sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.6.2.tgz", + "integrity": "sha512-lmQ4L+J6mnu3xweP8+rOrUwzmN+MRAj7TgtJtDaXE5PMyX2kCrklhg3rvOsOIfNeAWMQWO2F1GPc1kMD2vLAfw==", "dev": true }, "uglify-js": { @@ -13691,19 +13895,6 @@ "loader-utils": "^1.1.0", "mime": "^2.0.3", "schema-utils": "^1.0.0" - }, - "dependencies": { - "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": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } } }, "url-parse": { @@ -13768,9 +13959,15 @@ "dev": true }, "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", "dev": true }, "validate-npm-package-license": { @@ -13880,12 +14077,12 @@ } }, "vue-loader": { - "version": "15.7.0", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.7.0.tgz", - "integrity": "sha512-x+NZ4RIthQOxcFclEcs8sXGEWqnZHodL2J9Vq+hUz+TDZzBaDIh1j3d9M2IUlTjtrHTZy4uMuRdTi8BGws7jLA==", + "version": "15.7.1", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.7.1.tgz", + "integrity": "sha512-fwIKtA23Pl/rqfYP5TSGK7gkEuLhoTvRYW+TU7ER3q9GpNLt/PjG5NLv3XHRDiTg7OPM1JcckBgds+VnAc+HbA==", "dev": true, "requires": { - "@vue/component-compiler-utils": "^2.5.1", + "@vue/component-compiler-utils": "^3.0.0", "hash-sum": "^1.0.2", "loader-utils": "^1.1.0", "vue-hot-reload-api": "^2.3.0", @@ -13893,18 +14090,17 @@ } }, "vue-property-decorator": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/vue-property-decorator/-/vue-property-decorator-8.2.1.tgz", - "integrity": "sha512-zgtcvzGB2JpDqnIxVhTK+6m+dv3uyhYs+tL8elL+DWiXj9kDonKcPY7f1DHYX1NlnWPCj7ht0nL/i8+S1gg76Q==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/vue-property-decorator/-/vue-property-decorator-8.2.2.tgz", + "integrity": "sha512-3gRrIeoUtjXvkoMX2stJsVs7805Pa9MXEndnk21ej+sWO7AIc5HF1TKqK0Pox5TEjpO02UbadIF0QWNrx6ZwXQ==", "requires": { - "vue": "^2.6.10", "vue-class-component": "^7.0.1" } }, "vue-router": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.0.7.tgz", - "integrity": "sha512-utJ+QR3YlIC/6x6xq17UMXeAfxEvXA0VKD3PiSio7hBOZNusA1jXcbxZxVEfJunLp48oonjTepY8ORoIlRx/EQ==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.1.2.tgz", + "integrity": "sha512-WssQEHSEvIS1/CI4CO2T8LJdoK4Q9Ngox28K7FDNMTfzNTk2WS5D0dDlqYCaPG+AG4Z8wJkn1KrBc7AhspZJUQ==" }, "vue-style-loader": { "version": "4.1.2", @@ -13933,9 +14129,9 @@ "dev": true }, "vuetify": { - "version": "1.5.16", - "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-1.5.16.tgz", - "integrity": "sha512-yBgOsfurKQkeS+l+rrTQZ2bFk0D9ezjHhkuVM5A/yVzcg62sY2nfYaq/H++uezBWC9WYFrp/5OmSocJQcWn9Qw==" + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-2.0.11.tgz", + "integrity": "sha512-H5g0Wf/KHS1t29X+kh5hkj25dZNITCDtOb3UGl1YXx5Ua3xXUfXBRjKP50BJ7uZtQ3Jk9CiwoA6k3Lstv6zFow==" }, "vuex": { "version": "3.1.1", @@ -13948,9 +14144,9 @@ "integrity": "sha512-m0w7/FMsNcwJgunJeM+wcNaHzK2KX1K1rw2WUQf7Q16ndXHo7pflRyOV/E8795JO/7fstyjH3EgqBI4h4n4qXQ==" }, "vuex-module-decorators": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/vuex-module-decorators/-/vuex-module-decorators-0.9.9.tgz", - "integrity": "sha512-SxCyuv9FEwUc2jKfCtAHaMDwsC0acVLBeZo6OUlrA8e+tzT5qwvnZevrRIpPJY4nfiiBvIBTYFu+3l+c2Bemeg==", + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/vuex-module-decorators/-/vuex-module-decorators-0.10.1.tgz", + "integrity": "sha512-OBvHEeer8uT///oTWqgf7kPe0j3hb9IC9ahdk41S4gBHhn5YUHpyXdry2OXp77zPzQ1P6wTY+Ju+/VUcU5mhzA==", "dev": true }, "w3c-hr-time": { @@ -14017,41 +14213,40 @@ "dev": true }, "webpack": { - "version": "4.28.4", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.28.4.tgz", - "integrity": "sha512-NxjD61WsK/a3JIdwWjtIpimmvE6UrRi3yG54/74Hk9rwNj5FPkA4DJCf1z4ByDWLkvZhTZE+P3C/eh6UD5lDcw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-module-context": "1.7.11", - "@webassemblyjs/wasm-edit": "1.7.11", - "@webassemblyjs/wasm-parser": "1.7.11", - "acorn": "^5.6.2", - "acorn-dynamic-import": "^3.0.0", - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0", - "chrome-trace-event": "^1.0.0", + "version": "4.39.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.39.3.tgz", + "integrity": "sha512-BXSI9M211JyCVc3JxHWDpze85CvjC842EvpRsVTc/d15YJGlox7GIDd38kJgWrb3ZluyvIjgenbLDMBQPDcxYQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.2.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.0", + "eslint-scope": "^4.0.3", "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "micromatch": "^3.1.8", - "mkdirp": "~0.5.0", - "neo-async": "^2.5.0", - "node-libs-browser": "^2.0.0", - "schema-utils": "^0.4.4", - "tapable": "^1.1.0", - "terser-webpack-plugin": "^1.1.0", - "watchpack": "^1.5.0", - "webpack-sources": "^1.3.0" + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.1", + "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.1", + "watchpack": "^1.6.0", + "webpack-sources": "^1.4.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==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.4.1.tgz", + "integrity": "sha512-Bs8D/1zF+17lhqj2OYmzi7HEVYqEVxu7lCO9Ff8BwajenOU0vAwEoV8e4ICCPNZAcqR1PCR/7o2SkW+cnCmF0A==", "dev": true, "requires": { "acorn": "^6.0.7", @@ -14063,16 +14258,16 @@ "express": "^4.16.3", "filesize": "^3.6.1", "gzip-size": "^5.0.0", - "lodash": "^4.17.10", + "lodash": "^4.17.15", "mkdirp": "^0.5.1", "opener": "^1.5.1", "ws": "^6.0.0" }, "dependencies": { - "acorn": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.0.tgz", - "integrity": "sha512-8oe72N3WPMjA+2zVG71Ia0nXZ8DpQH+QyyHO+p06jT8eg8FGG3FbcUIi8KziHlAfheJQZeoqbvq1mQSQHXKYLw==", + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, "ws": { @@ -14109,9 +14304,9 @@ } }, "webpack-dev-server": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.7.2.tgz", - "integrity": "sha512-mjWtrKJW2T9SsjJ4/dxDC2fkFVUw8jlpemDERqV0ZJIkjjjamR2AbQlr3oz+j4JLhYCHImHnXZK5H06P2wvUew==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.8.0.tgz", + "integrity": "sha512-Hs8K9yI6pyMvGkaPTeTonhD6JXVsigXDApYk9JLW4M7viVBspQvb1WdAcWxqtmttxNW4zf2UFLsLNe0y87pIGQ==", "dev": true, "requires": { "ansi-html": "0.0.7", @@ -14127,23 +14322,25 @@ "import-local": "^2.0.0", "internal-ip": "^4.3.0", "ip": "^1.1.5", + "is-absolute-url": "^3.0.0", "killable": "^1.0.1", "loglevel": "^1.6.3", "opn": "^5.5.0", "p-retry": "^3.0.1", - "portfinder": "^1.0.20", + "portfinder": "^1.0.21", "schema-utils": "^1.0.0", "selfsigned": "^1.10.4", - "semver": "^6.1.1", + "semver": "^6.3.0", "serve-index": "^1.9.1", "sockjs": "0.3.19", "sockjs-client": "1.3.0", - "spdy": "^4.0.0", + "spdy": "^4.0.1", "strip-ansi": "^3.0.1", "supports-color": "^6.1.0", "url": "^0.11.0", "webpack-dev-middleware": "^3.7.0", "webpack-log": "^2.0.0", + "ws": "^6.2.1", "yargs": "12.0.5" }, "dependencies": { @@ -14178,6 +14375,12 @@ "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", "dev": true }, + "is-absolute-url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.1.tgz", + "integrity": "sha512-c2QjUwuMxLsld90sj3xYzpFYWJtuxkIn1f5ua9RTEYJt/vV2IsM+Py00/6qjV7qExgifUvt7qfyBGBBKm+2iBg==", + "dev": true + }, "lcid": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", @@ -14226,9 +14429,9 @@ } }, "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "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" @@ -14249,21 +14452,10 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, - "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": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, "semver": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz", - "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, "strip-ansi": { @@ -14284,6 +14476,15 @@ "has-flag": "^3.0.0" } }, + "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" + } + }, "yargs": { "version": "12.0.5", "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", @@ -14327,18 +14528,26 @@ } }, "webpack-merge": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.1.tgz", - "integrity": "sha512-4p8WQyS98bUJcCvFMbdGZyZmsKuWjWVnVHnAS3FFg0HDaRVrPbkivx2RYCre8UiemD67RsiFFLfn4JhLAin8Vw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", "dev": true, "requires": { - "lodash": "^4.17.5" + "lodash": "^4.17.15" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } } }, "webpack-sources": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", - "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", + "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", diff --git a/ui/package.json b/ui/package.json index 30bbab84f..91a008ce1 100644 --- a/ui/package.json +++ b/ui/package.json @@ -8,42 +8,43 @@ "test:unit": "vue-cli-service test:unit" }, "dependencies": { - "@types/node": "^12.6.2", + "@types/node": "^12.7.2", "axios": "^0.19.0", - "clipboard-copy": "^3.0.0", - "keycloak-js": "^6.0.1", + "clipboard-copy": "^3.1.0", + "keycloak-js": "6.0.1", "vue": "^2.6.10", "vue-class-component": "^7.1.0", - "vue-property-decorator": "^8.2.1", - "vue-router": "^3.0.7", - "vuetify": "^1.5.16", + "vue-property-decorator": "^8.2.2", + "vue-router": "^3.1.2", + "vuetify": "^2.0.11", "vuex": "^3.1.1", "vuex-class": "^0.3.2" }, "devDependencies": { - "@mdi/font": "^3.7.95", - "@types/jest": "^24.0.15", - "@typescript-eslint/eslint-plugin": "^1.11.0", - "@typescript-eslint/parser": "^1.11.0", - "@vue/cli-plugin-babel": "^3.9.2", - "@vue/cli-plugin-typescript": "^3.9.0", - "@vue/cli-plugin-unit-jest": "^3.9.0", - "@vue/cli-service": "^3.9.2", + "@mdi/font": "^4.2.95", + "@types/jest": "^24.0.18", + "@typescript-eslint/eslint-plugin": "^2.0.0", + "@typescript-eslint/parser": "^2.0.0", + "@vue/cli-plugin-babel": "^3.11.0", + "@vue/cli-plugin-typescript": "^3.11.0", + "@vue/cli-plugin-unit-jest": "^3.11.0", + "@vue/cli-service": "^3.11.0", "@vue/eslint-config-typescript": "^4.0.0", "@vue/test-utils": "1.0.0-beta.29", "babel-core": "7.0.0-bridge.0", - "eslint": "^6.0.1", - "eslint-config-standard": "^13.0.0", - "eslint-plugin-import": "^2.18.0", + "eslint": "^6.2.2", + "eslint-config-standard": "^14.1.0", + "eslint-plugin-import": "^2.18.2", "eslint-plugin-node": "^9.1.0", "eslint-plugin-promise": "^4.2.1", - "eslint-plugin-standard": "^4.0.0", + "eslint-plugin-standard": "^4.0.1", "eslint-plugin-vue": "^5.2.3", "jest-html-reporter": "^2.5.0", + "sass": "^1.22.10", "ts-jest": "^24.0.2", - "typescript": "^3.5.3", + "typescript": "^3.6.2", "vue-template-compiler": "^2.6.10", - "vuex-module-decorators": "^0.9.9" + "vuex-module-decorators": "^0.10.1" }, "homepage": "https://github.com/jvalue/ods-webclient", "licenses": [ diff --git a/ui/src/App.vue b/ui/src/App.vue index 086fbc83c..1c80f82d0 100644 --- a/ui/src/App.vue +++ b/ui/src/App.vue @@ -1,52 +1,45 @@ diff --git a/ui/src/pipeline/NotificationOverview.vue b/ui/src/pipeline/NotificationOverview.vue new file mode 100644 index 000000000..2b9c6b606 --- /dev/null +++ b/ui/src/pipeline/NotificationOverview.vue @@ -0,0 +1,136 @@ + + + diff --git a/ui/src/pipeline/PipelineEdit.vue b/ui/src/pipeline/PipelineEdit.vue index 02555853b..2a31938e5 100644 --- a/ui/src/pipeline/PipelineEdit.vue +++ b/ui/src/pipeline/PipelineEdit.vue @@ -223,7 +223,8 @@ export default class PipelineEdit extends Vue { periodic: true, firstExecution: new Date(Date.now() + 600000), interval: 60000 - } + }, + notifications: [] } private dialogIntervalHours: number = 1 diff --git a/ui/src/pipeline/PipelineOverview.vue b/ui/src/pipeline/PipelineOverview.vue index 6cafe006b..d97014778 100644 --- a/ui/src/pipeline/PipelineOverview.vue +++ b/ui/src/pipeline/PipelineOverview.vue @@ -65,6 +65,10 @@ Delete mdi mdi-delete + + Notifications + mdi mdi-alarm + @@ -124,6 +128,10 @@ export default class PipelineOverview extends Vue { this.deletePipelineAction(pipeline.id); } + private onNotifications (pipeline: Pipeline) { + this.$router.push({ name: 'notification-overview', params: { pipelineId: `${pipeline.id}` } }) + } + private filterOnlyDisplayName (value: any, search: string, item: Pipeline): boolean { return value != null && search != null && diff --git a/ui/src/pipeline/module.ts b/ui/src/pipeline/module.ts index 781ebed14..960c32d45 100644 --- a/ui/src/pipeline/module.ts +++ b/ui/src/pipeline/module.ts @@ -1,6 +1,7 @@ import { Module, VuexModule, Mutation, Action } from 'vuex-module-decorators' import Pipeline from './pipeline' import * as RestService from './pipelineRest' +import NotificationConfig from '@/pipeline/notificationConfig' @Module({ namespaced: true }) export default class PipelineModule extends VuexModule { @@ -8,7 +9,7 @@ export default class PipelineModule extends VuexModule { private selectedPipeline: Pipeline = {} as unknown as Pipeline - private isLoadingPipelines: boolean = true + private isLoadingPipelines = true @Mutation public setPipelines (pipelines: Pipeline[]): void { @@ -55,4 +56,32 @@ export default class PipelineModule extends VuexModule { await RestService.deletePipeline(pipelineId) return RestService.getAllPipelines() } + + @Action({ commit: 'setSelectedPipeline' }) + public async addNotification (notification: NotificationConfig): Promise { + const newPipeline: Pipeline = Object.assign({}, this.selectedPipeline) + newPipeline.notifications.push(Object.assign({}, notification)) + await RestService.updatePipeline(newPipeline) + return RestService.getPipelineById(newPipeline.id) + } + + @Action({ commit: 'setSelectedPipeline' }) + public async updateNotification (notification: NotificationConfig): Promise { + console.log('update') + const newPipeline: Pipeline = Object.assign({}, this.selectedPipeline) + const nIdx = this.selectedPipeline.notifications + .findIndex(n => n.notificationId === notification.notificationId) + newPipeline.notifications[nIdx] = notification + await RestService.updatePipeline(newPipeline) + return RestService.getPipelineById(newPipeline.id) + } + + @Action({ commit: 'setSelectedPipeline' }) + public async removeNotification (notification: NotificationConfig): Promise { + const newPipeline: Pipeline = Object.assign({}, this.selectedPipeline) + newPipeline.notifications = this.selectedPipeline.notifications + .filter(n => n.notificationId !== notification.notificationId) + await RestService.updatePipeline(newPipeline) + return RestService.getPipelineById(newPipeline.id) + } } diff --git a/ui/src/pipeline/notificationConfig.ts b/ui/src/pipeline/notificationConfig.ts new file mode 100644 index 000000000..353e466d8 --- /dev/null +++ b/ui/src/pipeline/notificationConfig.ts @@ -0,0 +1,10 @@ +export default interface NotificationConfig { + notificationId: number; + notificationType: NotificationType; + condition: string; + url: string; +} + +export enum NotificationType { + WEBHOOK = 'WEBHOOK' +} diff --git a/ui/src/pipeline/notificationEditDialog.ts b/ui/src/pipeline/notificationEditDialog.ts new file mode 100644 index 000000000..1bb62e83d --- /dev/null +++ b/ui/src/pipeline/notificationEditDialog.ts @@ -0,0 +1,7 @@ +import NotificationConfig, { NotificationType } from '@/pipeline/notificationConfig' + +export default interface NotificationEditDialog { + + openDialog(notifcationConfig?: NotificationConfig): void + closeDialog(): void +} diff --git a/ui/src/pipeline/pipeline.ts b/ui/src/pipeline/pipeline.ts index 94e8d7f35..6c6128a3c 100644 --- a/ui/src/pipeline/pipeline.ts +++ b/ui/src/pipeline/pipeline.ts @@ -1,9 +1,12 @@ +import NotificationConfig from '@/pipeline/notificationConfig' + export default interface Pipeline { id: number; adapter: object; metadata: PipelineMetaData; transformations: object[]; trigger: Trigger; + notifications: NotificationConfig[]; } export interface PipelineMetaData { diff --git a/ui/src/pipeline/router.ts b/ui/src/pipeline/router.ts index 80ddf4faf..1c351cee9 100644 --- a/ui/src/pipeline/router.ts +++ b/ui/src/pipeline/router.ts @@ -1,23 +1,30 @@ import PipelineOverview from './PipelineOverview.vue' import PipelineEdit from './PipelineEdit.vue' +import PipelineNotifications from '@/pipeline/NotificationOverview.vue' export default [ { - path: '/pipeline', + path: '/pipelines', name: 'pipeline-overview', component: PipelineOverview, meta: { title: 'Pipeline Overview', requiresAuth: true } }, { - path: '/pipeline/new', + path: '/pipelines/new', name: 'pipeline-new', component: PipelineEdit, meta: { title: 'Create new Pipeline', requiresAuth: true, isEditMode: false } }, { - path: '/pipeline/edit', + path: '/pipelines/:pipelineId', name: 'pipeline-edit', component: PipelineEdit, meta: { title: 'Edit Pipeline', requiresAuth: true, isEditMode: true } + }, + { + path: '/pipelines/:pipelineId/notifications', + name: 'notification-overview', + component: PipelineNotifications, + meta: { title: 'View Notificiations', requiresAuth: true } } ] From 3d10011dddab08e577f2683e1d862cfd82034594 Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Fri, 18 Oct 2019 14:29:43 +0200 Subject: [PATCH 0066/1168] Doc: Fix timestamp in core.http --- doc/example-requests/core.http | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/example-requests/core.http b/doc/example-requests/core.http index b5ec7e388..11c933ac7 100644 --- a/doc/example-requests/core.http +++ b/doc/example-requests/core.http @@ -6,6 +6,7 @@ GET {{baseURL}}/pipelines HTTP/1.1 ### Create a pipeline POST {{baseURL}}/pipelines HTTP/1.1 Content-Type: application/json + { "adapter": { "protocol": "HTTP", @@ -20,7 +21,7 @@ Content-Type: application/json } ], "trigger": { - "firstExecution": "2018-10-07T01:32:00.123", + "firstExecution": "2018-10-07T01:32:00.123Z", "periodic": true, "interval": 60000 }, From 71ad9b0159b1b8ea41ff9e01e2c36ff76e24d548 Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Fri, 18 Oct 2019 15:52:22 +0200 Subject: [PATCH 0067/1168] Scheduler: failure handling if storage structure exists --- scheduler/src/clients/storage-client.ts | 26 +++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/scheduler/src/clients/storage-client.ts b/scheduler/src/clients/storage-client.ts index 51d27ec15..16f9ada9c 100644 --- a/scheduler/src/clients/storage-client.ts +++ b/scheduler/src/clients/storage-client.ts @@ -27,19 +27,29 @@ export async function executeStorage (pipelineConfig: PipelineConfig, data: obje export async function createStructure (pipelineId: number): Promise { const requestBody: object = { - pipelineId + pipelineid: pipelineId + '' } const requestURI = `${STORAGE_SERVICE_URL}/rpc/createstructurefordatasource` - await axios.post( - requestURI, - requestBody, - { - headers: { - 'Content-Type': 'application/json' + try { + await axios.post( + requestURI, + requestBody, + { + headers: { + 'Content-Type': 'application/json' + } } + ) + } catch (e) { + if(e.response.data.code === '42P07') { + // the structure already exists + console.log(`Database structure for pipeline {pipelineId} already exists.`) + return; + } else { + throw e } - ) + } } function getDataRequestUrl (pipelineId: number): string { From b27a3e184cfe791fdd41bf1dea88ca86f5299704 Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Fri, 18 Oct 2019 15:53:07 +0200 Subject: [PATCH 0068/1168] Scheduler: Wait on storage structure construction before adding to pipeline --- scheduler/src/pipeline-scheduling.test.ts | 18 ++++++------ scheduler/src/pipeline-scheduling.ts | 35 +++++++++++++++++++---- 2 files changed, 38 insertions(+), 15 deletions(-) diff --git a/scheduler/src/pipeline-scheduling.test.ts b/scheduler/src/pipeline-scheduling.test.ts index b3c5bbe34..5637e9213 100644 --- a/scheduler/src/pipeline-scheduling.test.ts +++ b/scheduler/src/pipeline-scheduling.test.ts @@ -144,26 +144,26 @@ describe('Scheduler', () => { expect(PipelineScheduling.determineExecutionDate(pipelineConfig)).toEqual(expectedExecution) }) - test('should insert new pipeline', () => { + test('should insert new pipeline', async () => { const timestampInFuture = Date.now() + 5000 const pipelineConfig = generateConfig(true, new Date(timestampInFuture), 10000) - const pipelineJob = PipelineScheduling.upsertPipelineJob(pipelineConfig) + const pipelineJob = await PipelineScheduling.upsertPipelineJob(pipelineConfig) expect(pipelineJob.pipelineConfig).toEqual(pipelineConfig) expect(pipelineJob.scheduleJob).toBeDefined() expect(PipelineScheduling.getPipelineJob(pipelineConfig.id)).toEqual(pipelineJob) }) - test('should update existing pipeline', () => { + test('should update existing pipeline', async () => { const timestampInFuture1 = Date.now() + 5000 const timestampInFuture2 = Date.now() + 100000 const pipelineConfig1 = generateConfig(true, new Date(timestampInFuture1), 10000) - const pipelineJob1 = PipelineScheduling.upsertPipelineJob(pipelineConfig1) + const pipelineJob1 = await PipelineScheduling.upsertPipelineJob(pipelineConfig1) expect(PipelineScheduling.existsPipelineJob(pipelineConfig1.id)).toBeTruthy() const pipelineConfig2 = generateConfig(true, new Date(timestampInFuture2), 10000) - PipelineScheduling.upsertPipelineJob(pipelineConfig2) + await PipelineScheduling.upsertPipelineJob(pipelineConfig2) expect(PipelineScheduling.existsPipelineJob(pipelineConfig1.id)).toBeTruthy() expect(PipelineScheduling.existsEqualPipelineJob(pipelineConfig2)).toBeTruthy() @@ -172,10 +172,10 @@ describe('Scheduler', () => { expect(pipelineJob1).not.toEqual(pipelineConfig2) }) - test('should be equal', () => { + test('should be equal', async () => { const timestampInFuture = Date.now() + 5000 const pipelineConfig1 = generateConfig(true, new Date(timestampInFuture), 10000) - const pipelineJob1 = PipelineScheduling.upsertPipelineJob(pipelineConfig1) + const pipelineJob1 = await PipelineScheduling.upsertPipelineJob(pipelineConfig1) const pipelineConfig2 = generateConfig(true, new Date(timestampInFuture), 10000) expect(PipelineScheduling.existsEqualPipelineJob(pipelineConfig2)).toBeTruthy() @@ -187,7 +187,7 @@ describe('Scheduler', () => { test('should execute pipeline once', async () => { const timestampInFuture = Date.now() + 200 const pipelineConfig = generateConfig(false, new Date(timestampInFuture), 500) - PipelineScheduling.upsertPipelineJob(pipelineConfig) + await PipelineScheduling.upsertPipelineJob(pipelineConfig) await sleep(250) expect(PipelineScheduling.getPipelineJob(pipelineConfig.id)).toBeUndefined() @@ -200,7 +200,7 @@ describe('Scheduler', () => { test('should execute pipeline periodic', async () => { const timestampInFuture = Date.now() + 200 const pipelineConfig = generateConfig(true, new Date(timestampInFuture), 500) - const pipelineJob1 = PipelineScheduling.upsertPipelineJob(pipelineConfig) + const pipelineJob1 = await PipelineScheduling.upsertPipelineJob(pipelineConfig) const nextInvocation1: Date = pipelineJob1.scheduleJob.nextInvocation() await sleep(250) const pipelineJob2 = PipelineScheduling.getPipelineJob(pipelineConfig.id) diff --git a/scheduler/src/pipeline-scheduling.ts b/scheduler/src/pipeline-scheduling.ts index bf118aa44..093a5dddd 100644 --- a/scheduler/src/pipeline-scheduling.ts +++ b/scheduler/src/pipeline-scheduling.ts @@ -25,10 +25,10 @@ export async function initializeJobs (retries = 30): Promise { console.log(`Received ${pipelineConfigurations.length} pipelines from core-service`) - pipelineConfigurations.forEach(pipelineConfig => { + for(let pipelineConfig of pipelineConfigurations) { pipelineConfig.trigger.firstExecution = new Date(pipelineConfig.trigger.firstExecution) - PipelineScheduling.upsertPipelineJob(pipelineConfig) // assuming core service checks for duplicates - }) + await PipelineScheduling.upsertPipelineJob(pipelineConfig) // assuming core service checks for duplicates + } } catch (e) { if (retries === 0) { return Promise.reject(new Error('Failed to initialize pipeline scheduler.')) @@ -70,6 +70,7 @@ export async function updatePipelines (): Promise { } async function applyChanges (event: PipelineEvent): Promise { + console.log(event) switch (event.eventType) { case EventType.PIPELINE_DELETE: { applyDeleteEvent(event); break } case EventType.PIPELINE_CREATE: @@ -85,7 +86,7 @@ function applyDeleteEvent (event: PipelineEvent): void { async function applyCreateOrUpdateEvent (event: PipelineEvent): Promise { const pipeline = await CoreClient.getPipeline(event.pipelineId) pipeline.trigger.firstExecution = new Date(pipeline.trigger.firstExecution) - PipelineScheduling.upsertPipelineJob(pipeline) + await PipelineScheduling.upsertPipelineJob(pipeline) } export function getPipelineJob (pipelineId: number): PipelineJob | undefined { @@ -132,14 +133,14 @@ export function schedulePipeline (pipelineConfig: PipelineConfig): PipelineJob { return pipelineJob } -export function upsertPipelineJob (pipelineConfig: PipelineConfig): PipelineJob { +export async function upsertPipelineJob (pipelineConfig: PipelineConfig): Promise { const isNewPipeline = !existsPipelineJob(pipelineConfig.id) const pipelineState = isNewPipeline ? 'New' : 'Updated' console.log(`[${pipelineState}] pipeline detected with id ${pipelineConfig.id}.`) if (isNewPipeline) { - StorageClient.createStructure(pipelineConfig.id) + await PipelineScheduling.createStorageStructure(pipelineConfig.id) } else { cancelJob(pipelineConfig.id) } @@ -147,6 +148,28 @@ export function upsertPipelineJob (pipelineConfig: PipelineConfig): PipelineJob return schedulePipeline(pipelineConfig) } +export async function createStorageStructure(pipelineId: number, retries: number = 10): Promise { + try { + console.log(`Creating storage structur for pipeline ${pipelineId}`) + return await StorageClient.createStructure(pipelineId) + } catch (e) { + if (retries === 0) { + return Promise.reject(new Error(`Could not create storage structure for pipeline ${pipelineId}.`)) + } + if (e.code === '400') { + console.log(e.message) + } + if (e.code === '404') { + console.error(`Failed to communicate with Storage Service (${retries}) . Retrying ... `) + } else { + console.error(e) + console.error(`Retrying (${retries})...`) + } + await sleep(1000) + return createStorageStructure(retries - 1) + } +} + export function getAllJobs (): PipelineJob[] { return Array.from(allJobs.values()) } From 6b36ece7c572109b1ca5183af94425f91a8f3b3d Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Fri, 18 Oct 2019 16:29:46 +0200 Subject: [PATCH 0069/1168] Scheduler: bugfix await --- scheduler/src/pipeline-scheduling.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/scheduler/src/pipeline-scheduling.ts b/scheduler/src/pipeline-scheduling.ts index 093a5dddd..8bed92e81 100644 --- a/scheduler/src/pipeline-scheduling.ts +++ b/scheduler/src/pipeline-scheduling.ts @@ -56,7 +56,9 @@ export async function updatePipelines (): Promise { console.log(`Applying ${events.length} updates from core service:`) } - Array.from(events).forEach(async event => applyChanges(event)) + for(let event of events) { + await applyChanges(event) + } currentEventId = nextEventId } catch (e) { @@ -73,8 +75,7 @@ async function applyChanges (event: PipelineEvent): Promise { console.log(event) switch (event.eventType) { case EventType.PIPELINE_DELETE: { applyDeleteEvent(event); break } - case EventType.PIPELINE_CREATE: - case EventType.PIPELINE_UPDATE: { applyCreateOrUpdateEvent(event); break } + case EventType.PIPELINE_CREATE || EventType.PIPELINE_UPDATE: { await applyCreateOrUpdateEvent(event); break } } } From ecfaa8a1916f1df64b5a43ca741df1cd7a335b28 Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Mon, 21 Oct 2019 09:56:34 +0200 Subject: [PATCH 0070/1168] UI: fix switch case syntax --- scheduler/src/pipeline-scheduling.ts | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/scheduler/src/pipeline-scheduling.ts b/scheduler/src/pipeline-scheduling.ts index 8bed92e81..6ba1e2b8a 100644 --- a/scheduler/src/pipeline-scheduling.ts +++ b/scheduler/src/pipeline-scheduling.ts @@ -74,8 +74,20 @@ export async function updatePipelines (): Promise { async function applyChanges (event: PipelineEvent): Promise { console.log(event) switch (event.eventType) { - case EventType.PIPELINE_DELETE: { applyDeleteEvent(event); break } - case EventType.PIPELINE_CREATE || EventType.PIPELINE_UPDATE: { await applyCreateOrUpdateEvent(event); break } + case EventType.PIPELINE_DELETE: { + applyDeleteEvent(event) + break + } + case EventType.PIPELINE_CREATE: + case EventType.PIPELINE_UPDATE: { + await applyCreateOrUpdateEvent(event) + break + } + default: { + console.error(`Received unknown event type: ${event.eventType}`) + console.error(event) + break + } } } From 0443368dd18ebe6131e709c8765be99853b0a6bd Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Mon, 21 Oct 2019 10:21:51 +0200 Subject: [PATCH 0071/1168] Core: fix parameter name for events --- .../java/org/jvalue/ods/coreservice/model/PipelineEvent.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/org/jvalue/ods/coreservice/model/PipelineEvent.java b/core/src/main/java/org/jvalue/ods/coreservice/model/PipelineEvent.java index 57af8a3f7..c425121e2 100644 --- a/core/src/main/java/org/jvalue/ods/coreservice/model/PipelineEvent.java +++ b/core/src/main/java/org/jvalue/ods/coreservice/model/PipelineEvent.java @@ -27,7 +27,7 @@ private PipelineEvent() {} @JsonCreator public PipelineEvent( @JsonProperty("eventType") @NotNull EventType eventType, - @JsonProperty("pipelineConfig")@NotNull Long pipelineId) { + @JsonProperty("pipelineId")@NotNull Long pipelineId) { this.eventType = eventType; this.pipelineId = pipelineId; } From bee219df3ff97c7341e9f82ca83087067e7d522b Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Mon, 21 Oct 2019 10:22:17 +0200 Subject: [PATCH 0072/1168] Scheduler: fix EventType to use string representation instead of number to be compatible with core --- scheduler/src/interfaces/pipeline-event.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scheduler/src/interfaces/pipeline-event.ts b/scheduler/src/interfaces/pipeline-event.ts index 6b501dc8b..886179122 100644 --- a/scheduler/src/interfaces/pipeline-event.ts +++ b/scheduler/src/interfaces/pipeline-event.ts @@ -5,7 +5,7 @@ export default interface PipelineEvent { } export enum EventType { - PIPELINE_CREATE, - PIPELINE_UPDATE, - PIPELINE_DELETE + PIPELINE_CREATE = 'PIPELINE_CREATE', + PIPELINE_UPDATE = 'PIPELINE_UPDATE', + PIPELINE_DELETE = 'PIPELINE_DELETE' } From cb1f3400227647c0ddd5d5a98c0005323eca8169 Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Mon, 21 Oct 2019 10:56:17 +0200 Subject: [PATCH 0073/1168] core: Adapt integration test to updated pipelineEvent model --- core/integration-test/src/core.test.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/core/integration-test/src/core.test.js b/core/integration-test/src/core.test.js index 1eec85cf8..fd0a4b0a9 100644 --- a/core/integration-test/src/core.test.js +++ b/core/integration-test/src/core.test.js @@ -16,12 +16,12 @@ describe("Core", () => { process.exit(1); } }, 60000); - + test("GET /version", async () => { const response = await request(URL).get("/version"); expect(response.status).toEqual(200); expect(response.type).toEqual("text/plain"); - + const semanticVersionRegEx = '^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)'; expect(response.text).toMatch(new RegExp(semanticVersionRegEx)); }); @@ -132,9 +132,9 @@ describe("Core", () => { expect(eventsResponse.status).toEqual(200); expect(eventsResponse.type).toEqual("application/json"); expect(eventsResponse.body.length).toBe(2); - expect(eventsResponse.body[0].pipelineConfig).toBe(pipelineId); + expect(eventsResponse.body[0].pipelineId).toBe(pipelineId); expect(eventsResponse.body[0].eventType).toEqual("PIPELINE_CREATE"); - expect(eventsResponse.body[1].pipelineConfig).toBe(pipelineId); + expect(eventsResponse.body[1].pipelineId).toBe(pipelineId); expect(eventsResponse.body[1].eventType).toEqual("PIPELINE_DELETE"); }); @@ -160,7 +160,7 @@ describe("Core", () => { expect(eventsAfter.type).toEqual("application/json"); expect(eventsAfter.body.length).toBe(1); expect(eventsAfter.body[0].eventId).toBe(eventId+1); - expect(eventsAfter.body[0].pipelineConfig).toBe(pipelineId); + expect(eventsAfter.body[0].pipelineId).toBe(pipelineId); expect(eventsAfter.body[0].eventType).toEqual("PIPELINE_DELETE"); }); @@ -182,7 +182,7 @@ describe("Core", () => { expect(response.type).toEqual("application/json"); expect(Object.keys(response.body)).toHaveLength(3); expect(response.body.eventId).toBeTruthy(); - expect(response.body.pipelineConfig).toBe(pipelineId); + expect(response.body.pipelineId).toBe(pipelineId); expect(response.body.eventType).toEqual("PIPELINE_DELETE"); }); @@ -217,7 +217,7 @@ describe("Core", () => { .send(); expect(eventsResponse.body.eventType).toEqual("PIPELINE_UPDATE"); - expect(eventsResponse.body.pipelineConfig).toEqual(pipelineId); + expect(eventsResponse.body.pipelineId).toEqual(pipelineId); //check if pipeline config was updated correctly const pipelineResponse = await request(URL) @@ -254,7 +254,7 @@ describe("Core", () => { .send(); expect(eventsResponse.body.eventType).toEqual("PIPELINE_UPDATE"); - expect(eventsResponse.body.pipelineConfig).toEqual(pipelineId); + expect(eventsResponse.body.pipelineId).toEqual(pipelineId); //check if pipeline config was updated correctly const pipelineResponse = await request(URL) From 9b28ac7d20efb00ee4ddf67168cfc6a84feb85c7 Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Tue, 22 Oct 2019 09:56:34 +0200 Subject: [PATCH 0074/1168] Include .idea files in .gitignore --- scheduler/.gitignore | 4 ++++ transformation/.gitignore | 4 ++++ ui/.gitignore | 1 + 3 files changed, 9 insertions(+) diff --git a/scheduler/.gitignore b/scheduler/.gitignore index 70367adf4..bb86cc443 100644 --- a/scheduler/.gitignore +++ b/scheduler/.gitignore @@ -87,3 +87,7 @@ typings/ .dynamodb/ # End of https://www.gitignore.io/api/node + +# Idea files +.idea/ +build/ diff --git a/transformation/.gitignore b/transformation/.gitignore index d65e062ff..ff1f07c0f 100644 --- a/transformation/.gitignore +++ b/transformation/.gitignore @@ -87,3 +87,7 @@ typings/ # End of https://www.gitignore.io/api/node dist/ + +# Idea files +.idea/ +build/ diff --git a/ui/.gitignore b/ui/.gitignore index dde66255e..226528a61 100644 --- a/ui/.gitignore +++ b/ui/.gitignore @@ -91,3 +91,4 @@ dist/ # Idea files .idea/ +build/ From 3531be4787c236d2e33260087e14f4d13c975a06 Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Tue, 22 Oct 2019 08:13:37 +0000 Subject: [PATCH 0075/1168] Resolve "All containers in registry" --- .gitlab-ci.yml | 42 ++++++++++++++++++++++++-- auth/Dockerfile | 4 +++ auth/version.txt | 1 + docker-compose.yml | 21 +++++-------- storage/docker/liquibase/Dockerfile | 7 ----- storage/docker/postgrest/Dockerfile | 3 -- storage/liquibase/Dockerfile | 11 +++++++ storage/{ => liquibase}/changelog.xml | 0 storage/{docker => }/liquibase/wait.sh | 6 ++-- storage/postgrest/Dockerfile | 14 +++++++++ storage/postgrest/wait.sh | 14 +++++++++ ui/Dockerfile | 19 +++++++----- 12 files changed, 106 insertions(+), 36 deletions(-) create mode 100644 auth/Dockerfile create mode 100644 auth/version.txt delete mode 100644 storage/docker/liquibase/Dockerfile delete mode 100644 storage/docker/postgrest/Dockerfile create mode 100644 storage/liquibase/Dockerfile rename storage/{ => liquibase}/changelog.xml (100%) rename storage/{docker => }/liquibase/wait.sh (69%) create mode 100644 storage/postgrest/Dockerfile create mode 100644 storage/postgrest/wait.sh diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ae8688be0..d22d0ab25 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -17,6 +17,7 @@ variables: DOCKER_DRIVER: "overlay2" ADAPTER_DOCKER_IMAGE_NAME: ${CI_REGISTRY_IMAGE}/adapter-service + AUTH_DOCKER_IMAGE_NAME: ${CI_REGISTRY_IMAGE}/auth-service UI_DOCKER_IMAGE_NAME: ${CI_REGISTRY_IMAGE}/ui-service SCHEDULER_DOCKER_IMAGE_NAME: ${CI_REGISTRY_IMAGE}/scheduler-service STORAGE_POSTGREST_DOCKER_IMAGE_NAME: ${CI_REGISTRY_IMAGE}/storage-service-postgrest @@ -78,6 +79,43 @@ publish-docker-adapter: - docker push ${ADAPTER_DOCKER_IMAGE_NAME}:latest +# ----------------- AUTH SERVICE -------------------- + +# BUILD +build-auth: + stage: build + image: docker:stable + before_script: + - cd auth + script: + - docker build -t ${AUTH_DOCKER_IMAGE_NAME} . + - mkdir image # Store built image for following CI steps + - docker save ${AUTH_DOCKER_IMAGE_NAME} > image/auth.tar + artifacts: + expire_in: 1 day + paths: + - ./auth/image/auth.tar + +# PUBLISH +publish-docker-auth: + stage: publish + image: docker:stable + dependencies: + - build-auth + when: manual + before_script: + - docker login -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD} ${CI_REGISTRY} + - cd auth + script: + - docker load -i image/auth.tar + - export AUTH_VERSION=$(cat version.txt | grep "VERSION" | awk '{print $3}' | sed 's/[,"]//g') + # Tag as version and push + - docker tag ${AUTH_DOCKER_IMAGE_NAME} ${AUTH_DOCKER_IMAGE_NAME}:${AUTH_VERSION} + - docker tag ${AUTH_DOCKER_IMAGE_NAME} ${AUTH_DOCKER_IMAGE_NAME}:latest + - docker push ${AUTH_DOCKER_IMAGE_NAME}:${AUTH_VERSION} + - docker push ${AUTH_DOCKER_IMAGE_NAME}:latest + + # ----------------- UI SERVICE -------------------- # BUILD @@ -124,8 +162,8 @@ build-storage: before_script: - cd storage script: - - "docker build -t ${STORAGE_POSTGREST_DOCKER_IMAGE_NAME} ./docker/postgrest/" - - "docker build -t ${STORAGE_LIQUIBASE_DOCKER_IMAGE_NAME} ./docker/liquibase/" + - "docker build -t ${STORAGE_POSTGREST_DOCKER_IMAGE_NAME} ./postgrest/" + - "docker build -t ${STORAGE_LIQUIBASE_DOCKER_IMAGE_NAME} ./liquibase/" - mkdir image # Store built image for following CI steps - docker save ${STORAGE_POSTGREST_DOCKER_IMAGE_NAME} > image/storage_postgrest.tar - docker save ${STORAGE_LIQUIBASE_DOCKER_IMAGE_NAME} > image/storage_liquibase.tar diff --git a/auth/Dockerfile b/auth/Dockerfile new file mode 100644 index 000000000..14439696f --- /dev/null +++ b/auth/Dockerfile @@ -0,0 +1,4 @@ +FROM jboss/keycloak + +COPY ./ods-userservice-realm.json /tmp/realm.json +ENV KEYCLOAK_IMPORT /tmp/realm.json diff --git a/auth/version.txt b/auth/version.txt new file mode 100644 index 000000000..052374acc --- /dev/null +++ b/auth/version.txt @@ -0,0 +1 @@ +VERSION = "0.0.1" \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 29ed92b2a..fd9f8c076 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -40,7 +40,9 @@ services: - "traefik.enable=false" auth-service: - image: jboss/keycloak + image: registry.gitlab.com/profoss/open-data-service/ods-main/auth-service + build: + context: ./auth/ environment: DB_VENDOR: POSTGRES DB_ADDR: auth-service-db @@ -50,13 +52,6 @@ services: KEYCLOAK_USER: admin KEYCLOAK_PASSWORD: Pa55w0rd KEYCLOAK_LOGLEVEL: INFO - - #import realm - KEYCLOAK_IMPORT: /tmp/realm.json - - #realm volume - volumes: - - "./auth/ods-userservice-realm.json:/tmp/realm.json" labels: # traefic reverse-proxy config - "traefik.backend=auth-service" - "traefik.frontend.rule=PathPrefix:/auth" @@ -89,8 +84,10 @@ services: # ----------------- STORAGE SERVICE (/scheduler) -------------------- storage-service: # Wraps postgres database with API - build: ./storage/docker/postgrest/ + image: registry.gitlab.com/profoss/open-data-service/ods-main/storage-service-postgrest + build: ./storage/postgrest/ environment: + DATABASE_URL: jdbc:postgresql://storage-service-db:5432/ods PGRST_DB_URI: postgres://postgrest:postgres-wrapper-pw@storage-service-db:5432/ods PGRST_DB_SCHEMA: storage PGRST_DB_ANON_ROLE: postgrest #In production this role should not be the same as the one used for the connection @@ -121,14 +118,12 @@ services: - "traefik.enable=false" storage-service-db-liquibase: # perform database migration on start up - build: ./storage/docker/liquibase/ + image: registry.gitlab.com/profoss/open-data-service/ods-main/storage-service-liquibase + build: ./storage/liquibase/ # TODO: Sql Injection is currently environment: LIQUIBASE_URL: jdbc:postgresql://storage-service-db:5432/ods LIQUIBASE_USERNAME: ods_admin LIQUIBASE_PASSWORD: ods_pw - LIQUIBASE_CHANGELOG: /liquibase/changelog.xml - volumes: - - ./storage/changelog.xml:/liquibase/changelog.xml # TODO: Sql Injection is currently depends_on: - storage-service-db labels: # traefic reverse-proxy config diff --git a/storage/docker/liquibase/Dockerfile b/storage/docker/liquibase/Dockerfile deleted file mode 100644 index 2f97e1d3a..000000000 --- a/storage/docker/liquibase/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM webdevops/liquibase:postgres - -COPY ./wait.sh /wait.sh -RUN chmod +x /wait.sh - -ENTRYPOINT ["/bin/sh", "-c"] -CMD ["/wait.sh && /entrypoint update"] \ No newline at end of file diff --git a/storage/docker/postgrest/Dockerfile b/storage/docker/postgrest/Dockerfile deleted file mode 100644 index a8880197f..000000000 --- a/storage/docker/postgrest/Dockerfile +++ /dev/null @@ -1,3 +0,0 @@ -FROM postgrest/postgrest:v6.0.0 - -CMD exec postgrest /etc/postgrest.conf diff --git a/storage/liquibase/Dockerfile b/storage/liquibase/Dockerfile new file mode 100644 index 000000000..d4182fa35 --- /dev/null +++ b/storage/liquibase/Dockerfile @@ -0,0 +1,11 @@ +FROM webdevops/liquibase:postgres + +COPY ./wait.sh /wait.sh +RUN chmod +x /wait.sh +ENV DATABASE_URL=$LIQUIBASE_URL + +COPY ./changelog.xml /liquibase/changelog.xml +ENV LIQUIBASE_CHANGELOG=/liquibase/changelog.xml + +ENTRYPOINT ["/bin/sh", "-c"] +CMD ["/wait.sh && /entrypoint update"] diff --git a/storage/changelog.xml b/storage/liquibase/changelog.xml similarity index 100% rename from storage/changelog.xml rename to storage/liquibase/changelog.xml diff --git a/storage/docker/liquibase/wait.sh b/storage/liquibase/wait.sh similarity index 69% rename from storage/docker/liquibase/wait.sh rename to storage/liquibase/wait.sh index b61d905ad..b47ebfede 100644 --- a/storage/docker/liquibase/wait.sh +++ b/storage/liquibase/wait.sh @@ -1,14 +1,14 @@ #!/bin/sh -printf 'Waiting for %s to be ready\n' ${LIQUIBASE_URL} +printf 'Waiting for %s to be ready\n' ${DATABASE_URL} sleep 5 # if db is started for first try it has to apply some changes itself before being available -while $(curl --silent --head --fail ${LIQUIBASE_URL}/ping); do +while $(curl --silent --head --fail ${DATABASE_URL}/ping); do printf 'Attempt failed to connect to Postgres... Retrying in a few seconds\n' sleep 2 done printf 'Postgres is running... Ready to perform liquibase update!\n' -exec "$@" \ No newline at end of file +exec "$@" diff --git a/storage/postgrest/Dockerfile b/storage/postgrest/Dockerfile new file mode 100644 index 000000000..88b1fc9bc --- /dev/null +++ b/storage/postgrest/Dockerfile @@ -0,0 +1,14 @@ +FROM postgrest/postgrest:v6.0.0 + +# overwrite: +ENV DATABASE_URL=jdbc:postgresql://localhost:5432/ods + +COPY ./wait.sh /wait.sh +USER root +RUN chmod +x /wait.sh + +RUN apt update \ + && apt install -y curl \ + && rm -rf /var/lib/apt/lists/* + +CMD /wait.sh && exec postgrest /etc/postgrest.conf diff --git a/storage/postgrest/wait.sh b/storage/postgrest/wait.sh new file mode 100644 index 000000000..e65d87a36 --- /dev/null +++ b/storage/postgrest/wait.sh @@ -0,0 +1,14 @@ +#!/bin/sh + +printf 'Waiting for %s to be ready\n' ${DATABASE_URL} + +sleep 5 # if db is started for first try it has to apply some changes itself before being available + +while $(curl --silent --head --fail ${DATABASE_URL}/ping); do + printf 'Attempt failed to connect to Postgres... Retrying in a few seconds\n' + sleep 2 +done + +printf 'Postgres is running... Ready to start PostgREST!\n' + +exec "$@" diff --git a/ui/Dockerfile b/ui/Dockerfile index 3b4d36b0a..485169f80 100644 --- a/ui/Dockerfile +++ b/ui/Dockerfile @@ -7,15 +7,18 @@ ARG STORAGE_SERVICE_URL ARG TRANSFORMATION_SERVICE_URL WORKDIR /build -COPY . . +COPY ./src ./src +COPY ./public ./public +COPY ./*.js ./ +COPY ./*.json ./ -RUN echo "VUE_APP_BASE_URL=$UI_BASE_URL" > .env -RUN echo "VUE_APP_AUTH_SERVICE_URL=$AUTH_SERVICE_URL" >> .env -RUN echo "VUE_APP_CORE_SERVICE_URL=$CORE_SERVICE_URL" >> .env -RUN echo "VUE_APP_STORAGE_SERVICE_URL=$STORAGE_SERVICE_URL" >> .env -RUN echo "VUE_APP_TRANSFORMATION_SERVICE_URL=$TRANSFORMATION_SERVICE_URL" >> .env -RUN cat .env +RUN echo "VUE_APP_BASE_URL=$UI_BASE_URL" > .env \ + && echo "VUE_APP_AUTH_SERVICE_URL=$AUTH_SERVICE_URL" >> .env \ + && echo "VUE_APP_CORE_SERVICE_URL=$CORE_SERVICE_URL" >> .env \ + && echo "VUE_APP_STORAGE_SERVICE_URL=$STORAGE_SERVICE_URL" >> .env \ + && echo "VUE_APP_TRANSFORMATION_SERVICE_URL=$TRANSFORMATION_SERVICE_URL" >> .env \ + && cat .env RUN npm install -CMD [ "npm", "run", "serve" ] \ No newline at end of file +CMD [ "npm", "run", "serve" ] From 0083dcad0b05bbbbf98b73005dd6387d1413a073 Mon Sep 17 00:00:00 2001 From: Andreas Bauer Date: Tue, 22 Oct 2019 09:16:17 +0000 Subject: [PATCH 0076/1168] Resolve "MVP transformation view" --- ui/package-lock.json | 104 ++++++++++++++++++ ui/package.json | 2 + ui/src/ships-vue-monaco.d.ts | 22 ++++ ui/src/transformation/CodeEditor.vue | 48 ++++++++ ui/src/transformation/MonacoDataProvider.vue | 65 +++++++++++ ui/src/transformation/ResultView.vue | 41 +++++++ .../transformation/TextAreaDataProvider.vue | 44 ++++++++ ui/src/transformation/TransformationMain.vue | 70 ++++++++---- ui/src/transformation/interfaces/jobResult.ts | 9 ++ .../interfaces/transformationRequest.ts | 4 + ui/src/transformation/module.ts | 25 ++++- ui/src/transformation/transformationRest.ts | 14 +-- ui/vue.config.js | 15 ++- 13 files changed, 431 insertions(+), 32 deletions(-) create mode 100644 ui/src/ships-vue-monaco.d.ts create mode 100644 ui/src/transformation/CodeEditor.vue create mode 100644 ui/src/transformation/MonacoDataProvider.vue create mode 100644 ui/src/transformation/ResultView.vue create mode 100644 ui/src/transformation/TextAreaDataProvider.vue create mode 100644 ui/src/transformation/interfaces/jobResult.ts create mode 100644 ui/src/transformation/interfaces/transformationRequest.ts diff --git a/ui/package-lock.json b/ui/package-lock.json index f9ac8b383..a6c5e6874 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -1017,6 +1017,12 @@ } } }, + "@types/anymatch": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", + "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==", + "dev": true + }, "@types/eslint-visitor-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", @@ -1084,6 +1090,12 @@ "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==", "dev": true }, + "@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/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", @@ -1096,12 +1108,76 @@ "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", "dev": true }, + "@types/tapable": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.4.tgz", + "integrity": "sha512-78AdXtlhpCHT0K3EytMpn4JNxaf5tbqbLcbIRoQIHzpTIyjpxLQKRoxU55ujBXAtg3Nl2h/XWvfDa9dsMOd0pQ==", + "dev": true + }, + "@types/uglify-js": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.0.4.tgz", + "integrity": "sha512-SudIN9TRJ+v8g5pTG8RRCqfqTMNqgWCKKd3vtynhGzkIIjxaicNAMuY5TRadJ6tzDu3Dotf3ngaMILtmOdmWEQ==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@types/webpack": { + "version": "4.39.3", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.39.3.tgz", + "integrity": "sha512-afGNNuTfKk1YfHrQ+IwF0QhDkSSMIMMt8BRRErTKaGVvWTMABDjT22/4kJ4bRoSzir9LVgxuuceyZ4Z5I82Cyg==", + "dev": true, + "requires": { + "@types/anymatch": "*", + "@types/node": "*", + "@types/tapable": "*", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "@types/webpack-env": { "version": "1.14.0", "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.14.0.tgz", "integrity": "sha512-Fv+0gYJzE/czLoRKq+gnXWr4yBpPM3tO3C8pDLFwqVKlMICQUq5OsxwwFZYDaVr7+L6mgNDp16iOcJHEz3J5RQ==", "dev": true }, + "@types/webpack-sources": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.5.tgz", + "integrity": "sha512-zfvjpp7jiafSmrzJ2/i3LqOyTYTuJ7u1KOXlKgDlvsj9Rr0x7ZiYu5lZbXwobL7lmsRNtPXlBfmaUD8eU2Hu8w==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "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 + } + } + }, "@typescript-eslint/eslint-plugin": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.0.0.tgz", @@ -9866,6 +9942,20 @@ } } }, + "monaco-editor": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.17.1.tgz", + "integrity": "sha512-JAc0mtW7NeO+0SwPRcdkfDbWLgkqL9WfP1NbpP9wNASsW6oWqgZqNIWt4teymGjZIXTElx3dnQmUYHmVrJ7HxA==" + }, + "monaco-editor-webpack-plugin": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/monaco-editor-webpack-plugin/-/monaco-editor-webpack-plugin-1.7.0.tgz", + "integrity": "sha512-oItymcnlL14Sjd7EF7q+CMhucfwR/2BxsqrXIBrWL6LQplFfAfV+grLEQRmVHeGSBZ/Gk9ptzfueXnWcoEcFuA==", + "dev": true, + "requires": { + "@types/webpack": "^4.4.19" + } + }, "move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", @@ -9926,6 +10016,11 @@ "dev": true, "optional": true }, + "nano-assign": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/nano-assign/-/nano-assign-1.0.1.tgz", + "integrity": "sha512-1K8ncUoAYFPYcCZqrB+K2XQaFCmA35rryJCtPkGrG3zYkwm+iIUZRIHyaAfuy6zxaK9siPdjeJq7+Inijm6xhw==" + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -14089,6 +14184,15 @@ "vue-style-loader": "^4.1.0" } }, + "vue-monaco": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vue-monaco/-/vue-monaco-1.1.0.tgz", + "integrity": "sha512-K2nWM4eMFlf5I+EBSNvRt6nJXKv4bTE2K1fKs4jnSj0ict1D6J60HOtc0K+lHiCeGSiYVSzfR1pAkzDlY63MjA==", + "requires": { + "monaco-editor": "^0.17.0", + "nano-assign": "^1.0.0" + } + }, "vue-property-decorator": { "version": "8.2.2", "resolved": "https://registry.npmjs.org/vue-property-decorator/-/vue-property-decorator-8.2.2.tgz", diff --git a/ui/package.json b/ui/package.json index 91a008ce1..5db193943 100644 --- a/ui/package.json +++ b/ui/package.json @@ -14,6 +14,7 @@ "keycloak-js": "6.0.1", "vue": "^2.6.10", "vue-class-component": "^7.1.0", + "vue-monaco": "^1.1.0", "vue-property-decorator": "^8.2.2", "vue-router": "^3.1.2", "vuetify": "^2.0.11", @@ -40,6 +41,7 @@ "eslint-plugin-standard": "^4.0.1", "eslint-plugin-vue": "^5.2.3", "jest-html-reporter": "^2.5.0", + "monaco-editor-webpack-plugin": "^1.7.0", "sass": "^1.22.10", "ts-jest": "^24.0.2", "typescript": "^3.6.2", diff --git a/ui/src/ships-vue-monaco.d.ts b/ui/src/ships-vue-monaco.d.ts new file mode 100644 index 000000000..9e62e8f6f --- /dev/null +++ b/ui/src/ships-vue-monaco.d.ts @@ -0,0 +1,22 @@ +declare module 'vue-monaco' { + import { VueConstructor } from 'vue' + + export interface MonacoEditorProps { + original: string; + value: string; + theme: string; + language: string; + option: object; + amdRequre: Function; + diffEditor: boolean; + } + + export interface MonacoEditorConstructor extends VueConstructor { + props: MonacoEditorProps; + data: () => void; + methods: any; + } + + export const MonacoEditor: MonacoEditorConstructor + export default MonacoEditor +} diff --git a/ui/src/transformation/CodeEditor.vue b/ui/src/transformation/CodeEditor.vue new file mode 100644 index 000000000..e6bb269e1 --- /dev/null +++ b/ui/src/transformation/CodeEditor.vue @@ -0,0 +1,48 @@ + + + + + diff --git a/ui/src/transformation/MonacoDataProvider.vue b/ui/src/transformation/MonacoDataProvider.vue new file mode 100644 index 000000000..ebc74d8e9 --- /dev/null +++ b/ui/src/transformation/MonacoDataProvider.vue @@ -0,0 +1,65 @@ + + + + + diff --git a/ui/src/transformation/ResultView.vue b/ui/src/transformation/ResultView.vue new file mode 100644 index 000000000..3605a7e17 --- /dev/null +++ b/ui/src/transformation/ResultView.vue @@ -0,0 +1,41 @@ + + + diff --git a/ui/src/transformation/TextAreaDataProvider.vue b/ui/src/transformation/TextAreaDataProvider.vue new file mode 100644 index 000000000..44302936c --- /dev/null +++ b/ui/src/transformation/TextAreaDataProvider.vue @@ -0,0 +1,44 @@ + + + diff --git a/ui/src/transformation/TransformationMain.vue b/ui/src/transformation/TransformationMain.vue index 7d88ef3de..32be62ad8 100644 --- a/ui/src/transformation/TransformationMain.vue +++ b/ui/src/transformation/TransformationMain.vue @@ -1,21 +1,27 @@ @@ -24,21 +30,45 @@ import Vue from 'vue' import Component from 'vue-class-component' import { Action, State } from 'vuex-class' +import JobResult from './interfaces/jobResult' +import TransformationRequest from './interfaces/transformationRequest' + +import MonacoDataProvider from './MonacoDataProvider.vue' +import TextAreaDataProvider from './TextAreaDataProvider.vue' +import CodeEditor from './CodeEditor.vue' +import ResultView from './ResultView.vue' + const namespace = { namespace: 'transformation' } -@Component +@Component({ + components: { + TextAreaDataProvider, + MonacoDataProvider, + CodeEditor, + ResultView + } +}) export default class TransformationMain extends Vue { + private editorOptions = { + minimap: { + enabled: false + } + } + @State('transformationResult', namespace) + private transformationResult!: JobResult - private transformationResult!: object; + @State('isLoadingResults', namespace) + private isLoading!: boolean @Action('transformData', namespace) - private transformData!: (functionInput: string) => void; + private transformData!: (request: TransformationRequest) => void - private functionInput: string = '{"func":"return 42", "data":null}'; + private dataInput: object = { "a": 1, "b": 2, "c": 3 } + private functionInput: string = 'return data;' private submit () { - this.transformData(this.functionInput) + this.transformData({ func: this.functionInput, data: this.dataInput }) } } diff --git a/ui/src/transformation/interfaces/jobResult.ts b/ui/src/transformation/interfaces/jobResult.ts new file mode 100644 index 000000000..5a73bb85c --- /dev/null +++ b/ui/src/transformation/interfaces/jobResult.ts @@ -0,0 +1,9 @@ +export default interface JobResult { + data?: object; + error?: Error; + stats: Stats; +} + +interface Stats { + executionTime: number; +} diff --git a/ui/src/transformation/interfaces/transformationRequest.ts b/ui/src/transformation/interfaces/transformationRequest.ts new file mode 100644 index 000000000..257188fd3 --- /dev/null +++ b/ui/src/transformation/interfaces/transformationRequest.ts @@ -0,0 +1,4 @@ +export default interface TransformationRequest { + func: string; + data: object; +} diff --git a/ui/src/transformation/module.ts b/ui/src/transformation/module.ts index 0fbd5f915..358f5440d 100644 --- a/ui/src/transformation/module.ts +++ b/ui/src/transformation/module.ts @@ -1,16 +1,33 @@ import { Module, VuexModule, Mutation, Action } from 'vuex-module-decorators' + import * as TransformationRest from './transformationRest' +import JobResult from './interfaces/jobResult' +import TransformationRequest from './interfaces/transformationRequest' @Module({ namespaced: true }) export default class TransformationModule extends VuexModule { - private transformationResult: object = {} + private transformationResult: JobResult = { + data: {}, + stats: { + executionTime: 0.0 + } + } + + private isLoadingResults = false @Action({ commit: 'setTransformationResult' }) - public async transformData (inputFunc: string): Promise { - return TransformationRest.transformData(inputFunc) + public async transformData (request: TransformationRequest): Promise { + this.context.commit('setIsLoadingResults', true) + + return TransformationRest.transformData(request) } - @Mutation private setTransformationResult (value: object): void { + @Mutation public setTransformationResult (value: JobResult): void { this.transformationResult = value + this.isLoadingResults = false + } + + @Mutation public setIsLoadingResults (value: boolean): void { + this.isLoadingResults = value } } diff --git a/ui/src/transformation/transformationRest.ts b/ui/src/transformation/transformationRest.ts index 9466cc1d6..b142c7ed4 100644 --- a/ui/src/transformation/transformationRest.ts +++ b/ui/src/transformation/transformationRest.ts @@ -1,17 +1,17 @@ -import axios from 'axios' +import axios, { AxiosResponse } from 'axios' import { useBearer } from '@/keycloak' +import JobResult from './interfaces/jobResult' +import TransformationRequest from './interfaces/transformationRequest' + const TRANSFORMATION_SERVICE_URL = process.env.VUE_APP_TRANSFORMATION_SERVICE_URL as string -export async function transformData (inputFunc: string): Promise { +export async function transformData (request: TransformationRequest): Promise { const token = await useBearer().catch(error => { console.error('Unable to get keycloak token. Error: ' + error) + return Promise.reject(error) }) - if (token === undefined) { - return {} - } - const http = axios.create({ baseURL: TRANSFORMATION_SERVICE_URL, headers: { @@ -20,6 +20,6 @@ export async function transformData (inputFunc: string): Promise { } }) - const response = await http.post('/', inputFunc) + const response = await http.post('/job', request) as AxiosResponse return response.data } diff --git a/ui/vue.config.js b/ui/vue.config.js index 94f1f8e69..b7b7e87f4 100644 --- a/ui/vue.config.js +++ b/ui/vue.config.js @@ -1,3 +1,6 @@ +// webpack.config.js +const MonacoEditorPlugin = require('monaco-editor-webpack-plugin') + module.exports = { publicPath: './', configureWebpack: { @@ -5,6 +8,16 @@ module.exports = { open: true, port: 8080 }, - devtool: 'source-map' + devtool: 'source-map', + plugins: [ + new MonacoEditorPlugin({ + // https://github.com/Microsoft/monaco-editor-webpack-plugin#options + // Include a subset of languages support + // Some language extensions like typescript are so huge that may impact build performance + // e.g. Build full languages support with webpack 4.0 takes over 80 seconds + // Languages are loaded on demand at runtime + languages: ['javascript', 'typescript', 'json'] + }) + ] } } From 7c63b90533c1e4c8ba8d217dc8a73025499575a3 Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Tue, 22 Oct 2019 10:13:52 +0000 Subject: [PATCH 0077/1168] Resolve "Forbid floating promises" --- scheduler/.eslintrc | 14 ++++++++------ scheduler/src/clients/storage-client.ts | 5 ++--- scheduler/src/clients/transformation-client.ts | 2 +- scheduler/src/index.ts | 1 + scheduler/src/pipeline-execution.ts | 5 +++-- scheduler/src/pipeline-scheduling.ts | 6 +++--- transformation/.eslintrc | 12 +++++++----- transformation/src/transformationEndpoint.ts | 4 ++-- transformation/src/vm2SandboxExecutor.test.ts | 2 +- 9 files changed, 28 insertions(+), 23 deletions(-) diff --git a/scheduler/.eslintrc b/scheduler/.eslintrc index 869babb93..5ab7b480d 100644 --- a/scheduler/.eslintrc +++ b/scheduler/.eslintrc @@ -4,20 +4,22 @@ "es6": true }, "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 2018, + "sourceType": "module", + "project": "./tsconfig.json" + }, "extends": ["standard", "plugin:@typescript-eslint/recommended"], "globals": { "Atomics": "readonly", "SharedArrayBuffer": "readonly" }, - "parserOptions": { - "ecmaVersion": 2018, - "sourceType": "module" - }, "plugins": ["@typescript-eslint"], "rules": { "@typescript-eslint/indent": [2, 2], - "@typescript-eslint/no-use-before-define": ["warn", { "functions": false, "classes": true }], + "@typescript-eslint/no-use-before-define": ["warn", { "functions": false, "classes": true }], "max-len": [2, 120, 4, { "ignoreUrls": true }], - "@typescript-eslint/explicit-function-return-type": [1, { "allowExpressions": true }] + "@typescript-eslint/explicit-function-return-type": [1, { "allowExpressions": true }], + "@typescript-eslint/no-floating-promises": "warn" } } diff --git a/scheduler/src/clients/storage-client.ts b/scheduler/src/clients/storage-client.ts index 16f9ada9c..920d7f855 100644 --- a/scheduler/src/clients/storage-client.ts +++ b/scheduler/src/clients/storage-client.ts @@ -42,10 +42,9 @@ export async function createStructure (pipelineId: number): Promise { } ) } catch (e) { - if(e.response.data.code === '42P07') { + if (e.response.data.code === '42P07') { // the structure already exists - console.log(`Database structure for pipeline {pipelineId} already exists.`) - return; + console.log('Database structure for pipeline {pipelineId} already exists.') } else { throw e } diff --git a/scheduler/src/clients/transformation-client.ts b/scheduler/src/clients/transformation-client.ts index 8a07fbb1a..1c4fe1e8d 100644 --- a/scheduler/src/clients/transformation-client.ts +++ b/scheduler/src/clients/transformation-client.ts @@ -15,6 +15,6 @@ export async function executeTransformation (transformationConfig: object): Prom export async function executeNotification (notificationConfig: object): Promise { const response = await http.post('/notifications', notificationConfig) if (response.status !== 202) { - Promise.reject(new Error('Error contacting transformation-service')) + return Promise.reject(new Error('Error contacting transformation-service')) } } diff --git a/scheduler/src/index.ts b/scheduler/src/index.ts index 7201ba496..67391ea81 100644 --- a/scheduler/src/index.ts +++ b/scheduler/src/index.ts @@ -54,6 +54,7 @@ async function initPipelineJobs (): Promise { updatePipelines) } +// eslint-disable-next-line @typescript-eslint/no-floating-promises initPipelineJobs() process.on('SIGTERM', async () => { diff --git a/scheduler/src/pipeline-execution.ts b/scheduler/src/pipeline-execution.ts index 9b980745f..27b3739c6 100644 --- a/scheduler/src/pipeline-execution.ts +++ b/scheduler/src/pipeline-execution.ts @@ -95,12 +95,13 @@ async function executeNotifications (pipelineConfig: PipelineConfig, data: objec try { for (const notification of pipelineConfig.notifications) { notification.data = data - TransformationClient.executeNotification(notification) + await TransformationClient.executeNotification(notification) } console.log(`Successfully delivered notification requests to transformation-service for ${pipelineConfig.id}`) } catch (e) { if (e.code === 'ECONNREFUSED' || e.code === 'ENOTFOUND') { - console.log(`Failed to trigger notifications for Pipeline ${pipelineConfig.id}. Transformation Service not reachable`) + console.log(`Failed to trigger notifications for Pipeline ${pipelineConfig.id}. ` + + 'Transformation Service not reachable') } else { console.log(`Failed to trigger notifications for Pipeline ${pipelineConfig.id}. Unknown error!`) console.error(e) diff --git a/scheduler/src/pipeline-scheduling.ts b/scheduler/src/pipeline-scheduling.ts index 6ba1e2b8a..65c1ae6e6 100644 --- a/scheduler/src/pipeline-scheduling.ts +++ b/scheduler/src/pipeline-scheduling.ts @@ -25,7 +25,7 @@ export async function initializeJobs (retries = 30): Promise { console.log(`Received ${pipelineConfigurations.length} pipelines from core-service`) - for(let pipelineConfig of pipelineConfigurations) { + for (const pipelineConfig of pipelineConfigurations) { pipelineConfig.trigger.firstExecution = new Date(pipelineConfig.trigger.firstExecution) await PipelineScheduling.upsertPipelineJob(pipelineConfig) // assuming core service checks for duplicates } @@ -56,7 +56,7 @@ export async function updatePipelines (): Promise { console.log(`Applying ${events.length} updates from core service:`) } - for(let event of events) { + for (const event of events) { await applyChanges(event) } @@ -161,7 +161,7 @@ export async function upsertPipelineJob (pipelineConfig: PipelineConfig): Promis return schedulePipeline(pipelineConfig) } -export async function createStorageStructure(pipelineId: number, retries: number = 10): Promise { +export async function createStorageStructure (pipelineId: number, retries = 10): Promise { try { console.log(`Creating storage structur for pipeline ${pipelineId}`) return await StorageClient.createStructure(pipelineId) diff --git a/transformation/.eslintrc b/transformation/.eslintrc index 21152fa66..5ab7b480d 100644 --- a/transformation/.eslintrc +++ b/transformation/.eslintrc @@ -4,20 +4,22 @@ "es6": true }, "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 2018, + "sourceType": "module", + "project": "./tsconfig.json" + }, "extends": ["standard", "plugin:@typescript-eslint/recommended"], "globals": { "Atomics": "readonly", "SharedArrayBuffer": "readonly" }, - "parserOptions": { - "ecmaVersion": 2018, - "sourceType": "module" - }, "plugins": ["@typescript-eslint"], "rules": { "@typescript-eslint/indent": [2, 2], "@typescript-eslint/no-use-before-define": ["warn", { "functions": false, "classes": true }], "max-len": [2, 120, 4, { "ignoreUrls": true }], - "@typescript-eslint/explicit-function-return-type": [1, { "allowExpressions": true }] + "@typescript-eslint/explicit-function-return-type": [1, { "allowExpressions": true }], + "@typescript-eslint/no-floating-promises": "warn" } } diff --git a/transformation/src/transformationEndpoint.ts b/transformation/src/transformationEndpoint.ts index 6b644961a..ca560ed80 100644 --- a/transformation/src/transformationEndpoint.ts +++ b/transformation/src/transformationEndpoint.ts @@ -67,10 +67,10 @@ export class TransformationEndpoint { res.end() } - postNotification = (req: Request, res: Response): void => { + postNotification = async (req: Request, res: Response): Promise => { const notification: NotificationRequest = req.body - this.transformationService.handleNotification(notification) + await this.transformationService.handleNotification(notification) // Result of notification handling is ignored for now. res.status(202).send() diff --git a/transformation/src/vm2SandboxExecutor.test.ts b/transformation/src/vm2SandboxExecutor.test.ts index 1ebd4823d..2a52744e1 100644 --- a/transformation/src/vm2SandboxExecutor.test.ts +++ b/transformation/src/vm2SandboxExecutor.test.ts @@ -8,7 +8,7 @@ import VM2SandboxExecutor from './vm2SandboxExecutor' * @param object The object to be checked * @param name The name of the type to check against, e.g. 'SyntaxError' */ -function isInstance (object: any, name: string): boolean { +function isInstance (object: any, name: string): boolean { // eslint-disable-line @typescript-eslint/no-explicit-any return (object.constructor.name) === name } From cc435d5c75a8378b851681d45226b7458404008f Mon Sep 17 00:00:00 2001 From: Andreas Bauer Date: Mon, 28 Oct 2019 09:50:41 +0000 Subject: [PATCH 0078/1168] Resolve "UI: Transformation input should be accessable from transformation function code editor." --- ui/src/ships-vue-monaco.d.ts | 5 ++- ui/src/transformation/CodeEditor.vue | 40 ++++++++++++++++--- ui/src/transformation/MonacoDataProvider.vue | 11 +++-- .../transformation/TextAreaDataProvider.vue | 11 +++-- ui/src/transformation/TransformationMain.vue | 5 ++- ui/src/transformation/interfaces/data.ts | 1 + .../interfaces/transformationRequest.ts | 4 +- 7 files changed, 56 insertions(+), 21 deletions(-) create mode 100644 ui/src/transformation/interfaces/data.ts diff --git a/ui/src/ships-vue-monaco.d.ts b/ui/src/ships-vue-monaco.d.ts index 9e62e8f6f..d64e3bd1a 100644 --- a/ui/src/ships-vue-monaco.d.ts +++ b/ui/src/ships-vue-monaco.d.ts @@ -1,5 +1,8 @@ declare module 'vue-monaco' { import { VueConstructor } from 'vue' + import * as monaco from 'monaco-editor' + + export type Monaco = typeof monaco export interface MonacoEditorProps { original: string; @@ -14,7 +17,7 @@ declare module 'vue-monaco' { export interface MonacoEditorConstructor extends VueConstructor { props: MonacoEditorProps; data: () => void; - methods: any; + monaco: Monaco; } export const MonacoEditor: MonacoEditorConstructor diff --git a/ui/src/transformation/CodeEditor.vue b/ui/src/transformation/CodeEditor.vue index e6bb269e1..849e3b34c 100644 --- a/ui/src/transformation/CodeEditor.vue +++ b/ui/src/transformation/CodeEditor.vue @@ -1,20 +1,27 @@ diff --git a/ui/src/transformation/MonacoDataProvider.vue b/ui/src/transformation/MonacoDataProvider.vue index ebc74d8e9..cd686c015 100644 --- a/ui/src/transformation/MonacoDataProvider.vue +++ b/ui/src/transformation/MonacoDataProvider.vue @@ -13,21 +13,20 @@ diff --git a/ui/src/pipeline/PipelineOverview.vue b/ui/src/pipeline/PipelineOverview.vue index d97014778..a02a7172d 100644 --- a/ui/src/pipeline/PipelineOverview.vue +++ b/ui/src/pipeline/PipelineOverview.vue @@ -2,14 +2,16 @@
- Create new pipeline - + mdi mdi-pipe @@ -49,28 +51,71 @@ -
@@ -80,7 +125,7 @@ import Vue from 'vue' import Component from 'vue-class-component' import { State, Action } from 'vuex-class' -import Pipeline from './pipeline'; +import Pipeline from './pipeline' const namespace = { namespace: 'pipeline' } @@ -90,7 +135,6 @@ const ONE_MINUTE_IN_MS = 60 * 1000 @Component({}) export default class PipelineOverview extends Vue { - @Action('loadPipelines', namespace) private loadPipelinesAction!: () => void; @Action('deletePipeline', namespace) private deletePipelineAction!: (id: number) => void; @@ -99,10 +143,10 @@ export default class PipelineOverview extends Vue { private headers = [ { text: 'Id', value: 'id' }, - { text: 'Pipeline Name', value: 'metadata.displayName', sortable: false}, // sorting to be implemented + { text: 'Pipeline Name', value: 'metadata.displayName', sortable: false }, // sorting to be implemented { text: 'Author', value: 'metadata.author', sortable: false }, - { text: 'Interval', value: 'trigger.interval', sortable: false}, - { text: 'Periodic', value: 'trigger.periodic', sortable: false}, + { text: 'Interval', value: 'trigger.interval', sortable: false }, + { text: 'Periodic', value: 'trigger.periodic', sortable: false }, { text: 'Action', value: 'action', sortable: false } ]; @@ -117,15 +161,15 @@ export default class PipelineOverview extends Vue { } private onCreatePipeline () { - this.$router.push({ name: 'pipeline-new'}) + this.$router.push({ name: 'pipeline-new' }) } private onEditPipeline (pipeline: Pipeline) { - this.$router.push({ name: 'pipeline-edit', params: { pipelineId: `${pipeline.id}` } }) + this.$router.push({ name: 'pipeline-edit', params: { pipelineId: `${pipeline.id}` } }) } private onDeletePipeline (pipeline: Pipeline) { - this.deletePipelineAction(pipeline.id); + this.deletePipelineAction(pipeline.id) } private onNotifications (pipeline: Pipeline) { @@ -144,7 +188,7 @@ export default class PipelineOverview extends Vue { } private getMinutesFromMS (intervalInMS: number): number { - return Math.floor((intervalInMS % ONE_HOUR_IN_MS ) / ONE_MINUTE_IN_MS ) + return Math.floor((intervalInMS % ONE_HOUR_IN_MS) / ONE_MINUTE_IN_MS) } } diff --git a/ui/src/pipeline/notificationEditDialog.ts b/ui/src/pipeline/notificationEditDialog.ts index 1bb62e83d..ab35f163b 100644 --- a/ui/src/pipeline/notificationEditDialog.ts +++ b/ui/src/pipeline/notificationEditDialog.ts @@ -2,6 +2,6 @@ import NotificationConfig, { NotificationType } from '@/pipeline/notificationCon export default interface NotificationEditDialog { - openDialog(notifcationConfig?: NotificationConfig): void - closeDialog(): void + openDialog(notifcationConfig?: NotificationConfig): void; + closeDialog(): void; } diff --git a/ui/src/storage/PipelineStorageOverview.vue b/ui/src/storage/PipelineStorageOverview.vue index d028f424a..3c9c1dee1 100644 --- a/ui/src/storage/PipelineStorageOverview.vue +++ b/ui/src/storage/PipelineStorageOverview.vue @@ -2,7 +2,9 @@
-

Storage of Pipeline {{ pipelineId }}

+
+

Storage of Pipeline {{ pipelineId }}

+
@@ -12,7 +14,10 @@ {{ getLatestStorageItemUrl(pipelineId) }} - + mdi mdi-content-copy @@ -33,18 +38,25 @@
- + - - +
-
# {{ entry.id }}
- {{ entry.timestamp }} +
+ # {{ entry.id }} +
+ {{ entry.timestamp }}
- @@ -61,13 +73,13 @@ - + -
{{ entry.data  }}
+
{{ entry.data }}
- + @@ -76,8 +88,13 @@ {{ getStorageItemUrl(pipelineId, entry.id) }} - - mdi mdi-content-copy + + + mdi mdi-content-copy + @@ -101,26 +118,25 @@ import { Action, State } from 'vuex-class' import clipboardCopy from 'clipboard-copy' import * as StorageClient from './storageRest' -import { StorageItem } from './storage-item'; +import { StorageItem } from './storage-item' const namespace = { namespace: 'storage' } @Component export default class PipelineStorageOverview extends Vue { - @State('data', namespace) private data!: StorageItem[] @Action('fetchData', namespace) private fetchData!: (pipelineId: string) => void - private pipelineId: string = '' + private pipelineId = '' private clipUrl: (content: string) => Promise = clipboardCopy private getStorageItemUrl (pipelineId: string, itemId: string): string { let url = StorageClient.createUrlForItem(pipelineId, itemId) - if(url.startsWith('/')) { + if (url.startsWith('/')) { url = window.location.origin + url } return url @@ -128,7 +144,7 @@ export default class PipelineStorageOverview extends Vue { private getLatestStorageItemUrl (pipelineId: string): string { let url = StorageClient.createUrlForLatestItem(pipelineId) - if(url.startsWith('/')) { + if (url.startsWith('/')) { url = window.location.origin + url } return url diff --git a/ui/src/transformation/CodeEditor.vue b/ui/src/transformation/CodeEditor.vue index b65fcac9f..ffafb361c 100644 --- a/ui/src/transformation/CodeEditor.vue +++ b/ui/src/transformation/CodeEditor.vue @@ -1,11 +1,12 @@ From ee55c69bfe5585318457ae57965497156c14777c Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Wed, 27 Nov 2019 09:54:06 +0100 Subject: [PATCH 0167/1168] UI: move transformation config to own component --- ui/src/pipeline/PipelineEdit.vue | 15 ++---- .../edit/PipelineTransformationConfig.vue | 51 +++++++++++++++++++ ui/src/pipeline/pipeline.ts | 6 ++- 3 files changed, 59 insertions(+), 13 deletions(-) create mode 100644 ui/src/pipeline/edit/PipelineTransformationConfig.vue diff --git a/ui/src/pipeline/PipelineEdit.vue b/ui/src/pipeline/PipelineEdit.vue index cb5f2b7f8..908f90205 100644 --- a/ui/src/pipeline/PipelineEdit.vue +++ b/ui/src/pipeline/PipelineEdit.vue @@ -76,16 +76,7 @@ Customize data transformations - - + Next - + + + + + + + diff --git a/ui/src/pipeline/pipeline.ts b/ui/src/pipeline/pipeline.ts index 94eff8f20..6af1afebf 100644 --- a/ui/src/pipeline/pipeline.ts +++ b/ui/src/pipeline/pipeline.ts @@ -4,7 +4,7 @@ export default interface Pipeline { id: number; adapter: AdapterConfig; metadata: PipelineMetaData; - transformations: object[]; + transformations: TransformationConfig[]; trigger: Trigger; notifications: NotificationConfig[]; } @@ -32,3 +32,7 @@ export interface AdapterConfig { parameters: object; } } + +export interface TransformationConfig { + func: string; +} From 6e09698d17ec4e27976e5dce82e3bfd32c9a8074 Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Wed, 27 Nov 2019 13:00:02 +0100 Subject: [PATCH 0168/1168] UI: refactor button group in pipeline edit to be standalone component --- ui/src/pipeline/PipelineEdit.vue | 50 +++---------------- .../edit/PipelineEditStepperButtonGroup.vue | 46 +++++++++++++++++ 2 files changed, 52 insertions(+), 44 deletions(-) create mode 100644 ui/src/pipeline/edit/PipelineEditStepperButtonGroup.vue diff --git a/ui/src/pipeline/PipelineEdit.vue b/ui/src/pipeline/PipelineEdit.vue index 908f90205..62087714d 100644 --- a/ui/src/pipeline/PipelineEdit.vue +++ b/ui/src/pipeline/PipelineEdit.vue @@ -51,21 +51,8 @@ Configure the data import - - - Back - - - Next - + + - - Back - - - Next - + - - Back - - - Next - + +
+ + Back + + + Next + +
+ + + + From e22f349b28ba0a84c62d3b0c997225f63eebbcd2 Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Wed, 27 Nov 2019 13:10:29 +0100 Subject: [PATCH 0169/1168] UI: refactor pipeline metadata config into own component --- ui/src/pipeline/PipelineEdit.vue | 29 +++------- .../pipeline/edit/PipelineMetadataConfig.vue | 55 +++++++++++++++++++ 2 files changed, 62 insertions(+), 22 deletions(-) create mode 100644 ui/src/pipeline/edit/PipelineMetadataConfig.vue diff --git a/ui/src/pipeline/PipelineEdit.vue b/ui/src/pipeline/PipelineEdit.vue index 62087714d..a2c283293 100644 --- a/ui/src/pipeline/PipelineEdit.vue +++ b/ui/src/pipeline/PipelineEdit.vue @@ -52,7 +52,7 @@
- + - + - - - - - - + + + + + + + + + + + From 242ecb7bd68a0162d0ffaa68944d24f00b9baeac Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Wed, 27 Nov 2019 13:47:40 +0100 Subject: [PATCH 0170/1168] UI: refactor pipeline trigger config into separate component --- ui/src/pipeline/PipelineEdit.vue | 177 +++--------------- .../pipeline/edit/PipelineTriggerConfig.vue | 167 +++++++++++++++++ 2 files changed, 194 insertions(+), 150 deletions(-) create mode 100644 ui/src/pipeline/edit/PipelineTriggerConfig.vue diff --git a/ui/src/pipeline/PipelineEdit.vue b/ui/src/pipeline/PipelineEdit.vue index a2c283293..d776e79d2 100644 --- a/ui/src/pipeline/PipelineEdit.vue +++ b/ui/src/pipeline/PipelineEdit.vue @@ -24,7 +24,6 @@ Configure Execution Details - + - - - - Interval: {{ dialogIntervalHours }}h {{ dialogIntervalMinutes }}m - Hours - - - - - - - Minutes - - - - - - - - Back - - - Update - - - Save - - + Back + + + Update + + + Save + @@ -211,20 +134,17 @@ import { Watch } from 'vue-property-decorator' import { Action, State } from 'vuex-class' import Pipeline from './pipeline' -import DateTimePicker from '@/components/DateTimePicker.vue' import PipelineAdapterConfig from './edit/PipelineAdapterConfig.vue' import PipelineEditStepperButtonGroup from './edit/PipelineEditStepperButtonGroup.vue' import PipelineMetadataConfig from './edit/PipelineMetadataConfig.vue' import PipelineTransformationConfig from './edit/PipelineTransformationConfig.vue' +import PipelineTriggerConfig from './edit/PipelineTriggerConfig.vue' -const namespace = { namespace: 'pipeline' } -const ONE_HOUR_IN_MS = 3600 * 1000 - -const ONE_MINUTE_IN_MS = 60 * 1000 +const namespace = { namespace: 'pipeline' } @Component({ - components: { DateTimePicker, PipelineAdapterConfig, PipelineEditStepperButtonGroup, PipelineMetadataConfig, PipelineTransformationConfig } + components: { PipelineAdapterConfig, PipelineEditStepperButtonGroup, PipelineMetadataConfig, PipelineTransformationConfig, PipelineTriggerConfig } }) export default class PipelineEdit extends Vue { @Action('loadPipelineById', namespace) private loadPipelineByIdAction!: ( @@ -281,20 +201,6 @@ export default class PipelineEdit extends Vue { notifications: [] } - private dialogIntervalHours = 1 - private dialogIntervalMinutes = 0 - - private hoursTickLabels = ['0h', '', '', '', '', '', '6h', '', '', '', '', '', '12h', '', '', '', '', '', '18h', '', '', '', '', '', '24h'] - private minutesTickLabels = () => { - const ticks = new Array(61) - ticks[0] = '0m' - ticks[15] = '15m' - ticks[30] = '30m' - ticks[45] = '45m' - ticks[60] = '60m' - return ticks - } - created () { this.isEditMode = this.$route.meta.isEditMode @@ -308,44 +214,15 @@ export default class PipelineEdit extends Vue { onSelectedPipelineChange (value: Pipeline, oldValue: Pipeline) { if (value != oldValue) { this.dialogPipeline = value - this.loadDialogIntervalForSlider() } } - private setDialogInterval () { - const hoursInMS = this.dialogIntervalHours * ONE_HOUR_IN_MS - const minutesInMS = this.dialogIntervalMinutes * ONE_MINUTE_IN_MS - this.dialogPipeline.trigger.interval = hoursInMS + minutesInMS - } - - private loadDialogIntervalForSlider () { - if (this.dialogPipeline.trigger.interval <= 1) { - this.dialogIntervalHours = 0 - this.dialogIntervalMinutes = 0 - return - } - - const intervalInMS = this.dialogPipeline.trigger.interval - this.dialogIntervalHours = this.getHoursFromMS(intervalInMS) - this.dialogIntervalMinutes = this.getMinutesFromMS(intervalInMS) - } - - private getHoursFromMS (intervalInMS: number): number { - return Math.floor(intervalInMS / ONE_HOUR_IN_MS) - } - - private getMinutesFromMS (intervalInMS: number): number { - return Math.floor((intervalInMS % ONE_HOUR_IN_MS) / ONE_MINUTE_IN_MS) - } - private onSave () { - this.setDialogInterval() this.createPipelineAction(this.dialogPipeline) this.routeToOverview() } private onUpdate () { - this.setDialogInterval() this.updatePipelineAction(this.dialogPipeline) this.routeToOverview() } diff --git a/ui/src/pipeline/edit/PipelineTriggerConfig.vue b/ui/src/pipeline/edit/PipelineTriggerConfig.vue new file mode 100644 index 000000000..743a77bfa --- /dev/null +++ b/ui/src/pipeline/edit/PipelineTriggerConfig.vue @@ -0,0 +1,167 @@ + + + + From 9d564de85192bf2d8e20861c54c5f672cf017c64 Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Wed, 27 Nov 2019 14:21:12 +0100 Subject: [PATCH 0171/1168] UI: refactor usage of stepper buttons in every step and trigger improvements on textarea and textinput --- ui/src/pipeline/PipelineEdit.vue | 60 +++++++++---------- .../pipeline/edit/PipelineAdapterConfig.vue | 2 +- .../edit/PipelineEditStepperButtonGroup.vue | 10 +++- .../pipeline/edit/PipelineMetadataConfig.vue | 6 +- .../edit/PipelineTransformationConfig.vue | 2 +- 5 files changed, 41 insertions(+), 39 deletions(-) diff --git a/ui/src/pipeline/PipelineEdit.vue b/ui/src/pipeline/PipelineEdit.vue index d776e79d2..36b85892b 100644 --- a/ui/src/pipeline/PipelineEdit.vue +++ b/ui/src/pipeline/PipelineEdit.vue @@ -31,15 +31,8 @@ label="Pipeline Name" :rules="[required]" /> - - Next - + - - Back - - - Update - - - Save - + @@ -122,6 +92,24 @@ > Cancel + + Update + + + Save +
@@ -238,5 +226,13 @@ export default class PipelineEdit extends Vue { private required (val: string) { return !!val || 'required.' } + + private evaluateAllForms() { + return this.validStep1 + && this.validStep2 + && this.validStep3 + && this.validStep4 + && this.validStep5; + } } diff --git a/ui/src/pipeline/edit/PipelineAdapterConfig.vue b/ui/src/pipeline/edit/PipelineAdapterConfig.vue index 4577a213e..de2b4ca6d 100644 --- a/ui/src/pipeline/edit/PipelineAdapterConfig.vue +++ b/ui/src/pipeline/edit/PipelineAdapterConfig.vue @@ -20,7 +20,7 @@ v-model="adapterConfig.protocol.parameters.location" label="URL" :rules="[required]" - @change="formChanged" + @keyup="formChanged" /> diff --git a/ui/src/pipeline/edit/PipelineEditStepperButtonGroup.vue b/ui/src/pipeline/edit/PipelineEditStepperButtonGroup.vue index 872710d39..5a42dca7f 100644 --- a/ui/src/pipeline/edit/PipelineEditStepperButtonGroup.vue +++ b/ui/src/pipeline/edit/PipelineEditStepperButtonGroup.vue @@ -1,12 +1,14 @@ diff --git a/ui/src/pipeline/edit/PipelineTransformationConfig.vue b/ui/src/pipeline/edit/PipelineTransformationConfig.vue index 80055e229..725db8bbf 100644 --- a/ui/src/pipeline/edit/PipelineTransformationConfig.vue +++ b/ui/src/pipeline/edit/PipelineTransformationConfig.vue @@ -7,7 +7,7 @@ label="Transformation function" rows="3" :rules="[required]" - @change="formChanged" + @keyup="formChanged" /> From feb45f418c980ad88e6567c452384fd3e91f3268 Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Thu, 28 Nov 2019 08:45:30 +0100 Subject: [PATCH 0172/1168] System test: Fix config manipulation according to new format --- system-test/src/system.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system-test/src/system.test.js b/system-test/src/system.test.js index 0a533caba..7a153f80c 100644 --- a/system-test/src/system.test.js +++ b/system-test/src/system.test.js @@ -215,7 +215,7 @@ describe('System-Test', () => { pipelineConfig.id = pipelineId const anotherNotification = generateNotification('data.two === \"two\"', MOCK_SERVER_DOCKER+'/notifications/test4_2') pipelineConfig.notifications = [notification, anotherNotification] - pipelineConfig.adapter.location = MOCK_SERVER_DOCKER+'/data/test4_updated' + pipelineConfig.adapter.protocol.parameters.location = MOCK_SERVER_DOCKER+'/data/test4_updated' console.log(`Test 4: Pipeline ${pipelineId} update request triggered.`) // Update pipeline From a716bb0c82ee67d31c09c45279a69ea0e015f18b Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Fri, 29 Nov 2019 09:05:07 +0100 Subject: [PATCH 0173/1168] UI: move location textfield to protocol --- ui/src/pipeline/edit/PipelineAdapterConfig.vue | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ui/src/pipeline/edit/PipelineAdapterConfig.vue b/ui/src/pipeline/edit/PipelineAdapterConfig.vue index de2b4ca6d..69941a4dd 100644 --- a/ui/src/pipeline/edit/PipelineAdapterConfig.vue +++ b/ui/src/pipeline/edit/PipelineAdapterConfig.vue @@ -9,6 +9,12 @@ :rules="[required]" @change="formChanged" /> + - From 8c0e429025a3c7f57a681664dfacc183b1356efa Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Fri, 29 Nov 2019 09:05:45 +0100 Subject: [PATCH 0174/1168] Adapter: add parameter type check for interpreter instances --- .../interpreter/Interpreter.java | 53 ++++++++++------- .../InterpreterParameterDescription.java | 57 +++++++++++++++++++ .../interpreter/JsonInterpreter.java | 5 +- .../interpreter/XmlInterpreter.java | 5 +- 4 files changed, 94 insertions(+), 26 deletions(-) create mode 100644 adapter/src/main/java/org/jvalue/ods/adapterservice/interpreter/InterpreterParameterDescription.java diff --git a/adapter/src/main/java/org/jvalue/ods/adapterservice/interpreter/Interpreter.java b/adapter/src/main/java/org/jvalue/ods/adapterservice/interpreter/Interpreter.java index b7eae3603..32af7b8d3 100644 --- a/adapter/src/main/java/org/jvalue/ods/adapterservice/interpreter/Interpreter.java +++ b/adapter/src/main/java/org/jvalue/ods/adapterservice/interpreter/Interpreter.java @@ -4,34 +4,43 @@ import com.fasterxml.jackson.databind.JsonNode; import java.io.IOException; +import java.util.List; import java.util.Map; -import java.util.Map.Entry; public abstract class Interpreter { - public abstract String getType(); - public abstract String getDescription(); + public abstract String getType(); - @JsonProperty("parameters") - public abstract Map getAvailableParameters(); + public abstract String getDescription(); - public final JsonNode interpret(String data, Map parameters) throws IOException { - validateParameters(parameters); - return doInterpret(data, parameters); - } - protected abstract JsonNode doInterpret(String data, Map parameters) throws IOException; - - protected void validateParameters(Map inputParameters) { - boolean illegalArguments = false; - String illegalArgumentsMessage = ""; - for(Entry requiredParameter: getAvailableParameters().entrySet()) { - if(inputParameters.get(requiredParameter.getKey()) == null) { - illegalArguments = true; - illegalArgumentsMessage = illegalArgumentsMessage + getType() + " importer requires parameter " + requiredParameter.getKey() + "/n"; - } - } - if(illegalArguments) { - throw new IllegalArgumentException(illegalArgumentsMessage); + @JsonProperty("parameters") + public abstract List getAvailableParameters(); + + public final JsonNode interpret(String data, Map parameters) throws IOException { + validateParameters(parameters); + return doInterpret(data, parameters); + } + + protected abstract JsonNode doInterpret(String data, Map parameters) throws IOException; + + protected void validateParameters(Map inputParameters) { + boolean illegalArguments = false; + String illegalArgumentsMessage = ""; + + for (InterpreterParameterDescription requiredParameter : getAvailableParameters()) { + if (inputParameters.get(requiredParameter.getName()) == null) { + illegalArguments = true; + illegalArgumentsMessage = illegalArgumentsMessage + getType() + " interpreter requires parameter " + + requiredParameter.getName() + "/n"; + + } else if (inputParameters.get(requiredParameter.getName()).getClass() != requiredParameter.getType()) { + illegalArguments = true; + illegalArgumentsMessage = illegalArgumentsMessage + getType() + " interpreter requires parameter " + + requiredParameter.getName() + " to be type " + requiredParameter.getType().toString() + "/n"; } } + if (illegalArguments) { + throw new IllegalArgumentException(illegalArgumentsMessage); + } + } } diff --git a/adapter/src/main/java/org/jvalue/ods/adapterservice/interpreter/InterpreterParameterDescription.java b/adapter/src/main/java/org/jvalue/ods/adapterservice/interpreter/InterpreterParameterDescription.java new file mode 100644 index 000000000..b7172aeb2 --- /dev/null +++ b/adapter/src/main/java/org/jvalue/ods/adapterservice/interpreter/InterpreterParameterDescription.java @@ -0,0 +1,57 @@ +package org.jvalue.ods.adapterservice.interpreter; + +import java.lang.reflect.Type; +import java.util.Objects; + +public class InterpreterParameterDescription { + private String name; + private String description; + private Class type; + + private InterpreterParameterDescription() { } + + public InterpreterParameterDescription(String name, String description, Class type) { + this.name = name; + this.description = description; + this.type = type; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Class getType() { + return type; + } + + public void setType(Class type) { + this.type = type; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + InterpreterParameterDescription that = (InterpreterParameterDescription) o; + return Objects.equals(name, that.name) && + Objects.equals(description, that.description) && + Objects.equals(type, that.type); + } + + @Override + public int hashCode() { + return Objects.hash(name, description, type); + } +} diff --git a/adapter/src/main/java/org/jvalue/ods/adapterservice/interpreter/JsonInterpreter.java b/adapter/src/main/java/org/jvalue/ods/adapterservice/interpreter/JsonInterpreter.java index 19cf42456..62c63dbae 100644 --- a/adapter/src/main/java/org/jvalue/ods/adapterservice/interpreter/JsonInterpreter.java +++ b/adapter/src/main/java/org/jvalue/ods/adapterservice/interpreter/JsonInterpreter.java @@ -5,11 +5,12 @@ import java.io.IOException; import java.util.Collections; +import java.util.List; import java.util.Map; public class JsonInterpreter extends Interpreter { - private final Map parameters = Collections.unmodifiableMap(Map.of()); + private final List parameters = Collections.unmodifiableList(List.of()); private final ObjectMapper mapper = new ObjectMapper(); @Override @@ -23,7 +24,7 @@ public String getDescription() { } @Override - public Map getAvailableParameters() { + public List getAvailableParameters() { return parameters; } diff --git a/adapter/src/main/java/org/jvalue/ods/adapterservice/interpreter/XmlInterpreter.java b/adapter/src/main/java/org/jvalue/ods/adapterservice/interpreter/XmlInterpreter.java index dce0062f3..0a59f035d 100644 --- a/adapter/src/main/java/org/jvalue/ods/adapterservice/interpreter/XmlInterpreter.java +++ b/adapter/src/main/java/org/jvalue/ods/adapterservice/interpreter/XmlInterpreter.java @@ -5,11 +5,12 @@ import java.io.IOException; import java.util.Collections; +import java.util.List; import java.util.Map; public class XmlInterpreter extends Interpreter { - private final Map parameters = Collections.unmodifiableMap(Map.of()); + private final List parameters = Collections.unmodifiableList(List.of()); private final XmlMapper mapper = new XmlMapper(); @Override @@ -23,7 +24,7 @@ public String getDescription() { } @Override - public Map getAvailableParameters() { + public List getAvailableParameters() { return parameters; } From 2ef281c703c09f70ccb839525b66d1564f72c933 Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Fri, 29 Nov 2019 09:06:10 +0100 Subject: [PATCH 0175/1168] Adapter: first implementation of CSVInterpreter, still to be improved! --- .../interpreter/CsvInterpreter.java | 66 +++++++++++++++++++ .../interpreter/CsvInterpreterTest.java | 60 +++++++++++++++++ 2 files changed, 126 insertions(+) create mode 100644 adapter/src/main/java/org/jvalue/ods/adapterservice/interpreter/CsvInterpreter.java create mode 100644 adapter/src/test/java/org/jvalue/ods/adapterservice/interpreter/CsvInterpreterTest.java diff --git a/adapter/src/main/java/org/jvalue/ods/adapterservice/interpreter/CsvInterpreter.java b/adapter/src/main/java/org/jvalue/ods/adapterservice/interpreter/CsvInterpreter.java new file mode 100644 index 000000000..cdc8885b0 --- /dev/null +++ b/adapter/src/main/java/org/jvalue/ods/adapterservice/interpreter/CsvInterpreter.java @@ -0,0 +1,66 @@ +package org.jvalue.ods.adapterservice.interpreter; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.MappingIterator; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.dataformat.csv.CsvMapper; +import com.fasterxml.jackson.dataformat.csv.CsvParser; +import com.fasterxml.jackson.dataformat.csv.CsvSchema; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +public class CsvInterpreter extends Interpreter { + + private final List parameters = Collections.unmodifiableList(List.of( + new InterpreterParameterDescription("columnSeparator", "Column delimiter character", Character.class), + new InterpreterParameterDescription("lineSeparator", "Line delimiter character", String.class), + new InterpreterParameterDescription("skipFirstDataRow", "Skip first data row (after header)", Boolean.class), + new InterpreterParameterDescription("firstRowAsHeader", "Interpret first row as header for columns", Boolean.class) + )); + private final CsvMapper mapper = new CsvMapper().enable(CsvParser.Feature.WRAP_AS_ARRAY); + private final ObjectMapper jsonMapper = new ObjectMapper(); + + @Override + public String getType() { + return "CSV"; + } + + @Override + public String getDescription() { + return "Interpret data as CSV data"; + } + + @Override + public List getAvailableParameters() { + return parameters; + } + + @Override + protected JsonNode doInterpret(String data, Map parameters) throws IOException { + CsvSchema csvSchema = CsvSchema + .emptySchema() + .withColumnSeparator((char) parameters.get("columnSeparator")) + .withLineSeparator((String) parameters.get("lineSeparator")) + .withSkipFirstDataRow((boolean) parameters.get("skipFirstDataRow")); + if((boolean) parameters.get("firstRowAsHeader")) { + csvSchema = csvSchema + .withHeader(); + } + MappingIterator allLines = mapper + .readerFor(Object[].class) + .with(csvSchema) + .readValues(data); + + ArrayNode result = mapper.createArrayNode(); + while(allLines.hasNext()) { + result.add(jsonMapper.valueToTree(allLines.next())); + } + + return result; + } +} diff --git a/adapter/src/test/java/org/jvalue/ods/adapterservice/interpreter/CsvInterpreterTest.java b/adapter/src/test/java/org/jvalue/ods/adapterservice/interpreter/CsvInterpreterTest.java new file mode 100644 index 000000000..c3ee96033 --- /dev/null +++ b/adapter/src/test/java/org/jvalue/ods/adapterservice/interpreter/CsvInterpreterTest.java @@ -0,0 +1,60 @@ +package org.jvalue.ods.adapterservice.interpreter; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.JsonNodeType; +import org.junit.Test; + +import java.io.IOException; +import java.util.Map; + +import static org.junit.Assert.assertEquals; + +public class CsvInterpreterTest { + private final Interpreter interpreter = new CsvInterpreter(); + private static final String CSV_STRING = "1;2;sadf\n5;3;fasd"; + private final ObjectMapper mapper = new ObjectMapper(); + + @Test + public void interpretCSVData() throws IOException { + JsonNode result = interpreter.interpret(CSV_STRING, Map.of( + "columnSeparator", ';', + "lineSeparator", "/n", + "skipFirstDataRow", false, + "firstRowAsHeader", false + )); + + assertEquals(JsonNodeType.ARRAY, result.getNodeType()); + final ArrayNode results = (ArrayNode) result; + + JsonNode row = results.get(0); + // TODO + } + + @Test(expected = IllegalArgumentException.class) + public void interpretMissingParameters() throws IOException { + interpreter.interpret("{\"this is\":\"no CSV\"", Map.of()); + } + + @Test(expected = IllegalArgumentException.class) + public void interpretWrongParameterType() throws IOException { + interpreter.interpret("{\"this is\":\"no CSV\"", Map.of("columnSeparator", "String")); + } + + @Test + public void testSerialization() throws IOException { + JsonNode expected = mapper.readTree("{\"type\":\"CSV\"," + + "\"description\":\"Interpret data as CSV data\"," + + "\"parameters\":[" + + "{\"name\":\"columnSeparator\",\"description\":\"Column delimiter character\",\"type\":\"java.lang.Character\"}," + + "{\"name\":\"lineSeparator\",\"description\":\"Line delimiter character\",\"type\":\"java.lang.String\"}," + + "{\"name\":\"skipFirstDataRow\",\"description\":\"Skip first data row (after header)\",\"type\":\"java.lang.Boolean\"}," + + "{\"name\":\"firstRowAsHeader\",\"description\":\"Interpret first row as header for columns\",\"type\":\"java.lang.Boolean\"}" + + "]}"); + JsonNode result = mapper.valueToTree(interpreter); + + assertEquals(expected, result); + } + +} From ab1f1acadba7044048f2153156bc2d257be1a40e Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Fri, 29 Nov 2019 14:08:26 +0100 Subject: [PATCH 0176/1168] transformation: Apply linter --- transformation/src/jsTransformationService.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/transformation/src/jsTransformationService.ts b/transformation/src/jsTransformationService.ts index 3ecb1eaec..b801eb18c 100644 --- a/transformation/src/jsTransformationService.ts +++ b/transformation/src/jsTransformationService.ts @@ -11,7 +11,6 @@ import SandboxExecutor from './interfaces/sandboxExecutor' import SlackCallback from './interfaces/slackCallback' import FcmCallback from './interfaces/fcmCallback' import WebhookCallback from './interfaces/webhookCallback' -import { stringLiteral } from '@babel/types' const VERSION = '0.0.2' @@ -101,7 +100,6 @@ export default class JSTransformationService implements TransformationService { } private async handleFCM (request: NotificationRequest): Promise { - var firebaseMessage: FcmCallback = { notification: { title: 'New Data Available', @@ -111,7 +109,6 @@ export default class JSTransformationService implements TransformationService { topic: 'test' } - // Providing a service account object inline firebaseAdmin.initializeApp({ credential: firebaseAdmin.credential.cert({ projectId: 'nebelalarm', @@ -119,7 +116,7 @@ export default class JSTransformationService implements TransformationService { privateKey: '-----BEGIN PRIVATE KEY-----\nMIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCxY1BIf1aivKlb\nYx11lnEDx/AD6I/W5rf+/wtpv2OSF9U+xUYg57k7NYhfHsGj33dU+cNplZ1lsmx4\noV9eUEgbpOjfM0PRwbxfs+51bHIuewdtX8EjN7+Zh176NRVv8CwSTjxd8XYp/Mse\n5Zy1EECTHNp+rSc9QxV224TeebVD8Pm/n6EMEm9MKDsFJe5NIc4MK6t2AVL6xvww\nNTam26pE+Sfa77/2a6IkFSTu1Xr8IAqa2HZ29Ttodsf3wKbWr2drlfxHdtz2bjbB\n6FElY9jVMNqXsSF3+3zrVyQ3lmuH4Qy+bpbsSALyb2kWVK4rQoYbG+NFJcMSeiuu\nqRqnQ4mDAgMBAAECggEAGWHjoAFl7TK1F8Lj+T/F+3YwOERJKMVUzg5tR1FqjFdl\nXRkErZAFfPJuXrtblqOoQ1GF47rT4zRtDwnQSAI8Kdsms0wg8ofCo6hvK6rmimjH\nqZ/frAwTGi3jqkZ5mHiJEIl/W9XsREUhmicy4uRoyQ7Xjkl1Pu/gHLomlgsGTqqT\n1Y4HTJeMrwJUcatdXBH7vSgaK/vuVI3sqR56ytvea9oHQNPnDWoTMo+SoyBW7ccs\nOqlQyJYWJBt2FBtrQtSVqlKM2jr/94bzdUN2FAq0I8e006Rv5fwvTcU3VVHIr6M3\nFK+tKfyNLKhO5kJCgi2Tb0sMVHf7LI1SH+WaKFib0QKBgQD63MLExNRySIZpgVb6\nr1F/gw1CZ01TcPfupRmUFwDyaSBLqIAxsIpobp02If6RxgYV8pq5WhJvVvSBT2gZ\nMjdsWlnLHwHfZFJNB5TP7oEoUZDXbXYJpXjwHUsh3vDR4iR5MoslJuKsQVkZ5bo7\n8kHOdqF9XsKOpWoV14GV22LUGwKBgQC1BVX9W1Hvsf1k1DDRQONSNULKdSKILvEn\nB8A7SkBc0MK1chMIsNeucJcs8M+cj9kqhb9uyS6TxdQ45H1xN617beZgsQBDnUtz\nLATrifrvYSHt8bcD60I51ewOubD3KXTerPs50Umpicgg1stvlLc4mNOVsgBkfB5K\nIU4+y1jmuQKBgQC0v6NGC1vXDBJsqlh1PyTFbzN6iNvaJyc8t5B6dyijgMNYQAw9\nwSm4nRqBCnVVqwxve+GncxKdTlXVZdVnchsk4uSXybubrbju72t1di9xUXO/BItr\n3+IHf9PGj8+MKhiFirlfB2mDG4KLek55Ks/nZupsXn5oMR8CpcgkpXHLyQKBgQCW\nzDolFCT+u9SuYUHFn/t+6VWZmNjKf+hurjtKaQGTEGmTg9MtYzxZWfvl+TnKX972\nWHLv1HKTsbKoLlf9r/c6IoRPOkRRD0DiUeJLYSeEsPL16G2guyPxUC8U2UX9sDBm\nq82hDaMCs//es3DHpCi54j4orx86llcZRAONthJ6KQKBgQCIEXEdOryxHJc+JIy0\nQhrnm/il6z5MWNaVdRKx10xcw/GAh7OYQkJAg6LbfQo/frNGT4l4VEHG1m5utCCQ\nbCWpXNkNcQGyry55bKAh9HpZmh0yt8A/6zcJatAe+xujgW0aWU4bIEJTo/KbUNgJ\nGYwrY0yu2CP1sUxetyZ/mYVklw==\n-----END PRIVATE KEY-----\n' }), databaseURL: 'https://nebelalarm.firebaseio.com' - }); + }) firebaseAdmin.messaging().send(firebaseMessage) } From 17630899d078758bc1bc511b8e80ef9cfe652512 Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Sun, 1 Dec 2019 20:26:56 +0100 Subject: [PATCH 0177/1168] transformation: Adapt unit tests for firebase notifications --- transformation/src/jsTransformationService.test.ts | 13 +++++++++++++ transformation/src/jsTransformationService.ts | 8 ++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/transformation/src/jsTransformationService.test.ts b/transformation/src/jsTransformationService.test.ts index 475f3cef9..f110cec14 100644 --- a/transformation/src/jsTransformationService.test.ts +++ b/transformation/src/jsTransformationService.test.ts @@ -1,5 +1,6 @@ /* eslint-env jest */ import axios from 'axios' +import * as firebase from 'firebase-admin' import { NotificationRequest, NotificationType } from './interfaces/notificationRequest' import TransformationService from './interfaces/transformationService' @@ -11,6 +12,7 @@ import SlackCallback from './interfaces/slackCallback' import fcmCallback from './interfaces/fcmCallback' jest.mock('axios') +jest.mock('firebase') describe('JSTransformationService', () => { describe('valid execution', () => { @@ -68,6 +70,8 @@ describe('JSTransformationService', () => { } const post = axios.post as jest.Mock + const init = firebase.initializeApp as jest.Mock + const send = firebase.messaging().send as jest.Mock let transformationService: TransformationService @@ -152,6 +156,15 @@ describe('JSTransformationService', () => { } await transformationService.handleNotification(request) + expect(firebase.initializeApp).toHaveBeenCalledTimes(1) + expect(firebase.messaging().send).toHaveBeenCalledWith({ + notification: { + title: 'New Data Available', + body: `Pipeline ${request.pipelineName}(${request.pipelineId}) has new data available.` + + `Fetch at ${request.dataLocation}.` + }, + topic: 'test' + }) expect(post).toHaveBeenCalledTimes(1) expect(post.mock.calls[0][0]).toEqual(request.url) expect(post.mock.calls[0][1]).toEqual(expectedObject) diff --git a/transformation/src/jsTransformationService.ts b/transformation/src/jsTransformationService.ts index b801eb18c..01c3b0a9a 100644 --- a/transformation/src/jsTransformationService.ts +++ b/transformation/src/jsTransformationService.ts @@ -1,5 +1,5 @@ import axios from 'axios' -import * as firebaseAdmin from 'firebase-admin' +import * as firebase from 'firebase-admin' import ExecutionResult from './interfaces/executionResult' import JobResult from './interfaces/jobResult' @@ -109,8 +109,8 @@ export default class JSTransformationService implements TransformationService { topic: 'test' } - firebaseAdmin.initializeApp({ - credential: firebaseAdmin.credential.cert({ + firebase.initializeApp({ + credential: firebase.credential.cert({ projectId: 'nebelalarm', clientEmail: 'firebase-adminsdk-th6w9@nebelalarm.iam.gserviceaccount.com', privateKey: '-----BEGIN PRIVATE KEY-----\nMIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCxY1BIf1aivKlb\nYx11lnEDx/AD6I/W5rf+/wtpv2OSF9U+xUYg57k7NYhfHsGj33dU+cNplZ1lsmx4\noV9eUEgbpOjfM0PRwbxfs+51bHIuewdtX8EjN7+Zh176NRVv8CwSTjxd8XYp/Mse\n5Zy1EECTHNp+rSc9QxV224TeebVD8Pm/n6EMEm9MKDsFJe5NIc4MK6t2AVL6xvww\nNTam26pE+Sfa77/2a6IkFSTu1Xr8IAqa2HZ29Ttodsf3wKbWr2drlfxHdtz2bjbB\n6FElY9jVMNqXsSF3+3zrVyQ3lmuH4Qy+bpbsSALyb2kWVK4rQoYbG+NFJcMSeiuu\nqRqnQ4mDAgMBAAECggEAGWHjoAFl7TK1F8Lj+T/F+3YwOERJKMVUzg5tR1FqjFdl\nXRkErZAFfPJuXrtblqOoQ1GF47rT4zRtDwnQSAI8Kdsms0wg8ofCo6hvK6rmimjH\nqZ/frAwTGi3jqkZ5mHiJEIl/W9XsREUhmicy4uRoyQ7Xjkl1Pu/gHLomlgsGTqqT\n1Y4HTJeMrwJUcatdXBH7vSgaK/vuVI3sqR56ytvea9oHQNPnDWoTMo+SoyBW7ccs\nOqlQyJYWJBt2FBtrQtSVqlKM2jr/94bzdUN2FAq0I8e006Rv5fwvTcU3VVHIr6M3\nFK+tKfyNLKhO5kJCgi2Tb0sMVHf7LI1SH+WaKFib0QKBgQD63MLExNRySIZpgVb6\nr1F/gw1CZ01TcPfupRmUFwDyaSBLqIAxsIpobp02If6RxgYV8pq5WhJvVvSBT2gZ\nMjdsWlnLHwHfZFJNB5TP7oEoUZDXbXYJpXjwHUsh3vDR4iR5MoslJuKsQVkZ5bo7\n8kHOdqF9XsKOpWoV14GV22LUGwKBgQC1BVX9W1Hvsf1k1DDRQONSNULKdSKILvEn\nB8A7SkBc0MK1chMIsNeucJcs8M+cj9kqhb9uyS6TxdQ45H1xN617beZgsQBDnUtz\nLATrifrvYSHt8bcD60I51ewOubD3KXTerPs50Umpicgg1stvlLc4mNOVsgBkfB5K\nIU4+y1jmuQKBgQC0v6NGC1vXDBJsqlh1PyTFbzN6iNvaJyc8t5B6dyijgMNYQAw9\nwSm4nRqBCnVVqwxve+GncxKdTlXVZdVnchsk4uSXybubrbju72t1di9xUXO/BItr\n3+IHf9PGj8+MKhiFirlfB2mDG4KLek55Ks/nZupsXn5oMR8CpcgkpXHLyQKBgQCW\nzDolFCT+u9SuYUHFn/t+6VWZmNjKf+hurjtKaQGTEGmTg9MtYzxZWfvl+TnKX972\nWHLv1HKTsbKoLlf9r/c6IoRPOkRRD0DiUeJLYSeEsPL16G2guyPxUC8U2UX9sDBm\nq82hDaMCs//es3DHpCi54j4orx86llcZRAONthJ6KQKBgQCIEXEdOryxHJc+JIy0\nQhrnm/il6z5MWNaVdRKx10xcw/GAh7OYQkJAg6LbfQo/frNGT4l4VEHG1m5utCCQ\nbCWpXNkNcQGyry55bKAh9HpZmh0yt8A/6zcJatAe+xujgW0aWU4bIEJTo/KbUNgJ\nGYwrY0yu2CP1sUxetyZ/mYVklw==\n-----END PRIVATE KEY-----\n' @@ -118,6 +118,6 @@ export default class JSTransformationService implements TransformationService { databaseURL: 'https://nebelalarm.firebaseio.com' }) - firebaseAdmin.messaging().send(firebaseMessage) + firebase.messaging().send(firebaseMessage) } } From dcd9f7c0912bd20908d7ad82a1ab7936336f11cb Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Sun, 1 Dec 2019 20:29:05 +0100 Subject: [PATCH 0178/1168] transformation: Fix bug in firebase notification unit test --- transformation/src/jsTransformationService.test.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/transformation/src/jsTransformationService.test.ts b/transformation/src/jsTransformationService.test.ts index f110cec14..319748010 100644 --- a/transformation/src/jsTransformationService.test.ts +++ b/transformation/src/jsTransformationService.test.ts @@ -165,9 +165,6 @@ describe('JSTransformationService', () => { }, topic: 'test' }) - expect(post).toHaveBeenCalledTimes(1) - expect(post.mock.calls[0][0]).toEqual(request.url) - expect(post.mock.calls[0][1]).toEqual(expectedObject) }) test('SLACK request', async () => { From ccf41979b2d35ff69819cbf1aa42ffb0af315944 Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Sun, 1 Dec 2019 21:16:22 +0100 Subject: [PATCH 0179/1168] transformation: WIP try to mock firebase sdk --- transformation/src/jsTransformationService.test.ts | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/transformation/src/jsTransformationService.test.ts b/transformation/src/jsTransformationService.test.ts index 319748010..41979474a 100644 --- a/transformation/src/jsTransformationService.test.ts +++ b/transformation/src/jsTransformationService.test.ts @@ -1,6 +1,6 @@ /* eslint-env jest */ import axios from 'axios' -import * as firebase from 'firebase-admin' +import {initializeApp as firebaseInit, messaging as firebaseMessaging}from 'firebase-admin' import { NotificationRequest, NotificationType } from './interfaces/notificationRequest' import TransformationService from './interfaces/transformationService' @@ -12,7 +12,7 @@ import SlackCallback from './interfaces/slackCallback' import fcmCallback from './interfaces/fcmCallback' jest.mock('axios') -jest.mock('firebase') +jest.mock('firebase-admin') describe('JSTransformationService', () => { describe('valid execution', () => { @@ -69,9 +69,8 @@ describe('JSTransformationService', () => { value1: 5 } + const post = axios.post as jest.Mock - const init = firebase.initializeApp as jest.Mock - const send = firebase.messaging().send as jest.Mock let transformationService: TransformationService @@ -156,8 +155,8 @@ describe('JSTransformationService', () => { } await transformationService.handleNotification(request) - expect(firebase.initializeApp).toHaveBeenCalledTimes(1) - expect(firebase.messaging().send).toHaveBeenCalledWith({ + expect(init).toHaveBeenCalledTimes(1) + expect(send).toHaveBeenCalledWith({ notification: { title: 'New Data Available', body: `Pipeline ${request.pipelineName}(${request.pipelineId}) has new data available.` + From b714b725019509e67796703596baff4bd088abfb Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Mon, 2 Dec 2019 10:55:20 +0100 Subject: [PATCH 0180/1168] transformation: Remove firebase notification test for now --- .../src/jsTransformationService.test.ts | 34 ------------------- 1 file changed, 34 deletions(-) diff --git a/transformation/src/jsTransformationService.test.ts b/transformation/src/jsTransformationService.test.ts index 41979474a..ba6ac05b4 100644 --- a/transformation/src/jsTransformationService.test.ts +++ b/transformation/src/jsTransformationService.test.ts @@ -1,6 +1,5 @@ /* eslint-env jest */ import axios from 'axios' -import {initializeApp as firebaseInit, messaging as firebaseMessaging}from 'firebase-admin' import { NotificationRequest, NotificationType } from './interfaces/notificationRequest' import TransformationService from './interfaces/transformationService' @@ -9,10 +8,8 @@ import JSTransformationService from './jsTransformationService' import VM2SandboxExecutor from './vm2SandboxExecutor' import SandboxExecutor from './interfaces/sandboxExecutor' import SlackCallback from './interfaces/slackCallback' -import fcmCallback from './interfaces/fcmCallback' jest.mock('axios') -jest.mock('firebase-admin') describe('JSTransformationService', () => { describe('valid execution', () => { @@ -135,37 +132,6 @@ describe('JSTransformationService', () => { expect(post).not.toHaveBeenCalled() }) - test('FCM request', async () => { - const request: NotificationRequest = { - condition: 'data.value1 > 0', - data, - dataLocation: 'data', - notificationType: NotificationType.FCM, - pipelineId: 42, - pipelineName: 'AnswerToEverything-Pipeline', - url: 'yo' - } - const expectedObject: fcmCallback = { - notification: { - title: 'New Data Available', - body: `Pipeline ${request.pipelineName}(${request.pipelineId}) has new data available.` + - `Fetch at ${request.dataLocation}.` - }, - topic: 'test' - } - await transformationService.handleNotification(request) - - expect(init).toHaveBeenCalledTimes(1) - expect(send).toHaveBeenCalledWith({ - notification: { - title: 'New Data Available', - body: `Pipeline ${request.pipelineName}(${request.pipelineId}) has new data available.` + - `Fetch at ${request.dataLocation}.` - }, - topic: 'test' - }) - }) - test('SLACK request', async () => { const request: NotificationRequest = { condition: 'data.value1 > 0', From 758fdc5a247f49d27d2d9e7fde3c8215aceec296 Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Mon, 2 Dec 2019 10:56:51 +0100 Subject: [PATCH 0181/1168] transformation: Fix lint error --- transformation/src/jsTransformationService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/transformation/src/jsTransformationService.ts b/transformation/src/jsTransformationService.ts index 01c3b0a9a..f1380501f 100644 --- a/transformation/src/jsTransformationService.ts +++ b/transformation/src/jsTransformationService.ts @@ -100,7 +100,7 @@ export default class JSTransformationService implements TransformationService { } private async handleFCM (request: NotificationRequest): Promise { - var firebaseMessage: FcmCallback = { + const firebaseMessage: FcmCallback = { notification: { title: 'New Data Available', body: `Pipeline ${request.pipelineName}(${request.pipelineId}) has new data available.` + From 8a18aeaade3586f1917ad01a229d0faec73b6b0f Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Mon, 2 Dec 2019 11:30:44 +0100 Subject: [PATCH 0182/1168] transformation: Remove firebase notification integration test for now --- .../src/transformation.test.js | 32 ------------------- 1 file changed, 32 deletions(-) diff --git a/transformation/integration-test/src/transformation.test.js b/transformation/integration-test/src/transformation.test.js index 47ae8989c..33bfa46b5 100644 --- a/transformation/integration-test/src/transformation.test.js +++ b/transformation/integration-test/src/transformation.test.js @@ -222,38 +222,6 @@ describe('Scheduler', () => { .toEqual(`New data available for pipeline ${slackJob.pipelineName}(${slackJob.pipelineId}). Fetch at ${dataLocation}.`) }) - test('POST /notification triggers firebase notification', async () => { - const dataLocation = 'storage/567' - const fcmJob = { - pipelineName: "fire", - pipelineId: 23, - url: MOCK_RECEIVER_URL + '/fcm', - dataLocation, - data: { - niceNumber: 23 - }, - condition: "data.niceNumber > 0", - notificationType: 'FCM' - } - - const transformationResponse = await request(URL) - .post('/notification') - .send(fcmJob) - expect(transformationResponse.status).toEqual(200) - - await sleep(3000) - - const receiverResponse = await request(MOCK_RECEIVER_URL) - .get('/fcm') - - expect(receiverResponse.status).toEqual(200) - expect(receiverResponse.body.validate_only).toEqual(false) - expect(receiverResponse.body.message.notification.title).toEqual('New Data Available') - expect(receiverResponse.body.message.notification.body).toEqual(`Pipeline ${fcmJob.pipelineName}(${fcmJob.pipelineId}) has new data available.` + - `Fetch at ${fcmJob.dataLocation}.`) - - }) - function sleep (ms) { return new Promise(resolve => setTimeout(resolve, ms)) } From f7ae4a8e50c4d0d16fa3f0ccd7fb522992805d06 Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Mon, 2 Dec 2019 13:02:19 +0100 Subject: [PATCH 0183/1168] transformation: Include data in firebase notification message --- transformation/src/interfaces/fcmCallback.ts | 3 ++- transformation/src/jsTransformationService.ts | 7 ++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/transformation/src/interfaces/fcmCallback.ts b/transformation/src/interfaces/fcmCallback.ts index f4b9e90f5..b53f51931 100644 --- a/transformation/src/interfaces/fcmCallback.ts +++ b/transformation/src/interfaces/fcmCallback.ts @@ -2,6 +2,7 @@ export default interface FcmCallback { notification: { title: string; body: string; - }, + }; + data?: {[key: string]: string}; topic: string; } diff --git a/transformation/src/jsTransformationService.ts b/transformation/src/jsTransformationService.ts index f1380501f..a6658c006 100644 --- a/transformation/src/jsTransformationService.ts +++ b/transformation/src/jsTransformationService.ts @@ -106,6 +106,9 @@ export default class JSTransformationService implements TransformationService { body: `Pipeline ${request.pipelineName}(${request.pipelineId}) has new data available.` + `Fetch at ${request.dataLocation}.` }, + data: { + textfield: 'textvalue' + }, topic: 'test' } @@ -118,6 +121,8 @@ export default class JSTransformationService implements TransformationService { databaseURL: 'https://nebelalarm.firebaseio.com' }) - firebase.messaging().send(firebaseMessage) + const firebaseResponse = await firebase.messaging().send(firebaseMessage) + console.log(`type of response ${typeof firebaseResponse}`) + console.log(`response: ${firebaseResponse}`) } } From c074392fc3ff0ba7181195c3f147329227300031 Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Tue, 3 Dec 2019 09:48:25 +0100 Subject: [PATCH 0184/1168] Scheduler: move model interfaces to generic directory again --- scheduler/src/clients/adapter-client.ts | 2 +- scheduler/src/clients/core-client.ts | 4 ++-- scheduler/src/clients/storage-client.ts | 2 +- scheduler/src/interfaces/{core => }/adapter-config.ts | 0 scheduler/src/interfaces/{core => }/notification-config.ts | 0 scheduler/src/interfaces/{core => }/pipeline-config.ts | 2 +- scheduler/src/interfaces/{core => }/pipeline-event.ts | 0 scheduler/src/interfaces/{core => }/pipeline-job.ts | 0 scheduler/src/interfaces/{core => }/trigger-config.ts | 0 scheduler/src/pipeline-execution.test.ts | 4 ++-- scheduler/src/pipeline-execution.ts | 2 +- scheduler/src/pipeline-scheduling.test.ts | 4 ++-- scheduler/src/pipeline-scheduling.ts | 6 +++--- 13 files changed, 13 insertions(+), 13 deletions(-) rename scheduler/src/interfaces/{core => }/adapter-config.ts (100%) rename scheduler/src/interfaces/{core => }/notification-config.ts (100%) rename scheduler/src/interfaces/{core => }/pipeline-config.ts (91%) rename scheduler/src/interfaces/{core => }/pipeline-event.ts (100%) rename scheduler/src/interfaces/{core => }/pipeline-job.ts (100%) rename scheduler/src/interfaces/{core => }/trigger-config.ts (100%) diff --git a/scheduler/src/clients/adapter-client.ts b/scheduler/src/clients/adapter-client.ts index 151e409e9..71365e4b5 100644 --- a/scheduler/src/clients/adapter-client.ts +++ b/scheduler/src/clients/adapter-client.ts @@ -1,6 +1,6 @@ import axios, { AxiosResponse } from 'axios' -import { default as AdapterConfig } from '../interfaces/core/adapter-config' +import { default as AdapterConfig } from '../interfaces/adapter-config' const ADAPTER_SERVICE_URL = process.env.ADAPTER_SERVICE_URL || 'http://localhost:8082' const ADAPTER_SERVICE_IMPORT_URL = ADAPTER_SERVICE_URL + '/dataImport' diff --git a/scheduler/src/clients/core-client.ts b/scheduler/src/clients/core-client.ts index b293ee566..b5278b519 100644 --- a/scheduler/src/clients/core-client.ts +++ b/scheduler/src/clients/core-client.ts @@ -1,6 +1,6 @@ import axios from 'axios' -import PipelineConfig from '../interfaces/core/pipeline-config' -import PipelineEvent from '../interfaces/core/pipeline-event' +import PipelineConfig from '../interfaces/pipeline-config' +import PipelineEvent from '../interfaces/pipeline-event' export const CONFIG_SERVICE_URL = process.env.CONFIG_SERVICE_URL || 'http://localhost:8081' const CONFIG_SERVICE_PIPELINES_URL = CONFIG_SERVICE_URL + '/pipelines' diff --git a/scheduler/src/clients/storage-client.ts b/scheduler/src/clients/storage-client.ts index cf08cd722..3f2bf09e2 100644 --- a/scheduler/src/clients/storage-client.ts +++ b/scheduler/src/clients/storage-client.ts @@ -1,6 +1,6 @@ import axios from 'axios' -import PipelineConfig from '../interfaces/core/pipeline-config' +import PipelineConfig from '../interfaces/pipeline-config' const STORAGE_SERVICE_URL = process.env.STORAGE_SERVICE_URL || 'http://localhost:8084' diff --git a/scheduler/src/interfaces/core/adapter-config.ts b/scheduler/src/interfaces/adapter-config.ts similarity index 100% rename from scheduler/src/interfaces/core/adapter-config.ts rename to scheduler/src/interfaces/adapter-config.ts diff --git a/scheduler/src/interfaces/core/notification-config.ts b/scheduler/src/interfaces/notification-config.ts similarity index 100% rename from scheduler/src/interfaces/core/notification-config.ts rename to scheduler/src/interfaces/notification-config.ts diff --git a/scheduler/src/interfaces/core/pipeline-config.ts b/scheduler/src/interfaces/pipeline-config.ts similarity index 91% rename from scheduler/src/interfaces/core/pipeline-config.ts rename to scheduler/src/interfaces/pipeline-config.ts index c0b54f8ff..a8b59b2d6 100644 --- a/scheduler/src/interfaces/core/pipeline-config.ts +++ b/scheduler/src/interfaces/pipeline-config.ts @@ -1,5 +1,5 @@ import TriggerConfig from './trigger-config' -import Metadata from '../metadata' +import Metadata from './metadata' import AdapterConfig from './adapter-config' import NotificationConfig from './notification-config' diff --git a/scheduler/src/interfaces/core/pipeline-event.ts b/scheduler/src/interfaces/pipeline-event.ts similarity index 100% rename from scheduler/src/interfaces/core/pipeline-event.ts rename to scheduler/src/interfaces/pipeline-event.ts diff --git a/scheduler/src/interfaces/core/pipeline-job.ts b/scheduler/src/interfaces/pipeline-job.ts similarity index 100% rename from scheduler/src/interfaces/core/pipeline-job.ts rename to scheduler/src/interfaces/pipeline-job.ts diff --git a/scheduler/src/interfaces/core/trigger-config.ts b/scheduler/src/interfaces/trigger-config.ts similarity index 100% rename from scheduler/src/interfaces/core/trigger-config.ts rename to scheduler/src/interfaces/trigger-config.ts diff --git a/scheduler/src/pipeline-execution.test.ts b/scheduler/src/pipeline-execution.test.ts index 07a18c4fa..561e0cc63 100644 --- a/scheduler/src/pipeline-execution.test.ts +++ b/scheduler/src/pipeline-execution.test.ts @@ -4,8 +4,8 @@ import * as AdapterClient from './clients/adapter-client' import * as StorageClient from './clients/storage-client' import * as TransformationClient from './clients/transformation-client' import * as PipelineScheduling from './pipeline-scheduling' -import PipelineConfig from './interfaces/core/pipeline-config' -import NotificationConfig from './interfaces/core/notification-config' +import PipelineConfig from './interfaces/pipeline-config' +import NotificationConfig from './interfaces/notification-config' jest.mock('./clients/adapter-client') jest.mock('./clients/storage-client') diff --git a/scheduler/src/pipeline-execution.ts b/scheduler/src/pipeline-execution.ts index 71bfdd91a..e248fbb05 100644 --- a/scheduler/src/pipeline-execution.ts +++ b/scheduler/src/pipeline-execution.ts @@ -3,7 +3,7 @@ import * as TransformationClient from './clients/transformation-client' import * as StorageClient from './clients/storage-client' import * as Scheduler from './pipeline-scheduling' -import PipelineConfig from './interfaces/core/pipeline-config' +import PipelineConfig from './interfaces/pipeline-config' import { AxiosError } from 'axios' export async function executePipeline (pipelineConfig: PipelineConfig, maxRetries = 3): Promise { diff --git a/scheduler/src/pipeline-scheduling.test.ts b/scheduler/src/pipeline-scheduling.test.ts index c0b158074..1f2cbcc15 100644 --- a/scheduler/src/pipeline-scheduling.test.ts +++ b/scheduler/src/pipeline-scheduling.test.ts @@ -5,8 +5,8 @@ import { executeAdapter } from './clients/adapter-client' import { executeTransformation } from './clients/transformation-client' import { executeStorage } from './clients/storage-client' import { getLatestEventId, getAllPipelines, getEventsAfter, getPipeline } from './clients/core-client' -import { EventType } from './interfaces/core/pipeline-event' -import PipelineConfig from './interfaces/core/pipeline-config' +import { EventType } from './interfaces/pipeline-event' +import PipelineConfig from './interfaces/pipeline-config' jest.mock('./clients/adapter-client') const mockedExecuteAdapter = executeAdapter as jest.Mock diff --git a/scheduler/src/pipeline-scheduling.ts b/scheduler/src/pipeline-scheduling.ts index 667e88821..fc0bffdc3 100644 --- a/scheduler/src/pipeline-scheduling.ts +++ b/scheduler/src/pipeline-scheduling.ts @@ -1,7 +1,7 @@ import deepEqual from 'deep-equal' -import PipelineJob from './interfaces/core/pipeline-job' -import PipelineConfig from './interfaces/core/pipeline-config' -import PipelineEvent, { EventType } from './interfaces/core/pipeline-event' +import PipelineJob from './interfaces/pipeline-job' +import PipelineConfig from './interfaces/pipeline-config' +import PipelineEvent, { EventType } from './interfaces/pipeline-event' import schedule from 'node-schedule' import * as StorageClient from './clients/storage-client' From 39657e4336a5312fe4435dbddd8a704fa13dcb96 Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Tue, 3 Dec 2019 10:09:44 +0100 Subject: [PATCH 0185/1168] Deployment: remove service from registry image names --- docker-compose.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 612713785..c1698b050 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -12,7 +12,7 @@ services: # ----------------- UI SERVICE (/ui) -------------------- ui: - image: registry.gitlab.com/profoss/open-data-service/ods-main/ui-service + image: registry.gitlab.com/profoss/open-data-service/ods-main/ui build: context: ./ui/ args: @@ -37,7 +37,7 @@ services: POSTGRES_PASSWORD: password auth: - image: registry.gitlab.com/profoss/open-data-service/ods-main/auth-service + image: registry.gitlab.com/profoss/open-data-service/ods-main/auth build: context: ./auth/ environment: @@ -56,7 +56,7 @@ services: # ----------------- ADAPTER SERVICE (/adapter) -------------------- adapter: - image: registry.gitlab.com/profoss/open-data-service/ods-main/adapter-service + image: registry.gitlab.com/profoss/open-data-service/ods-main/adapter build: context: ./adapter/ labels: @@ -68,7 +68,7 @@ services: # ----------------- SCHEDULER SERVICE (/scheduler) -------------------- scheduler: - image: registry.gitlab.com/profoss/open-data-service/ods-main/scheduler-service + image: registry.gitlab.com/profoss/open-data-service/ods-main/scheduler build: context: ./scheduler/ environment: @@ -86,7 +86,7 @@ services: # ----------------- STORAGE SERVICE (/scheduler) -------------------- storage: # Wraps postgres database with API - image: registry.gitlab.com/profoss/open-data-service/ods-main/storage-service-postgrest + image: registry.gitlab.com/profoss/open-data-service/ods-main/storage build: ./storage/postgrest/ environment: DATABASE_HOST: storage-db @@ -119,7 +119,7 @@ services: image: adminer storage-db-liquibase: # perform database migration on start up - image: registry.gitlab.com/profoss/open-data-service/ods-main/storage-service-liquibase + image: registry.gitlab.com/profoss/open-data-service/ods-main/storage-db-liquibase build: ./storage/liquibase/ # TODO: Sql Injection is currently environment: DATABASE_HOST: storage-db @@ -135,7 +135,7 @@ services: # ----------------- TRANSFORMATION SERVICE (/transformation) -------------------- transformation: - image: registry.gitlab.com/profoss/open-data-service/ods-main/transformation-service + image: registry.gitlab.com/profoss/open-data-service/ods-main/transformation build: context: ./transformation/ environment: @@ -150,7 +150,7 @@ services: # ----------------- CORE SERVICE (/core) -------------------- core: - image: registry.gitlab.com/profoss/open-data-service/ods-main/core-service + image: registry.gitlab.com/profoss/open-data-service/ods-main/core build: context: ./core/ environment: From fc05333e60879ec45cc5c6b7d0a35f9c9e962045 Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Tue, 3 Dec 2019 10:32:17 +0100 Subject: [PATCH 0186/1168] transformation: Init firebase app only once --- transformation/src/jsTransformationService.ts | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/transformation/src/jsTransformationService.ts b/transformation/src/jsTransformationService.ts index a6658c006..01f67fc03 100644 --- a/transformation/src/jsTransformationService.ts +++ b/transformation/src/jsTransformationService.ts @@ -19,6 +19,7 @@ export default class JSTransformationService implements TransformationService { constructor (executor: SandboxExecutor) { this.executor = executor + this.initNotificationSystem() } getVersion (): string { @@ -60,6 +61,17 @@ export default class JSTransformationService implements TransformationService { return jobResult } + private initNotificationSystem() { + firebase.initializeApp({ + credential: firebase.credential.cert({ + projectId: 'nebelalarm', + clientEmail: 'firebase-adminsdk-th6w9@nebelalarm.iam.gserviceaccount.com', + privateKey: '-----BEGIN PRIVATE KEY-----\nMIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCxY1BIf1aivKlb\nYx11lnEDx/AD6I/W5rf+/wtpv2OSF9U+xUYg57k7NYhfHsGj33dU+cNplZ1lsmx4\noV9eUEgbpOjfM0PRwbxfs+51bHIuewdtX8EjN7+Zh176NRVv8CwSTjxd8XYp/Mse\n5Zy1EECTHNp+rSc9QxV224TeebVD8Pm/n6EMEm9MKDsFJe5NIc4MK6t2AVL6xvww\nNTam26pE+Sfa77/2a6IkFSTu1Xr8IAqa2HZ29Ttodsf3wKbWr2drlfxHdtz2bjbB\n6FElY9jVMNqXsSF3+3zrVyQ3lmuH4Qy+bpbsSALyb2kWVK4rQoYbG+NFJcMSeiuu\nqRqnQ4mDAgMBAAECggEAGWHjoAFl7TK1F8Lj+T/F+3YwOERJKMVUzg5tR1FqjFdl\nXRkErZAFfPJuXrtblqOoQ1GF47rT4zRtDwnQSAI8Kdsms0wg8ofCo6hvK6rmimjH\nqZ/frAwTGi3jqkZ5mHiJEIl/W9XsREUhmicy4uRoyQ7Xjkl1Pu/gHLomlgsGTqqT\n1Y4HTJeMrwJUcatdXBH7vSgaK/vuVI3sqR56ytvea9oHQNPnDWoTMo+SoyBW7ccs\nOqlQyJYWJBt2FBtrQtSVqlKM2jr/94bzdUN2FAq0I8e006Rv5fwvTcU3VVHIr6M3\nFK+tKfyNLKhO5kJCgi2Tb0sMVHf7LI1SH+WaKFib0QKBgQD63MLExNRySIZpgVb6\nr1F/gw1CZ01TcPfupRmUFwDyaSBLqIAxsIpobp02If6RxgYV8pq5WhJvVvSBT2gZ\nMjdsWlnLHwHfZFJNB5TP7oEoUZDXbXYJpXjwHUsh3vDR4iR5MoslJuKsQVkZ5bo7\n8kHOdqF9XsKOpWoV14GV22LUGwKBgQC1BVX9W1Hvsf1k1DDRQONSNULKdSKILvEn\nB8A7SkBc0MK1chMIsNeucJcs8M+cj9kqhb9uyS6TxdQ45H1xN617beZgsQBDnUtz\nLATrifrvYSHt8bcD60I51ewOubD3KXTerPs50Umpicgg1stvlLc4mNOVsgBkfB5K\nIU4+y1jmuQKBgQC0v6NGC1vXDBJsqlh1PyTFbzN6iNvaJyc8t5B6dyijgMNYQAw9\nwSm4nRqBCnVVqwxve+GncxKdTlXVZdVnchsk4uSXybubrbju72t1di9xUXO/BItr\n3+IHf9PGj8+MKhiFirlfB2mDG4KLek55Ks/nZupsXn5oMR8CpcgkpXHLyQKBgQCW\nzDolFCT+u9SuYUHFn/t+6VWZmNjKf+hurjtKaQGTEGmTg9MtYzxZWfvl+TnKX972\nWHLv1HKTsbKoLlf9r/c6IoRPOkRRD0DiUeJLYSeEsPL16G2guyPxUC8U2UX9sDBm\nq82hDaMCs//es3DHpCi54j4orx86llcZRAONthJ6KQKBgQCIEXEdOryxHJc+JIy0\nQhrnm/il6z5MWNaVdRKx10xcw/GAh7OYQkJAg6LbfQo/frNGT4l4VEHG1m5utCCQ\nbCWpXNkNcQGyry55bKAh9HpZmh0yt8A/6zcJatAe+xujgW0aWU4bIEJTo/KbUNgJ\nGYwrY0yu2CP1sUxetyZ/mYVklw==\n-----END PRIVATE KEY-----\n' + }), + databaseURL: 'https://nebelalarm.firebaseio.com' + }) + } + async handleNotification (notificationRequest: NotificationRequest): Promise { console.log('NotificationRequest received: ' + JSON.stringify(notificationRequest)) const conditionHolds = this.executor.evaluate(notificationRequest.condition, notificationRequest.data) @@ -112,15 +124,6 @@ export default class JSTransformationService implements TransformationService { topic: 'test' } - firebase.initializeApp({ - credential: firebase.credential.cert({ - projectId: 'nebelalarm', - clientEmail: 'firebase-adminsdk-th6w9@nebelalarm.iam.gserviceaccount.com', - privateKey: '-----BEGIN PRIVATE KEY-----\nMIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCxY1BIf1aivKlb\nYx11lnEDx/AD6I/W5rf+/wtpv2OSF9U+xUYg57k7NYhfHsGj33dU+cNplZ1lsmx4\noV9eUEgbpOjfM0PRwbxfs+51bHIuewdtX8EjN7+Zh176NRVv8CwSTjxd8XYp/Mse\n5Zy1EECTHNp+rSc9QxV224TeebVD8Pm/n6EMEm9MKDsFJe5NIc4MK6t2AVL6xvww\nNTam26pE+Sfa77/2a6IkFSTu1Xr8IAqa2HZ29Ttodsf3wKbWr2drlfxHdtz2bjbB\n6FElY9jVMNqXsSF3+3zrVyQ3lmuH4Qy+bpbsSALyb2kWVK4rQoYbG+NFJcMSeiuu\nqRqnQ4mDAgMBAAECggEAGWHjoAFl7TK1F8Lj+T/F+3YwOERJKMVUzg5tR1FqjFdl\nXRkErZAFfPJuXrtblqOoQ1GF47rT4zRtDwnQSAI8Kdsms0wg8ofCo6hvK6rmimjH\nqZ/frAwTGi3jqkZ5mHiJEIl/W9XsREUhmicy4uRoyQ7Xjkl1Pu/gHLomlgsGTqqT\n1Y4HTJeMrwJUcatdXBH7vSgaK/vuVI3sqR56ytvea9oHQNPnDWoTMo+SoyBW7ccs\nOqlQyJYWJBt2FBtrQtSVqlKM2jr/94bzdUN2FAq0I8e006Rv5fwvTcU3VVHIr6M3\nFK+tKfyNLKhO5kJCgi2Tb0sMVHf7LI1SH+WaKFib0QKBgQD63MLExNRySIZpgVb6\nr1F/gw1CZ01TcPfupRmUFwDyaSBLqIAxsIpobp02If6RxgYV8pq5WhJvVvSBT2gZ\nMjdsWlnLHwHfZFJNB5TP7oEoUZDXbXYJpXjwHUsh3vDR4iR5MoslJuKsQVkZ5bo7\n8kHOdqF9XsKOpWoV14GV22LUGwKBgQC1BVX9W1Hvsf1k1DDRQONSNULKdSKILvEn\nB8A7SkBc0MK1chMIsNeucJcs8M+cj9kqhb9uyS6TxdQ45H1xN617beZgsQBDnUtz\nLATrifrvYSHt8bcD60I51ewOubD3KXTerPs50Umpicgg1stvlLc4mNOVsgBkfB5K\nIU4+y1jmuQKBgQC0v6NGC1vXDBJsqlh1PyTFbzN6iNvaJyc8t5B6dyijgMNYQAw9\nwSm4nRqBCnVVqwxve+GncxKdTlXVZdVnchsk4uSXybubrbju72t1di9xUXO/BItr\n3+IHf9PGj8+MKhiFirlfB2mDG4KLek55Ks/nZupsXn5oMR8CpcgkpXHLyQKBgQCW\nzDolFCT+u9SuYUHFn/t+6VWZmNjKf+hurjtKaQGTEGmTg9MtYzxZWfvl+TnKX972\nWHLv1HKTsbKoLlf9r/c6IoRPOkRRD0DiUeJLYSeEsPL16G2guyPxUC8U2UX9sDBm\nq82hDaMCs//es3DHpCi54j4orx86llcZRAONthJ6KQKBgQCIEXEdOryxHJc+JIy0\nQhrnm/il6z5MWNaVdRKx10xcw/GAh7OYQkJAg6LbfQo/frNGT4l4VEHG1m5utCCQ\nbCWpXNkNcQGyry55bKAh9HpZmh0yt8A/6zcJatAe+xujgW0aWU4bIEJTo/KbUNgJ\nGYwrY0yu2CP1sUxetyZ/mYVklw==\n-----END PRIVATE KEY-----\n' - }), - databaseURL: 'https://nebelalarm.firebaseio.com' - }) - const firebaseResponse = await firebase.messaging().send(firebaseMessage) console.log(`type of response ${typeof firebaseResponse}`) console.log(`response: ${firebaseResponse}`) From 230aefb8e08371bda6190f6b1d83c0a8876cadd2 Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Tue, 3 Dec 2019 10:37:37 +0100 Subject: [PATCH 0187/1168] transformation: Adapt firebase logging output --- transformation/src/jsTransformationService.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/transformation/src/jsTransformationService.ts b/transformation/src/jsTransformationService.ts index 01f67fc03..0d18fef67 100644 --- a/transformation/src/jsTransformationService.ts +++ b/transformation/src/jsTransformationService.ts @@ -125,7 +125,6 @@ export default class JSTransformationService implements TransformationService { } const firebaseResponse = await firebase.messaging().send(firebaseMessage) - console.log(`type of response ${typeof firebaseResponse}`) - console.log(`response: ${firebaseResponse}`) + console.log(`Firebase message sent to: ${firebaseResponse}`) } } From be58c5c6963fcd6c8f334a3b32964014ae97514f Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Tue, 3 Dec 2019 10:41:20 +0100 Subject: [PATCH 0188/1168] Fix typo in docker-compose comment --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index c1698b050..76782946e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -84,7 +84,7 @@ services: - "traefik.http.routers.to-scheduler.middlewares=scheduler-stripprefix@docker" - "traefik.http.middlewares.scheduler-stripprefix.stripprefix.prefixes=/api/scheduler" - # ----------------- STORAGE SERVICE (/scheduler) -------------------- + # ----------------- STORAGE SERVICE (/storage) -------------------- storage: # Wraps postgres database with API image: registry.gitlab.com/profoss/open-data-service/ods-main/storage build: ./storage/postgrest/ From 65d03f4e795d83accc5af4ab89e92dbdeae3f3ae Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Tue, 3 Dec 2019 10:54:58 +0100 Subject: [PATCH 0189/1168] adapter: Update readme after refactoring --- adapter/README.md | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/adapter/README.md b/adapter/README.md index a1422d7e3..8e3c3000e 100644 --- a/adapter/README.md +++ b/adapter/README.md @@ -30,16 +30,23 @@ Note that you need to delete existing docker images from your local docker daemo | *base_url*/protocols | GET | - | JsonArray of protocols available for importing and possible parameters | | *base_url*/dataImport | POST | AdapterConfig file | JSON representation of the imported data | -When nothing is changed *base_url* is `http://localhost/8080` +When started via docker-compose *base_url* is `http://localhost:9000/api/adapter` ### Adapter Config Currently the AdapterConfig is JSON File consisting of only three nodes: ``` { - "protocol": $$Data source protocol as string$$, - "format": $$Format of the data from the external source as string$$, - "location": $$URL of the data source as string$$ + "protocol": { + "type": "HTTP", + "parameters": { + "location": String + } + } + "format": { + "type": "JSON" | "XML" + "parameters": { } + } } ``` From 8af701f9cd7ae3789b76c8f91c548f1cb7a2c6bb Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Tue, 3 Dec 2019 11:10:15 +0100 Subject: [PATCH 0190/1168] transformation: Fix firebase initialization --- transformation/src/jsTransformationService.ts | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/transformation/src/jsTransformationService.ts b/transformation/src/jsTransformationService.ts index 0d18fef67..31ba279d0 100644 --- a/transformation/src/jsTransformationService.ts +++ b/transformation/src/jsTransformationService.ts @@ -19,7 +19,6 @@ export default class JSTransformationService implements TransformationService { constructor (executor: SandboxExecutor) { this.executor = executor - this.initNotificationSystem() } getVersion (): string { @@ -61,17 +60,6 @@ export default class JSTransformationService implements TransformationService { return jobResult } - private initNotificationSystem() { - firebase.initializeApp({ - credential: firebase.credential.cert({ - projectId: 'nebelalarm', - clientEmail: 'firebase-adminsdk-th6w9@nebelalarm.iam.gserviceaccount.com', - privateKey: '-----BEGIN PRIVATE KEY-----\nMIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCxY1BIf1aivKlb\nYx11lnEDx/AD6I/W5rf+/wtpv2OSF9U+xUYg57k7NYhfHsGj33dU+cNplZ1lsmx4\noV9eUEgbpOjfM0PRwbxfs+51bHIuewdtX8EjN7+Zh176NRVv8CwSTjxd8XYp/Mse\n5Zy1EECTHNp+rSc9QxV224TeebVD8Pm/n6EMEm9MKDsFJe5NIc4MK6t2AVL6xvww\nNTam26pE+Sfa77/2a6IkFSTu1Xr8IAqa2HZ29Ttodsf3wKbWr2drlfxHdtz2bjbB\n6FElY9jVMNqXsSF3+3zrVyQ3lmuH4Qy+bpbsSALyb2kWVK4rQoYbG+NFJcMSeiuu\nqRqnQ4mDAgMBAAECggEAGWHjoAFl7TK1F8Lj+T/F+3YwOERJKMVUzg5tR1FqjFdl\nXRkErZAFfPJuXrtblqOoQ1GF47rT4zRtDwnQSAI8Kdsms0wg8ofCo6hvK6rmimjH\nqZ/frAwTGi3jqkZ5mHiJEIl/W9XsREUhmicy4uRoyQ7Xjkl1Pu/gHLomlgsGTqqT\n1Y4HTJeMrwJUcatdXBH7vSgaK/vuVI3sqR56ytvea9oHQNPnDWoTMo+SoyBW7ccs\nOqlQyJYWJBt2FBtrQtSVqlKM2jr/94bzdUN2FAq0I8e006Rv5fwvTcU3VVHIr6M3\nFK+tKfyNLKhO5kJCgi2Tb0sMVHf7LI1SH+WaKFib0QKBgQD63MLExNRySIZpgVb6\nr1F/gw1CZ01TcPfupRmUFwDyaSBLqIAxsIpobp02If6RxgYV8pq5WhJvVvSBT2gZ\nMjdsWlnLHwHfZFJNB5TP7oEoUZDXbXYJpXjwHUsh3vDR4iR5MoslJuKsQVkZ5bo7\n8kHOdqF9XsKOpWoV14GV22LUGwKBgQC1BVX9W1Hvsf1k1DDRQONSNULKdSKILvEn\nB8A7SkBc0MK1chMIsNeucJcs8M+cj9kqhb9uyS6TxdQ45H1xN617beZgsQBDnUtz\nLATrifrvYSHt8bcD60I51ewOubD3KXTerPs50Umpicgg1stvlLc4mNOVsgBkfB5K\nIU4+y1jmuQKBgQC0v6NGC1vXDBJsqlh1PyTFbzN6iNvaJyc8t5B6dyijgMNYQAw9\nwSm4nRqBCnVVqwxve+GncxKdTlXVZdVnchsk4uSXybubrbju72t1di9xUXO/BItr\n3+IHf9PGj8+MKhiFirlfB2mDG4KLek55Ks/nZupsXn5oMR8CpcgkpXHLyQKBgQCW\nzDolFCT+u9SuYUHFn/t+6VWZmNjKf+hurjtKaQGTEGmTg9MtYzxZWfvl+TnKX972\nWHLv1HKTsbKoLlf9r/c6IoRPOkRRD0DiUeJLYSeEsPL16G2guyPxUC8U2UX9sDBm\nq82hDaMCs//es3DHpCi54j4orx86llcZRAONthJ6KQKBgQCIEXEdOryxHJc+JIy0\nQhrnm/il6z5MWNaVdRKx10xcw/GAh7OYQkJAg6LbfQo/frNGT4l4VEHG1m5utCCQ\nbCWpXNkNcQGyry55bKAh9HpZmh0yt8A/6zcJatAe+xujgW0aWU4bIEJTo/KbUNgJ\nGYwrY0yu2CP1sUxetyZ/mYVklw==\n-----END PRIVATE KEY-----\n' - }), - databaseURL: 'https://nebelalarm.firebaseio.com' - }) - } - async handleNotification (notificationRequest: NotificationRequest): Promise { console.log('NotificationRequest received: ' + JSON.stringify(notificationRequest)) const conditionHolds = this.executor.evaluate(notificationRequest.condition, notificationRequest.data) @@ -112,6 +100,16 @@ export default class JSTransformationService implements TransformationService { } private async handleFCM (request: NotificationRequest): Promise { + if(firebase.apps.length === 0) { + firebase.initializeApp({ + credential: firebase.credential.cert({ + projectId: 'nebelalarm', + clientEmail: 'firebase-adminsdk-th6w9@nebelalarm.iam.gserviceaccount.com', + privateKey: '-----BEGIN PRIVATE KEY-----\nMIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCxY1BIf1aivKlb\nYx11lnEDx/AD6I/W5rf+/wtpv2OSF9U+xUYg57k7NYhfHsGj33dU+cNplZ1lsmx4\noV9eUEgbpOjfM0PRwbxfs+51bHIuewdtX8EjN7+Zh176NRVv8CwSTjxd8XYp/Mse\n5Zy1EECTHNp+rSc9QxV224TeebVD8Pm/n6EMEm9MKDsFJe5NIc4MK6t2AVL6xvww\nNTam26pE+Sfa77/2a6IkFSTu1Xr8IAqa2HZ29Ttodsf3wKbWr2drlfxHdtz2bjbB\n6FElY9jVMNqXsSF3+3zrVyQ3lmuH4Qy+bpbsSALyb2kWVK4rQoYbG+NFJcMSeiuu\nqRqnQ4mDAgMBAAECggEAGWHjoAFl7TK1F8Lj+T/F+3YwOERJKMVUzg5tR1FqjFdl\nXRkErZAFfPJuXrtblqOoQ1GF47rT4zRtDwnQSAI8Kdsms0wg8ofCo6hvK6rmimjH\nqZ/frAwTGi3jqkZ5mHiJEIl/W9XsREUhmicy4uRoyQ7Xjkl1Pu/gHLomlgsGTqqT\n1Y4HTJeMrwJUcatdXBH7vSgaK/vuVI3sqR56ytvea9oHQNPnDWoTMo+SoyBW7ccs\nOqlQyJYWJBt2FBtrQtSVqlKM2jr/94bzdUN2FAq0I8e006Rv5fwvTcU3VVHIr6M3\nFK+tKfyNLKhO5kJCgi2Tb0sMVHf7LI1SH+WaKFib0QKBgQD63MLExNRySIZpgVb6\nr1F/gw1CZ01TcPfupRmUFwDyaSBLqIAxsIpobp02If6RxgYV8pq5WhJvVvSBT2gZ\nMjdsWlnLHwHfZFJNB5TP7oEoUZDXbXYJpXjwHUsh3vDR4iR5MoslJuKsQVkZ5bo7\n8kHOdqF9XsKOpWoV14GV22LUGwKBgQC1BVX9W1Hvsf1k1DDRQONSNULKdSKILvEn\nB8A7SkBc0MK1chMIsNeucJcs8M+cj9kqhb9uyS6TxdQ45H1xN617beZgsQBDnUtz\nLATrifrvYSHt8bcD60I51ewOubD3KXTerPs50Umpicgg1stvlLc4mNOVsgBkfB5K\nIU4+y1jmuQKBgQC0v6NGC1vXDBJsqlh1PyTFbzN6iNvaJyc8t5B6dyijgMNYQAw9\nwSm4nRqBCnVVqwxve+GncxKdTlXVZdVnchsk4uSXybubrbju72t1di9xUXO/BItr\n3+IHf9PGj8+MKhiFirlfB2mDG4KLek55Ks/nZupsXn5oMR8CpcgkpXHLyQKBgQCW\nzDolFCT+u9SuYUHFn/t+6VWZmNjKf+hurjtKaQGTEGmTg9MtYzxZWfvl+TnKX972\nWHLv1HKTsbKoLlf9r/c6IoRPOkRRD0DiUeJLYSeEsPL16G2guyPxUC8U2UX9sDBm\nq82hDaMCs//es3DHpCi54j4orx86llcZRAONthJ6KQKBgQCIEXEdOryxHJc+JIy0\nQhrnm/il6z5MWNaVdRKx10xcw/GAh7OYQkJAg6LbfQo/frNGT4l4VEHG1m5utCCQ\nbCWpXNkNcQGyry55bKAh9HpZmh0yt8A/6zcJatAe+xujgW0aWU4bIEJTo/KbUNgJ\nGYwrY0yu2CP1sUxetyZ/mYVklw==\n-----END PRIVATE KEY-----\n' + }), + databaseURL: 'https://nebelalarm.firebaseio.com' + }) + } const firebaseMessage: FcmCallback = { notification: { title: 'New Data Available', From 5ecb9588c8e3a67a6338007e294b7143b4b5598c Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Tue, 3 Dec 2019 11:53:40 +0100 Subject: [PATCH 0191/1168] transformation: Adapt notification request interface --- .../src/interfaces/notificationRequest.ts | 26 +++++++-- .../src/jsTransformationService.test.ts | 37 +++++++----- transformation/src/jsTransformationService.ts | 56 ++++++++++--------- transformation/src/transformationEndpoint.ts | 5 +- 4 files changed, 76 insertions(+), 48 deletions(-) diff --git a/transformation/src/interfaces/notificationRequest.ts b/transformation/src/interfaces/notificationRequest.ts index 175b76cc3..1a410808a 100644 --- a/transformation/src/interfaces/notificationRequest.ts +++ b/transformation/src/interfaces/notificationRequest.ts @@ -1,15 +1,29 @@ export interface NotificationRequest { pipelineId: number; pipelineName: string; - url: string; data: object; dataLocation: string; condition: string; - notificationType: NotificationType; + params: WebhookParams | SlackParams | FirebaseParams +} + +export interface WebhookParams { + type: 'WEBHOOK'; + url: string; } -export enum NotificationType { - WEBHOOK = 'WEBHOOK', - SLACK = 'SLACK', - FCM = 'FCM' +export interface SlackParams { + type: 'SLACK'; + workspaceId: string; + channelId: string; + secret: string; } + +export interface FirebaseParams { + type: 'FCM', + projectId: string; + clientEmail: string; + privateKey: string; + topic: string +} + diff --git a/transformation/src/jsTransformationService.test.ts b/transformation/src/jsTransformationService.test.ts index ba6ac05b4..5569f8aa9 100644 --- a/transformation/src/jsTransformationService.test.ts +++ b/transformation/src/jsTransformationService.test.ts @@ -1,7 +1,7 @@ /* eslint-env jest */ import axios from 'axios' -import { NotificationRequest, NotificationType } from './interfaces/notificationRequest' +import { NotificationRequest, WebhookParams, SlackParams } from './interfaces/notificationRequest' import TransformationService from './interfaces/transformationService' import JSTransformationService from './jsTransformationService' @@ -85,18 +85,20 @@ describe('JSTransformationService', () => { const notificationRequest: NotificationRequest = { pipelineName: 'nordstream', pipelineId: 1, - url: 'callback', dataLocation: 'data', data: data, condition: 'data.value1 > 0', - notificationType: NotificationType.WEBHOOK + params: { + type: 'WEBHOOK', + url: 'callback' + } } await transformationService.handleNotification(notificationRequest) expect(post).toHaveBeenCalledTimes(1) // check arguments for axios post - expect(post.mock.calls[0][0]).toEqual(notificationRequest.url) + expect(post.mock.calls[0][0]).toEqual((notificationRequest.params as WebhookParams).url) expect(post.mock.calls[0][1].location).toEqual(notificationRequest.dataLocation) }) @@ -104,11 +106,13 @@ describe('JSTransformationService', () => { const notificationRequest: NotificationRequest = { pipelineName: 'southstream', pipelineId: 2, - url: 'callback', dataLocation: 'data', data: data, condition: 'data.value1 < 0', - notificationType: NotificationType.WEBHOOK + params: { + type: 'WEBHOOK', + url: 'callback' + } } await transformationService.handleNotification(notificationRequest) @@ -120,11 +124,13 @@ describe('JSTransformationService', () => { const notificationRequest: NotificationRequest = { pipelineName: 'weststream', pipelineId: 3, - url: 'callback', dataLocation: 'data', data: data, condition: 'asdfa;', - notificationType: NotificationType.WEBHOOK + params: { + type: 'WEBHOOK', + url: 'callback' + } } await transformationService.handleNotification(notificationRequest) @@ -137,19 +143,24 @@ describe('JSTransformationService', () => { condition: 'data.value1 > 0', data, dataLocation: 'data', - notificationType: NotificationType.SLACK, pipelineId: 42, pipelineName: 'AnswerToEverything-Pipeline', - url: 'yo' + params: { + type: 'SLACK', + workspaceId: '012', + channelId: '123', + secret: '42' + } } await transformationService.handleNotification(request) const expectedObject: SlackCallback = { - text: `New data available for pipeline ${request.pipelineName}(${request.pipelineId}). ` + - `Fetch at ${request.dataLocation}.` + text: `Pipeline ${request.pipelineName}(${request.pipelineId}) has new data available.Fetch at ${request.dataLocation}.` } expect(post).toHaveBeenCalledTimes(1) - expect(post.mock.calls[0][0]).toEqual(request.url) + const slackParams = request.params as SlackParams + const expectedUrl = `https://hooks.slack.com/services/${slackParams.workspaceId}/${slackParams.channelId}/${slackParams.secret}` + expect(post.mock.calls[0][0]).toEqual(expectedUrl) expect(post.mock.calls[0][1]).toEqual(expectedObject) }) }) diff --git a/transformation/src/jsTransformationService.ts b/transformation/src/jsTransformationService.ts index 31ba279d0..001cb1cc0 100644 --- a/transformation/src/jsTransformationService.ts +++ b/transformation/src/jsTransformationService.ts @@ -4,7 +4,7 @@ import * as firebase from 'firebase-admin' import ExecutionResult from './interfaces/executionResult' import JobResult from './interfaces/jobResult' import Stats from './interfaces/stats' -import { NotificationRequest, NotificationType } from './interfaces/notificationRequest' +import { NotificationRequest, FirebaseParams, SlackParams, WebhookParams } from './interfaces/notificationRequest' import TransformationService from './interfaces/transformationService' import SandboxExecutor from './interfaces/sandboxExecutor' @@ -68,60 +68,62 @@ export default class JSTransformationService implements TransformationService { return Promise.resolve() } - switch (notificationRequest.notificationType) { - case NotificationType.WEBHOOK: - await this.handleWebhook(notificationRequest) + const message = `Pipeline ${notificationRequest.pipelineName}(${notificationRequest.pipelineId}) has new data available.` + + `Fetch at ${notificationRequest.dataLocation}.` + + switch (notificationRequest.params.type) { + case 'WEBHOOK': + await this.handleWebhook(notificationRequest.params, notificationRequest.dataLocation) break - case NotificationType.FCM: - await this.handleFCM(notificationRequest) + case 'FCM': + await this.handleFCM(notificationRequest.params, message) break - case NotificationType.SLACK: - await this.handleSlack(notificationRequest) + case 'SLACK': + await this.handleSlack(notificationRequest.params, message) break default: - throw new Error(`Notification type ${notificationRequest.notificationType} not implemented.`) + throw new Error(`Notification type not implemented.`) } } - private async handleWebhook (request: NotificationRequest): Promise { + private async handleWebhook (params: WebhookParams, location: string): Promise { const callbackObject: WebhookCallback = { - location: request.dataLocation, + location, timestamp: new Date(Date.now()) } - await axios.post(request.url, callbackObject) + await axios.post(params.url, callbackObject) } - private async handleSlack (request: NotificationRequest): Promise { + private async handleSlack (params: SlackParams, message: string): Promise { const callbackObject: SlackCallback = { - text: `New data available for pipeline ${request.pipelineName}(${request.pipelineId}). ` + - `Fetch at ${request.dataLocation}.` + text: message } - await axios.post(request.url, callbackObject) + const url = `https://hooks.slack.com/services/${params.workspaceId}/${params.channelId}/${params.secret}` + await axios.post(url, callbackObject) } - private async handleFCM (request: NotificationRequest): Promise { - if(firebase.apps.length === 0) { + private async handleFCM (params: FirebaseParams, message: string): Promise { + if(!firebase.app(params.clientEmail)) { firebase.initializeApp({ credential: firebase.credential.cert({ - projectId: 'nebelalarm', - clientEmail: 'firebase-adminsdk-th6w9@nebelalarm.iam.gserviceaccount.com', - privateKey: '-----BEGIN PRIVATE KEY-----\nMIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCxY1BIf1aivKlb\nYx11lnEDx/AD6I/W5rf+/wtpv2OSF9U+xUYg57k7NYhfHsGj33dU+cNplZ1lsmx4\noV9eUEgbpOjfM0PRwbxfs+51bHIuewdtX8EjN7+Zh176NRVv8CwSTjxd8XYp/Mse\n5Zy1EECTHNp+rSc9QxV224TeebVD8Pm/n6EMEm9MKDsFJe5NIc4MK6t2AVL6xvww\nNTam26pE+Sfa77/2a6IkFSTu1Xr8IAqa2HZ29Ttodsf3wKbWr2drlfxHdtz2bjbB\n6FElY9jVMNqXsSF3+3zrVyQ3lmuH4Qy+bpbsSALyb2kWVK4rQoYbG+NFJcMSeiuu\nqRqnQ4mDAgMBAAECggEAGWHjoAFl7TK1F8Lj+T/F+3YwOERJKMVUzg5tR1FqjFdl\nXRkErZAFfPJuXrtblqOoQ1GF47rT4zRtDwnQSAI8Kdsms0wg8ofCo6hvK6rmimjH\nqZ/frAwTGi3jqkZ5mHiJEIl/W9XsREUhmicy4uRoyQ7Xjkl1Pu/gHLomlgsGTqqT\n1Y4HTJeMrwJUcatdXBH7vSgaK/vuVI3sqR56ytvea9oHQNPnDWoTMo+SoyBW7ccs\nOqlQyJYWJBt2FBtrQtSVqlKM2jr/94bzdUN2FAq0I8e006Rv5fwvTcU3VVHIr6M3\nFK+tKfyNLKhO5kJCgi2Tb0sMVHf7LI1SH+WaKFib0QKBgQD63MLExNRySIZpgVb6\nr1F/gw1CZ01TcPfupRmUFwDyaSBLqIAxsIpobp02If6RxgYV8pq5WhJvVvSBT2gZ\nMjdsWlnLHwHfZFJNB5TP7oEoUZDXbXYJpXjwHUsh3vDR4iR5MoslJuKsQVkZ5bo7\n8kHOdqF9XsKOpWoV14GV22LUGwKBgQC1BVX9W1Hvsf1k1DDRQONSNULKdSKILvEn\nB8A7SkBc0MK1chMIsNeucJcs8M+cj9kqhb9uyS6TxdQ45H1xN617beZgsQBDnUtz\nLATrifrvYSHt8bcD60I51ewOubD3KXTerPs50Umpicgg1stvlLc4mNOVsgBkfB5K\nIU4+y1jmuQKBgQC0v6NGC1vXDBJsqlh1PyTFbzN6iNvaJyc8t5B6dyijgMNYQAw9\nwSm4nRqBCnVVqwxve+GncxKdTlXVZdVnchsk4uSXybubrbju72t1di9xUXO/BItr\n3+IHf9PGj8+MKhiFirlfB2mDG4KLek55Ks/nZupsXn5oMR8CpcgkpXHLyQKBgQCW\nzDolFCT+u9SuYUHFn/t+6VWZmNjKf+hurjtKaQGTEGmTg9MtYzxZWfvl+TnKX972\nWHLv1HKTsbKoLlf9r/c6IoRPOkRRD0DiUeJLYSeEsPL16G2guyPxUC8U2UX9sDBm\nq82hDaMCs//es3DHpCi54j4orx86llcZRAONthJ6KQKBgQCIEXEdOryxHJc+JIy0\nQhrnm/il6z5MWNaVdRKx10xcw/GAh7OYQkJAg6LbfQo/frNGT4l4VEHG1m5utCCQ\nbCWpXNkNcQGyry55bKAh9HpZmh0yt8A/6zcJatAe+xujgW0aWU4bIEJTo/KbUNgJ\nGYwrY0yu2CP1sUxetyZ/mYVklw==\n-----END PRIVATE KEY-----\n' + projectId: params.projectId, + clientEmail: params.clientEmail, + privateKey: params.privateKey }), - databaseURL: 'https://nebelalarm.firebaseio.com' - }) + databaseURL: `https://${params.projectId}.firebaseio.com` + }, + params.clientEmail) } const firebaseMessage: FcmCallback = { notification: { title: 'New Data Available', - body: `Pipeline ${request.pipelineName}(${request.pipelineId}) has new data available.` + - `Fetch at ${request.dataLocation}.` + body: message }, data: { textfield: 'textvalue' }, - topic: 'test' + topic: params.topic } - const firebaseResponse = await firebase.messaging().send(firebaseMessage) console.log(`Firebase message sent to: ${firebaseResponse}`) } diff --git a/transformation/src/transformationEndpoint.ts b/transformation/src/transformationEndpoint.ts index 455dbfe36..a67260b80 100644 --- a/transformation/src/transformationEndpoint.ts +++ b/transformation/src/transformationEndpoint.ts @@ -5,9 +5,10 @@ import cors from 'cors' import Keycloak from 'keycloak-connect' import TransformationService from './interfaces/transformationService' import TransformationRequest from './interfaces/transformationRequest' -import { NotificationRequest, NotificationType } from './interfaces/notificationRequest' +import { NotificationRequest } from './interfaces/notificationRequest' import { Server } from 'http' import JobResult from './interfaces/jobResult' +import { objectTypeSpreadProperty } from '@babel/types' export class TransformationEndpoint { port: number @@ -104,6 +105,6 @@ export class TransformationEndpoint { private isValidNotificationRequest(obj: any): obj is NotificationRequest { return typeof obj.data !== 'undefined' && typeof obj.condition === 'string' && - Object.values(NotificationType).includes(obj.notificationType) + typeof obj.params.type === 'string' } } From 3aaf43960ae3c03a44d1858d354540a9a63f7ffc Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Tue, 3 Dec 2019 12:07:18 +0100 Subject: [PATCH 0192/1168] transformation: Use different slack base url for integration test --- docker-compose.ci.yml | 2 ++ transformation/src/jsTransformationService.ts | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/docker-compose.ci.yml b/docker-compose.ci.yml index 0fdae575e..1d939226d 100644 --- a/docker-compose.ci.yml +++ b/docker-compose.ci.yml @@ -54,6 +54,8 @@ services: transformation: environment: AUTH_ENABLED: 'false' + MOCK_RECEIVER_HOST: transformation-it + MOCK_RECEIVER_PORT: 8081 transformation-it: image: open-data-service/ods-main/transformation-it diff --git a/transformation/src/jsTransformationService.ts b/transformation/src/jsTransformationService.ts index 001cb1cc0..56b5e5ad8 100644 --- a/transformation/src/jsTransformationService.ts +++ b/transformation/src/jsTransformationService.ts @@ -95,10 +95,14 @@ export default class JSTransformationService implements TransformationService { } private async handleSlack (params: SlackParams, message: string): Promise { + let slackBaseUri = 'https://hooks.slack.com/services' + if(process.env.MOCK_RECEIVER_HOST && process.env.MOCK_RECEIVER_PORT) { + slackBaseUri = `http://${process.env.MOCK_RECEIVER_HOST}:${process.env.MOCK_RECEIVER_PORT}` + } const callbackObject: SlackCallback = { text: message } - const url = `https://hooks.slack.com/services/${params.workspaceId}/${params.channelId}/${params.secret}` + const url = `${slackBaseUri}/${params.workspaceId}/${params.channelId}/${params.secret}` await axios.post(url, callbackObject) } From 116bd896d68ba1e0a440095afb1e4036831849ef Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Tue, 3 Dec 2019 12:08:09 +0100 Subject: [PATCH 0193/1168] transformation: Use different slack url for integration test --- transformation/src/jsTransformationService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/transformation/src/jsTransformationService.ts b/transformation/src/jsTransformationService.ts index 56b5e5ad8..ba17744d8 100644 --- a/transformation/src/jsTransformationService.ts +++ b/transformation/src/jsTransformationService.ts @@ -97,7 +97,7 @@ export default class JSTransformationService implements TransformationService { private async handleSlack (params: SlackParams, message: string): Promise { let slackBaseUri = 'https://hooks.slack.com/services' if(process.env.MOCK_RECEIVER_HOST && process.env.MOCK_RECEIVER_PORT) { - slackBaseUri = `http://${process.env.MOCK_RECEIVER_HOST}:${process.env.MOCK_RECEIVER_PORT}` + slackBaseUri = `http://${process.env.MOCK_RECEIVER_HOST}:${process.env.MOCK_RECEIVER_PORT}/slack` } const callbackObject: SlackCallback = { text: message From e7ed438a335feb59f237c0402636c7ff01dd5b97 Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Tue, 3 Dec 2019 12:10:22 +0100 Subject: [PATCH 0194/1168] transformation: Adapt integration test to new notification request model --- .../src/transformation.test.js | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/transformation/integration-test/src/transformation.test.js b/transformation/integration-test/src/transformation.test.js index 33bfa46b5..6366c1b9e 100644 --- a/transformation/integration-test/src/transformation.test.js +++ b/transformation/integration-test/src/transformation.test.js @@ -146,13 +146,15 @@ describe('Scheduler', () => { test('POST /notification triggers webhook', async () => { const dataLocation = 'storage/1234' const notificationJob = { - url: MOCK_RECEIVER_URL + '/webhook1', dataLocation: dataLocation, data: { value1: 1 }, condition: 'data.value1 > 0', - notificationType: 'WEBHOOK' + params: { + type: 'WEBHOOK', + url: MOCK_RECEIVER_URL + '/webhook1' + } } const transformationResponse = await request(URL) @@ -171,13 +173,15 @@ describe('Scheduler', () => { test('POST /notification does not trigger webhook when condition is false', async () => { const notificationJob = { - url: MOCK_RECEIVER_URL + '/webhook2', dataLocation: 'storage/1234', data: { value1: 1 }, condition: 'data.value1 < 0', - notificationType: 'WEBHOOK' + params: { + url: MOCK_RECEIVER_URL + '/webhook2', + type: 'WEBHOOK' + } } const transformationResponse = await request(URL) @@ -198,13 +202,17 @@ describe('Scheduler', () => { const slackJob = { pipelineName: "peterchens pipeline", pipelineId: 666, - url: MOCK_RECEIVER_URL + '/slack', dataLocation, data: { niceString: "nice" }, condition: "typeof data.niceString === \"string\"", - notificationType: 'SLACK' + params: { + type: 'SLACK', + projectId: '12', + workspaceId: '34', + secret: '56' + } } const transformationResponse = await request(URL) @@ -215,7 +223,7 @@ describe('Scheduler', () => { await sleep(3000) const receiverResponse = await request(MOCK_RECEIVER_URL) - .get('/slack') + .get('/slack/12/34/56') expect(receiverResponse.status).toEqual(200) expect(receiverResponse.body.text) From dcf7084b9d5b8fb8826ea74bbed26a8253a6eb5c Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Tue, 3 Dec 2019 12:18:05 +0100 Subject: [PATCH 0195/1168] transformation: Handle slack notifications in mock receiver --- .../integration-test/src/mock.receiver.js | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/transformation/integration-test/src/mock.receiver.js b/transformation/integration-test/src/mock.receiver.js index c5a727312..9acafef90 100644 --- a/transformation/integration-test/src/mock.receiver.js +++ b/transformation/integration-test/src/mock.receiver.js @@ -33,6 +33,24 @@ router.post('/:path', async ctx => { notifications.set(path, ctx.request.body) ctx.status = 201 }) + +router.get('/slack/*', async ctx => { + const notification = notifications.get('slack') + if(!notification) { + ctx.throw(404) + } else { + ctx.body = notification + ctx.type = 'application/json' + ctx.status = 200 + } +}) + +router.post('/slack/*', async ctx => { + console.log(`Slack notification triggered.`) + notifications.set('slack', ctx.request.body) + ctx.status = 201 +}) + app.use(router.routes()) const server = app.listen(PORT, () => console.log(`Starting mock notification receiver on port ${PORT}`)) @@ -42,4 +60,6 @@ process.on('SIGTERM', async () => { await server.close() }) + + module.exports = server From 866cc67ee851f19d889b529bc02e2c878a6936b0 Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Tue, 3 Dec 2019 12:44:36 +0100 Subject: [PATCH 0196/1168] transformation: Fix integration test --- transformation/integration-test/src/transformation.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/transformation/integration-test/src/transformation.test.js b/transformation/integration-test/src/transformation.test.js index 6366c1b9e..6b23348f5 100644 --- a/transformation/integration-test/src/transformation.test.js +++ b/transformation/integration-test/src/transformation.test.js @@ -227,7 +227,7 @@ describe('Scheduler', () => { expect(receiverResponse.status).toEqual(200) expect(receiverResponse.body.text) - .toEqual(`New data available for pipeline ${slackJob.pipelineName}(${slackJob.pipelineId}). Fetch at ${dataLocation}.`) + .toEqual(`Pipeline ${slackJob.pipelineName}(${slackJob.pipelineId}) has new data available.Fetch at ${dataLocation}.`) }) function sleep (ms) { From afca59d726985df23de2c8a71f8d596818f487ee Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Wed, 4 Dec 2019 10:48:09 +0100 Subject: [PATCH 0197/1168] core: Add test cases for notificationConfig model --- .../model/NotificationConfigTest.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 core/src/test/java/org/jvalue/ods/coreservice/model/NotificationConfigTest.java diff --git a/core/src/test/java/org/jvalue/ods/coreservice/model/NotificationConfigTest.java b/core/src/test/java/org/jvalue/ods/coreservice/model/NotificationConfigTest.java new file mode 100644 index 000000000..051de91b0 --- /dev/null +++ b/core/src/test/java/org/jvalue/ods/coreservice/model/NotificationConfigTest.java @@ -0,0 +1,44 @@ +package org.jvalue.ods.coreservice.model; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.Test; + +import java.io.IOException; + +import static junit.framework.TestCase.assertTrue; +import static org.junit.Assert.assertEquals; + +public class NotificationConfigTest { + private final ObjectMapper mapper = new ObjectMapper(); + + @Test + public void testDeserialization() throws IOException { + final String configString = "{ " + + "\"notificationType\":\"WEBHOOK\"," + + "\"condition\":\"ifthisthenthat\"," + + "\"url\":\"URRRRRL\"" + + "}"; + + NotificationConfig result = mapper.readValue(configString, NotificationConfig.class); + + System.out.println(result); + assertEquals("WEBHOOK", result.getNotificationType().toString()); + assertEquals("ifthisthenthat", result.getCondition()); + assertEquals("URRRRRL", result.getUrl()); + } + + @Test + public void testSerialization() throws IOException { + NotificationConfig notification = new NotificationConfig(NotificationType.WEBHOOK, "1>2", "URRL"); + + JsonNode result = mapper.valueToTree(notification); + + System.out.println(result); + assertEquals(4, result.size()); + assertEquals("WEBHOOK", result.get("notificationType").asText()); + assertEquals("1>2", result.get("condition").asText()); + assertEquals("URRL", result.get("url").asText()); + assertTrue(result.has("notificationId")); // is always in testing because it is set by the JPA + } +} From 8e44e2406e5d97061137769f3b4b12a08e5dd633 Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Wed, 4 Dec 2019 11:15:20 +0100 Subject: [PATCH 0198/1168] core: Refactor notification config model --- .../coreservice/model/NotificationConfig.java | 83 +++++++++++++------ .../model/NotificationConfigTest.java | 22 ++--- .../ods/coreservice/model/PipelineConfig.json | 6 +- .../coreservice/model/PipelineConfigTest.java | 14 ++-- .../pipeline/PipelineManagerTest.java | 4 +- 5 files changed, 83 insertions(+), 46 deletions(-) diff --git a/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java b/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java index 40ce9a5f4..77920a69a 100644 --- a/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java +++ b/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java @@ -1,6 +1,8 @@ package org.jvalue.ods.coreservice.model; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; import javax.persistence.Entity; import javax.persistence.GeneratedValue; @@ -15,27 +17,37 @@ public class NotificationConfig { @GeneratedValue private Long notificationId; - @NotNull - private NotificationType notificationType; - @NotNull private String condition; @NotNull - private String url; - + private NotificationParams params; + + @JsonTypeInfo( + use = JsonTypeInfo.Id.NAME, + property = "type") + @JsonSubTypes({ + @JsonSubTypes.Type(value = WebhookParams.class, name = "WEBHOOK") + }) + public static class NotificationParams { + public WebhookParams asWebhook() { + if(this instanceof WebhookParams) { + return (WebhookParams) this; + } else { + throw new IllegalArgumentException("Wrong runtime class for NotificationParams, was " + this.getClass().getCanonicalName()); + } + } + } //Constructor for JPA public NotificationConfig() { } public NotificationConfig( - @JsonProperty("notificationType") NotificationType notificationType, @JsonProperty("condition") String condition, - @JsonProperty("url") String url) { - this.notificationType = notificationType; + @JsonProperty("params") NotificationParams params) { this.condition = condition; - this.url = url; + this.params = params; } public Long getNotificationId() { @@ -46,30 +58,51 @@ public void setNotificationId(Long notificationId) { this.notificationId = notificationId; } - public NotificationType getNotificationType() { - return notificationType; - } - public String getCondition() { return condition; } - public String getUrl() { - return url; + public NotificationParams getParams() { + return params; } - @Override - public boolean equals(Object o) { + public static class WebhookParams extends NotificationParams { + private final String url; + + public WebhookParams(@JsonProperty("url") String url) { + this.url = url; + } + + public String getUrl() { + return url; + } + + @Override + public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - NotificationConfig that = (NotificationConfig) o; - return Objects.equals(notificationType, that.notificationType) && - Objects.equals(condition, that.condition) && - Objects.equals(url, that.url); + WebhookParams that = (WebhookParams) o; + return Objects.equals(url, that.url); + } + + @Override + public int hashCode() { + return Objects.hash(url); + } } - @Override - public int hashCode() { - return Objects.hash(notificationType, condition, url); - } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + NotificationConfig that = (NotificationConfig) o; + return Objects.equals(notificationId, that.notificationId) && + Objects.equals(condition, that.condition) && + Objects.equals(params, that.params); + } + + @Override + public int hashCode() { + return Objects.hash(notificationId, condition, params); + } } diff --git a/core/src/test/java/org/jvalue/ods/coreservice/model/NotificationConfigTest.java b/core/src/test/java/org/jvalue/ods/coreservice/model/NotificationConfigTest.java index 051de91b0..2184a6a9d 100644 --- a/core/src/test/java/org/jvalue/ods/coreservice/model/NotificationConfigTest.java +++ b/core/src/test/java/org/jvalue/ods/coreservice/model/NotificationConfigTest.java @@ -15,30 +15,32 @@ public class NotificationConfigTest { @Test public void testDeserialization() throws IOException { final String configString = "{ " + - "\"notificationType\":\"WEBHOOK\"," + "\"condition\":\"ifthisthenthat\"," + - "\"url\":\"URRRRRL\"" + - "}"; + "\"params\":{" + + "\"type\":\"WEBHOOK\"," + + "\"url\":\"URRRRRL\"" + + "}}"; NotificationConfig result = mapper.readValue(configString, NotificationConfig.class); System.out.println(result); - assertEquals("WEBHOOK", result.getNotificationType().toString()); assertEquals("ifthisthenthat", result.getCondition()); - assertEquals("URRRRRL", result.getUrl()); + assertTrue(result.getParams() instanceof NotificationConfig.WebhookParams); + assertEquals("URRRRRL", result.getParams().asWebhook().getUrl()); } @Test - public void testSerialization() throws IOException { - NotificationConfig notification = new NotificationConfig(NotificationType.WEBHOOK, "1>2", "URRL"); + public void testSerialization() { + NotificationConfig notification = new NotificationConfig("1>2", new NotificationConfig.WebhookParams("URRL")); JsonNode result = mapper.valueToTree(notification); System.out.println(result); - assertEquals(4, result.size()); - assertEquals("WEBHOOK", result.get("notificationType").asText()); + assertEquals(3, result.size()); assertEquals("1>2", result.get("condition").asText()); - assertEquals("URRL", result.get("url").asText()); assertTrue(result.has("notificationId")); // is always in testing because it is set by the JPA + assertEquals(2, result.get("params").size()); + assertEquals("URRL", result.get("params").get("url").asText()); + assertEquals("WEBHOOK", result.get("params").get("type").asText()); } } diff --git a/core/src/test/java/org/jvalue/ods/coreservice/model/PipelineConfig.json b/core/src/test/java/org/jvalue/ods/coreservice/model/PipelineConfig.json index 8a6bb4be7..cacefcd1a 100644 --- a/core/src/test/java/org/jvalue/ods/coreservice/model/PipelineConfig.json +++ b/core/src/test/java/org/jvalue/ods/coreservice/model/PipelineConfig.json @@ -35,9 +35,11 @@ }, "notifications": [ { - "notificationType": "WEBHOOK", "condition": "data.value1 > 10", - "url": "http://www.webhookland.com" + "params": { + "type": "WEBHOOK", + "url": "http://www.webhookland.com" + } } ] } diff --git a/core/src/test/java/org/jvalue/ods/coreservice/model/PipelineConfigTest.java b/core/src/test/java/org/jvalue/ods/coreservice/model/PipelineConfigTest.java index 75bd2ecb3..7e65df94e 100644 --- a/core/src/test/java/org/jvalue/ods/coreservice/model/PipelineConfigTest.java +++ b/core/src/test/java/org/jvalue/ods/coreservice/model/PipelineConfigTest.java @@ -41,9 +41,9 @@ public void testDeserialization() throws IOException { cal.setTime(result.getMetadata().getCreationTimestamp()); assertEquals(LocalDateTime.now().getDayOfYear(), cal.get(Calendar.DAY_OF_YEAR)); assertEquals(1, result.getNotifications().size()); - assertEquals(NotificationType.WEBHOOK, result.getNotifications().get(0).getNotificationType()); + assertNotNull(result.getNotifications().get(0).getParams().asWebhook()); assertEquals("data.value1 > 10", result.getNotifications().get(0).getCondition()); - assertEquals("http://www.webhookland.com", result.getNotifications().get(0).getUrl()); + assertEquals("http://www.webhookland.com", result.getNotifications().get(0).getParams().asWebhook().getUrl()); } @Test @@ -54,8 +54,8 @@ public void testSerialization() { PipelineTriggerConfig trigger = new PipelineTriggerConfig(false, new Date(), 10L); PipelineMetadata metadata = new PipelineMetadata("icke", "none", "Display", "description"); List notifications = List.of( - new NotificationConfig(NotificationType.WEBHOOK, "data.value1 > 10", "http://www.webhookland.com/1"), - new NotificationConfig(NotificationType.WEBHOOK, "data.value1 < 0", "http://www.webhookland.com/2")); + new NotificationConfig("data.value1 > 10", new NotificationConfig.WebhookParams("http://www.webhookland.com/1")), + new NotificationConfig("data.value1 < 0", new NotificationConfig.WebhookParams("http://www.webhookland.com/2"))); PipelineConfig config = new PipelineConfig(adapter, transformations, trigger, metadata, notifications); JsonNode result = mapper.valueToTree(config); @@ -70,10 +70,10 @@ public void testSerialization() { assertEquals("return 1+1", result.get("transformations").get(0).get("func").textValue()); assertEquals("[2]", result.get("transformations").get(1).get("data").textValue()); assertEquals(2, result.get("notifications").size()); - assertEquals(4, result.get("notifications").get(0).size()); - assertEquals("WEBHOOK", result.get("notifications").get(0).get("notificationType").textValue()); + assertEquals(3, result.get("notifications").get(0).size()); assertEquals("data.value1 > 10", result.get("notifications").get(0).get("condition").textValue()); - assertEquals("http://www.webhookland.com/2", result.get("notifications").get(1).get("url").textValue()); + assertEquals("WEBHOOK", result.get("notifications").get(0).get("params").get("type").textValue()); + assertEquals("http://www.webhookland.com/2", result.get("notifications").get(1).get("params").get("url").textValue()); } private AdapterConfig generateAdapterConfig(String protocol, String format, String location) { diff --git a/core/src/test/java/org/jvalue/ods/coreservice/pipeline/PipelineManagerTest.java b/core/src/test/java/org/jvalue/ods/coreservice/pipeline/PipelineManagerTest.java index 6337331e8..e4e656ac1 100644 --- a/core/src/test/java/org/jvalue/ods/coreservice/pipeline/PipelineManagerTest.java +++ b/core/src/test/java/org/jvalue/ods/coreservice/pipeline/PipelineManagerTest.java @@ -133,7 +133,7 @@ public void testAddNotification() throws IOException { when(pipelineRepository.findById(21L)).thenReturn(Optional.of(pipelineConfig)); - NotificationConfig notificationConfig = new NotificationConfig(NotificationType.WEBHOOK, "data.value2 === 1", "http://www.hook.org"); + NotificationConfig notificationConfig = new NotificationConfig("data.value2 === 1", new NotificationConfig.WebhookParams("http://www.hook.org")); when(pipelineRepository.save(pipelineConfig)).thenReturn(pipelineConfig); @@ -143,7 +143,7 @@ public void testAddNotification() throws IOException { assertEquals(2, result.getNotifications().size()); assertEquals("data.value2 === 1", result.getNotifications().get(1).getCondition()); - assertEquals("http://www.hook.org", result.getNotifications().get(1).getUrl()); + assertEquals("http://www.hook.org", result.getNotifications().get(1).getParams().asWebhook().getUrl()); verify(eventRepository).save(argThat(event -> event.getEventType().equals("PIPELINE_UPDATE"))); } From 9b810a8589d2d8ce03819c514610a3135a25fa1f Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Wed, 4 Dec 2019 11:26:13 +0100 Subject: [PATCH 0199/1168] core: Add tests for jackson model validation --- .../coreservice/model/NotificationConfig.java | 8 +-- .../model/NotificationConfigTest.java | 54 +++++++++++++++++++ 2 files changed, 58 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java b/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java index 77920a69a..223cc05df 100644 --- a/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java +++ b/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java @@ -44,8 +44,8 @@ public NotificationConfig() { } public NotificationConfig( - @JsonProperty("condition") String condition, - @JsonProperty("params") NotificationParams params) { + @JsonProperty(value = "condition", required = true) String condition, + @JsonProperty(value = "params", required = true) NotificationParams params) { this.condition = condition; this.params = params; } @@ -67,9 +67,9 @@ public NotificationParams getParams() { } public static class WebhookParams extends NotificationParams { - private final String url; + @NotNull private final String url; - public WebhookParams(@JsonProperty("url") String url) { + public WebhookParams(@JsonProperty(value = "url", required = true) String url) { this.url = url; } diff --git a/core/src/test/java/org/jvalue/ods/coreservice/model/NotificationConfigTest.java b/core/src/test/java/org/jvalue/ods/coreservice/model/NotificationConfigTest.java index 2184a6a9d..8c516cbe8 100644 --- a/core/src/test/java/org/jvalue/ods/coreservice/model/NotificationConfigTest.java +++ b/core/src/test/java/org/jvalue/ods/coreservice/model/NotificationConfigTest.java @@ -1,7 +1,10 @@ package org.jvalue.ods.coreservice.model; +import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.exc.InvalidTypeIdException; +import com.fasterxml.jackson.databind.exc.MismatchedInputException; import org.junit.Test; import java.io.IOException; @@ -29,6 +32,57 @@ public void testDeserialization() throws IOException { assertEquals("URRRRRL", result.getParams().asWebhook().getUrl()); } + @Test(expected = InvalidTypeIdException.class) + public void testDeserializationOfInvalidType() throws IOException { + final String configString = "{ " + + "\"condition\":\"ifthisthenthat\"," + + "\"params\":{" + + "\"type\":\"lol\"," + + "\"url\":\"URRRRRL\"" + + "}}"; + + NotificationConfig result = mapper.readValue(configString, NotificationConfig.class); + + System.out.println(result); + assertEquals("ifthisthenthat", result.getCondition()); + assertTrue(result.getParams() instanceof NotificationConfig.WebhookParams); + assertEquals("URRRRRL", result.getParams().asWebhook().getUrl()); + } + + @Test(expected = JsonMappingException.class) + public void testDeserializationOfInvalidParams() throws IOException { + final String configString = "{ " + + "\"condition\":\"ifthisthenthat\"," + + "\"params\":{" + + "\"type\":\"WEBHOOK\"," + + "\"url\":\"URRRRRL\"" + + "\"extra\":\"bonus\"" + + "}}"; + + NotificationConfig result = mapper.readValue(configString, NotificationConfig.class); + + System.out.println(result); + assertEquals("ifthisthenthat", result.getCondition()); + assertTrue(result.getParams() instanceof NotificationConfig.WebhookParams); + assertEquals("URRRRRL", result.getParams().asWebhook().getUrl()); + } + + @Test(expected = MismatchedInputException.class) + public void testDeserializationMissingParams() throws IOException { + final String configString = "{ " + + "\"condition\":\"ifthisthenthat\"," + + "\"params\":{" + + "\"type\":\"WEBHOOK\"" + + "}}"; + + NotificationConfig result = mapper.readValue(configString, NotificationConfig.class); + + System.out.println(result); + assertEquals("ifthisthenthat", result.getCondition()); + assertTrue(result.getParams() instanceof NotificationConfig.WebhookParams); + assertEquals("URRRRRL", result.getParams().asWebhook().getUrl()); + } + @Test public void testSerialization() { NotificationConfig notification = new NotificationConfig("1>2", new NotificationConfig.WebhookParams("URRL")); From ec6c4184ff57232e11c30970d5e4f34ff6ab1830 Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Wed, 4 Dec 2019 11:50:41 +0100 Subject: [PATCH 0200/1168] core: Add firebase and slack notification config models --- .../coreservice/model/NotificationConfig.java | 113 +++++++++++++++++- .../model/NotificationConfigTest.java | 76 ++++++++---- 2 files changed, 165 insertions(+), 24 deletions(-) diff --git a/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java b/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java index 223cc05df..32c38775a 100644 --- a/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java +++ b/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java @@ -27,7 +27,9 @@ public class NotificationConfig { use = JsonTypeInfo.Id.NAME, property = "type") @JsonSubTypes({ - @JsonSubTypes.Type(value = WebhookParams.class, name = "WEBHOOK") + @JsonSubTypes.Type(value = WebhookParams.class, name = "WEBHOOK"), + @JsonSubTypes.Type(value = SlackParams.class, name = "SLACK"), + @JsonSubTypes.Type(value = FirebaseParams.class, name = "FCM") }) public static class NotificationParams { public WebhookParams asWebhook() { @@ -37,6 +39,20 @@ public WebhookParams asWebhook() { throw new IllegalArgumentException("Wrong runtime class for NotificationParams, was " + this.getClass().getCanonicalName()); } } + public SlackParams asSlack() { + if(this instanceof SlackParams) { + return (SlackParams) this; + } else { + throw new IllegalArgumentException("Wrong runtime class for NotificationParams, was " + this.getClass().getCanonicalName()); + } + } + public FirebaseParams asFirebase() { + if(this instanceof FirebaseParams) { + return (FirebaseParams) this; + } else { + throw new IllegalArgumentException("Wrong runtime class for NotificationParams, was " + this.getClass().getCanonicalName()); + } + } } //Constructor for JPA @@ -67,7 +83,7 @@ public NotificationParams getParams() { } public static class WebhookParams extends NotificationParams { - @NotNull private final String url; + private final String url; public WebhookParams(@JsonProperty(value = "url", required = true) String url) { this.url = url; @@ -91,6 +107,99 @@ public int hashCode() { } } + public static class SlackParams extends NotificationParams { + @NotNull private final String workspaceId; + @NotNull private final String channelId; + @NotNull private final String secret; + + public SlackParams( + @JsonProperty(value = "workspaceId", required = true) String workspaceId, + @JsonProperty(value = "channelId", required = true) String channelId, + @JsonProperty(value = "secret", required = true) String secret) { + this.workspaceId = workspaceId; + this.channelId = channelId; + this.secret = secret; + } + + public String getWorkspaceId() { + return workspaceId; + } + + public String getChannelId() { + return channelId; + } + + public String getSecret() { + return secret; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + SlackParams that = (SlackParams) o; + return Objects.equals(workspaceId, that.workspaceId) && + Objects.equals(channelId, that.channelId) && + Objects.equals(secret, that.secret); + } + + @Override + public int hashCode() { + return Objects.hash(workspaceId, channelId, secret); + } + } + + public static class FirebaseParams extends NotificationParams { + private final String projectId; + private final String clientEmail; + private final String privateKey; + private final String topic; + + + public FirebaseParams( + @JsonProperty(value = "projectId", required = true) String projectId, + @JsonProperty(value = "clientEmail", required = true) String clientEmail, + @JsonProperty(value = "privateKey", required = true) String privateKey, + @JsonProperty(value = "topic", required = true) String topic) { + this.projectId = projectId; + this.clientEmail = clientEmail; + this.privateKey = privateKey; + this.topic = topic; + } + + public String getProjectId() { + return projectId; + } + + public String getClientEmail() { + return clientEmail; + } + + public String getPrivateKey() { + return privateKey; + } + + public String getTopic() { + return topic; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + FirebaseParams that = (FirebaseParams) o; + return Objects.equals(projectId, that.projectId) && + Objects.equals(clientEmail, that.clientEmail) && + Objects.equals(privateKey, that.privateKey) && + Objects.equals(topic, that.topic); + } + + @Override + public int hashCode() { + return Objects.hash(projectId, clientEmail, privateKey, topic); + } + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/core/src/test/java/org/jvalue/ods/coreservice/model/NotificationConfigTest.java b/core/src/test/java/org/jvalue/ods/coreservice/model/NotificationConfigTest.java index 8c516cbe8..26d8f6f98 100644 --- a/core/src/test/java/org/jvalue/ods/coreservice/model/NotificationConfigTest.java +++ b/core/src/test/java/org/jvalue/ods/coreservice/model/NotificationConfigTest.java @@ -16,7 +16,7 @@ public class NotificationConfigTest { private final ObjectMapper mapper = new ObjectMapper(); @Test - public void testDeserialization() throws IOException { + public void testWebhookDeserialization() throws IOException { final String configString = "{ " + "\"condition\":\"ifthisthenthat\"," + "\"params\":{" + @@ -26,12 +26,49 @@ public void testDeserialization() throws IOException { NotificationConfig result = mapper.readValue(configString, NotificationConfig.class); - System.out.println(result); assertEquals("ifthisthenthat", result.getCondition()); assertTrue(result.getParams() instanceof NotificationConfig.WebhookParams); assertEquals("URRRRRL", result.getParams().asWebhook().getUrl()); } + @Test + public void testSlackDeserialization() throws IOException { + final String configString = "{ " + + "\"condition\":\"ifthenelse\"," + + "\"params\":{" + + "\"type\":\"SLACK\"," + + "\"workspaceId\":\"12\"," + + "\"channelId\":\"34\"," + + "\"secret\":\"56\"}}"; + + NotificationConfig result = mapper.readValue(configString, NotificationConfig.class); + assertEquals("ifthenelse", result.getCondition()); + NotificationConfig.SlackParams params = result.getParams().asSlack(); + assertEquals("12", params.getWorkspaceId()); + assertEquals("34", params.getChannelId()); + assertEquals("56", params.getSecret()); + } + + @Test + public void testFirebaseDeserialization() throws IOException { + final String configString = "{ " + + "\"condition\":\"ifthenelse\"," + + "\"params\":{" + + "\"type\":\"FCM\"," + + "\"projectId\":\"12\"," + + "\"clientEmail\":\"fire@base.com\"," + + "\"privateKey\":\"1234\"," + + "\"topic\":\"weather\"}}"; + + NotificationConfig result = mapper.readValue(configString, NotificationConfig.class); + assertEquals("ifthenelse", result.getCondition()); + NotificationConfig.FirebaseParams params = result.getParams().asFirebase(); + assertEquals("12", params.getProjectId()); + assertEquals("fire@base.com", params.getClientEmail()); + assertEquals("1234", params.getPrivateKey()); + assertEquals("weather", params.getTopic()); + } + @Test(expected = InvalidTypeIdException.class) public void testDeserializationOfInvalidType() throws IOException { final String configString = "{ " + @@ -40,13 +77,7 @@ public void testDeserializationOfInvalidType() throws IOException { "\"type\":\"lol\"," + "\"url\":\"URRRRRL\"" + "}}"; - - NotificationConfig result = mapper.readValue(configString, NotificationConfig.class); - - System.out.println(result); - assertEquals("ifthisthenthat", result.getCondition()); - assertTrue(result.getParams() instanceof NotificationConfig.WebhookParams); - assertEquals("URRRRRL", result.getParams().asWebhook().getUrl()); + mapper.readValue(configString, NotificationConfig.class); } @Test(expected = JsonMappingException.class) @@ -58,13 +89,7 @@ public void testDeserializationOfInvalidParams() throws IOException { "\"url\":\"URRRRRL\"" + "\"extra\":\"bonus\"" + "}}"; - - NotificationConfig result = mapper.readValue(configString, NotificationConfig.class); - - System.out.println(result); - assertEquals("ifthisthenthat", result.getCondition()); - assertTrue(result.getParams() instanceof NotificationConfig.WebhookParams); - assertEquals("URRRRRL", result.getParams().asWebhook().getUrl()); + mapper.readValue(configString, NotificationConfig.class); } @Test(expected = MismatchedInputException.class) @@ -74,13 +99,20 @@ public void testDeserializationMissingParams() throws IOException { "\"params\":{" + "\"type\":\"WEBHOOK\"" + "}}"; + mapper.readValue(configString, NotificationConfig.class); + } - NotificationConfig result = mapper.readValue(configString, NotificationConfig.class); - - System.out.println(result); - assertEquals("ifthisthenthat", result.getCondition()); - assertTrue(result.getParams() instanceof NotificationConfig.WebhookParams); - assertEquals("URRRRRL", result.getParams().asWebhook().getUrl()); + @Test(expected = JsonMappingException.class) + public void testDeserializationWrongType() throws IOException { + final String configString = "{ " + + "\"condition\":\"ifthenelse\"," + + "\"params\":{" + + "\"type\":\"SLACK\"," + + "\"projectId\":\"12\"," + + "\"clientEmail\":\"fire@base.com\"," + + "\"privateKey\":\"1234\"," + + "\"topic\":\"weather\"}}"; + mapper.readValue(configString, NotificationConfig.class); } @Test From 00f61afa836f34463f1c7b68ea2a082e027b8268 Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Wed, 4 Dec 2019 11:54:18 +0100 Subject: [PATCH 0201/1168] core: Update notificationConfig models in integration-test --- core/integration-test/src/core.test.js | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/core/integration-test/src/core.test.js b/core/integration-test/src/core.test.js index 72e5c1639..6248d6409 100644 --- a/core/integration-test/src/core.test.js +++ b/core/integration-test/src/core.test.js @@ -186,9 +186,11 @@ describe("Core", () => { test('POST /{pipelineId}/notifications', async () => { const notificationConfig = { - "notificationType": "WEBHOOK", "condition": "data.value1 === 5", - "url": "www.some-url.net" + "params": { + "url": "www.some-url.net", + "type": "WEBHOOK" + } }; //add pipeline @@ -205,9 +207,9 @@ describe("Core", () => { //check if notification post worked expect(notificationCreationResponse.status).toEqual(200); expect(notificationCreationResponse.type).toEqual('application/json'); - expect(notificationCreationResponse.body.notificationType).toEqual("WEBHOOK"); + expect(notificationCreationResponse.body.params.type).toEqual("WEBHOOK"); expect(notificationCreationResponse.body.condition).toEqual("data.value1 === 5"); - expect(notificationCreationResponse.body.url).toEqual("www.some-url.net"); + expect(notificationCreationResponse.body.params.url).toEqual("www.some-url.net"); //check if update event worked const eventsResponse = await request(URL) @@ -306,9 +308,11 @@ const pipelineConfig = { }, "notifications": [ { - "notificationType": "WEBHOOK", "condition": "data.value1 > 10", - "url": "http://www.webhookland.com" + "params": { + "type": "WEBHOOK", + "url": "http://www.webhookland.com" + } } ] }; From e1a629884f085d90acf40a5c6c577c3a049aeca7 Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Wed, 4 Dec 2019 11:56:48 +0100 Subject: [PATCH 0202/1168] system-test: Update notificationConfig model --- system-test/src/system.test.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/system-test/src/system.test.js b/system-test/src/system.test.js index 7a153f80c..473b10efc 100644 --- a/system-test/src/system.test.js +++ b/system-test/src/system.test.js @@ -331,9 +331,11 @@ describe('System-Test', () => { function generateNotification(condition, url) { return { - notificationType: "WEBHOOK", condition, - url + params: { + url, + type: "WEBHOOK" + } } } From 1117cdc1e222dc897ab6acd678abe7520a2e1509 Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Wed, 4 Dec 2019 12:24:18 +0100 Subject: [PATCH 0203/1168] core: Fix persistence error for changed notificationConfig model --- .../jvalue/ods/coreservice/model/NotificationConfig.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java b/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java index 32c38775a..9cec6d139 100644 --- a/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java +++ b/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java @@ -4,9 +4,7 @@ import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; +import javax.persistence.*; import javax.validation.constraints.NotNull; import java.util.Objects; @@ -21,6 +19,7 @@ public class NotificationConfig { private String condition; @NotNull + @Embedded private NotificationParams params; @JsonTypeInfo( @@ -82,6 +81,7 @@ public NotificationParams getParams() { return params; } + @Embeddable public static class WebhookParams extends NotificationParams { private final String url; @@ -107,6 +107,7 @@ public int hashCode() { } } + @Embeddable public static class SlackParams extends NotificationParams { @NotNull private final String workspaceId; @NotNull private final String channelId; @@ -149,6 +150,7 @@ public int hashCode() { } } + @Embeddable public static class FirebaseParams extends NotificationParams { private final String projectId; private final String clientEmail; From 925050fb3e7cd98a056ed67d413b0d50f0e28afc Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Wed, 4 Dec 2019 12:24:35 +0100 Subject: [PATCH 0204/1168] core: Make notificationParams abstract --- .../org/jvalue/ods/coreservice/model/NotificationConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java b/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java index 9cec6d139..5d126c791 100644 --- a/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java +++ b/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java @@ -30,7 +30,7 @@ public class NotificationConfig { @JsonSubTypes.Type(value = SlackParams.class, name = "SLACK"), @JsonSubTypes.Type(value = FirebaseParams.class, name = "FCM") }) - public static class NotificationParams { + public abstract static class NotificationParams { public WebhookParams asWebhook() { if(this instanceof WebhookParams) { return (WebhookParams) this; From 85f69e1bdb7dee1578d3f4a63ba37097b4e6d021 Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Wed, 4 Dec 2019 13:53:45 +0100 Subject: [PATCH 0205/1168] core: Fix JPA inheritance annotations for notificationConfig --- .../jvalue/ods/coreservice/model/NotificationConfig.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java b/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java index 5d126c791..e8292a71c 100644 --- a/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java +++ b/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java @@ -30,6 +30,7 @@ public class NotificationConfig { @JsonSubTypes.Type(value = SlackParams.class, name = "SLACK"), @JsonSubTypes.Type(value = FirebaseParams.class, name = "FCM") }) + @MappedSuperclass public abstract static class NotificationParams { public WebhookParams asWebhook() { if(this instanceof WebhookParams) { @@ -81,7 +82,7 @@ public NotificationParams getParams() { return params; } - @Embeddable + @Entity public static class WebhookParams extends NotificationParams { private final String url; @@ -107,7 +108,7 @@ public int hashCode() { } } - @Embeddable + @Entity public static class SlackParams extends NotificationParams { @NotNull private final String workspaceId; @NotNull private final String channelId; @@ -150,7 +151,7 @@ public int hashCode() { } } - @Embeddable + @Entity public static class FirebaseParams extends NotificationParams { private final String projectId; private final String clientEmail; From 5c7c6848cd6e7deeeb905f665c6947dce48205f1 Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Wed, 4 Dec 2019 14:08:22 +0100 Subject: [PATCH 0206/1168] Auth: adjust redirect to API location changes --- auth/README.md | 4 ++++ auth/ods-userservice-realm.json | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/auth/README.md b/auth/README.md index 0b7c4c5f2..74ac46831 100644 --- a/auth/README.md +++ b/auth/README.md @@ -10,6 +10,10 @@ Keycload configuration UI is available on url `http://localhost:8080/auth/`. The A demo user with username `demo` and password `demo` is also created. +## Changing the Configuration + +Make sure to delete the database volume, e.g. by `docker volume prune`, otherwise the old configuration is still active! + ## Shutting down Use `docker-compose -f ../docker-compose.yml -f ../docker-compose.ci.yml up down` to stop the auth service. diff --git a/auth/ods-userservice-realm.json b/auth/ods-userservice-realm.json index 303edad26..a37f6b757 100644 --- a/auth/ods-userservice-realm.json +++ b/auth/ods-userservice-realm.json @@ -575,7 +575,7 @@ "redirectUris": [ "http://localhost:9000/*", "http://localhost:8080/*", - "/ui/*" + "/*" ], "webOrigins": ["*"], "notBefore": 0, From 2f17146f27e3113cbf536453fa2bd2ab98d4ab8e Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Wed, 4 Dec 2019 14:21:18 +0100 Subject: [PATCH 0207/1168] core: Add id field to notificationParams to enable persistence --- .../jvalue/ods/coreservice/model/NotificationConfig.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java b/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java index e8292a71c..46f8c3e69 100644 --- a/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java +++ b/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java @@ -1,5 +1,6 @@ package org.jvalue.ods.coreservice.model; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; @@ -32,6 +33,11 @@ public class NotificationConfig { }) @MappedSuperclass public abstract static class NotificationParams { + @Id + @GeneratedValue + @JsonIgnore + private Long paramsId; // necessary for persistence + public WebhookParams asWebhook() { if(this instanceof WebhookParams) { return (WebhookParams) this; From bdfead1ac6ba45d2f88c50db04aa3e73182a1208 Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Wed, 4 Dec 2019 15:06:19 +0100 Subject: [PATCH 0208/1168] core: Fix JPA inheritance strategy for notificationConfig model --- .../coreservice/model/NotificationConfig.java | 91 ++++++++++--------- 1 file changed, 48 insertions(+), 43 deletions(-) diff --git a/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java b/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java index 46f8c3e69..c07fd29d3 100644 --- a/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java +++ b/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java @@ -23,6 +23,33 @@ public class NotificationConfig { @Embedded private NotificationParams params; + //Constructor for JPA + public NotificationConfig() { + } + + public NotificationConfig( + @JsonProperty(value = "condition", required = true) String condition, + @JsonProperty(value = "params", required = true) NotificationParams params) { + this.condition = condition; + this.params = params; + } + + public Long getNotificationId() { + return notificationId; + } + + public void setNotificationId(Long notificationId) { + this.notificationId = notificationId; + } + + public String getCondition() { + return condition; + } + + public NotificationParams getParams() { + return params; + } + @JsonTypeInfo( use = JsonTypeInfo.Id.NAME, property = "type") @@ -31,8 +58,10 @@ public class NotificationConfig { @JsonSubTypes.Type(value = SlackParams.class, name = "SLACK"), @JsonSubTypes.Type(value = FirebaseParams.class, name = "FCM") }) - @MappedSuperclass - public abstract static class NotificationParams { + @Entity + @Inheritance(strategy = InheritanceType.SINGLE_TABLE) + @DiscriminatorColumn(name = "Notification_Type") + public static class NotificationParams { @Id @GeneratedValue @JsonIgnore @@ -61,34 +90,8 @@ public FirebaseParams asFirebase() { } } - //Constructor for JPA - public NotificationConfig() { - } - - public NotificationConfig( - @JsonProperty(value = "condition", required = true) String condition, - @JsonProperty(value = "params", required = true) NotificationParams params) { - this.condition = condition; - this.params = params; - } - - public Long getNotificationId() { - return notificationId; - } - - public void setNotificationId(Long notificationId) { - this.notificationId = notificationId; - } - - public String getCondition() { - return condition; - } - - public NotificationParams getParams() { - return params; - } - @Entity + @DiscriminatorValue("Webhook") public static class WebhookParams extends NotificationParams { private final String url; @@ -115,6 +118,7 @@ public int hashCode() { } @Entity + @DiscriminatorValue("Slack") public static class SlackParams extends NotificationParams { @NotNull private final String workspaceId; @NotNull private final String channelId; @@ -158,6 +162,7 @@ public int hashCode() { } @Entity + @DiscriminatorValue("Firebase") public static class FirebaseParams extends NotificationParams { private final String projectId; private final String clientEmail; @@ -209,18 +214,18 @@ public int hashCode() { } } - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - NotificationConfig that = (NotificationConfig) o; - return Objects.equals(notificationId, that.notificationId) && - Objects.equals(condition, that.condition) && - Objects.equals(params, that.params); - } - - @Override - public int hashCode() { - return Objects.hash(notificationId, condition, params); - } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + NotificationConfig that = (NotificationConfig) o; + return Objects.equals(notificationId, that.notificationId) && + Objects.equals(condition, that.condition) && + Objects.equals(params, that.params); + } + + @Override + public int hashCode() { + return Objects.hash(notificationId, condition, params); + } } From d7a659ecf4a938be1ed1f284b6e35387efe34dd5 Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Wed, 4 Dec 2019 15:45:06 +0100 Subject: [PATCH 0209/1168] core: Fix JPA again --- .../jvalue/ods/coreservice/model/NotificationConfig.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java b/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java index c07fd29d3..769ed5410 100644 --- a/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java +++ b/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java @@ -20,7 +20,7 @@ public class NotificationConfig { private String condition; @NotNull - @Embedded + @OneToOne private NotificationParams params; //Constructor for JPA @@ -61,11 +61,11 @@ public NotificationParams getParams() { @Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name = "Notification_Type") - public static class NotificationParams { + public abstract static class NotificationParams { @Id @GeneratedValue @JsonIgnore - private Long paramsId; // necessary for persistence + protected Long paramsId; // necessary for persistence public WebhookParams asWebhook() { if(this instanceof WebhookParams) { From f999cb0f1b9362b6765e3dcb9e547f7f65a4630d Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Wed, 4 Dec 2019 15:56:46 +0100 Subject: [PATCH 0210/1168] core: Fix JPA again --- .../org/jvalue/ods/coreservice/model/NotificationConfig.java | 1 - 1 file changed, 1 deletion(-) diff --git a/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java b/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java index 769ed5410..16ff3f845 100644 --- a/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java +++ b/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java @@ -19,7 +19,6 @@ public class NotificationConfig { @NotNull private String condition; - @NotNull @OneToOne private NotificationParams params; From 3ea6928a8e735c6998675b921c82c66149ea2da1 Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Thu, 5 Dec 2019 10:06:53 +0100 Subject: [PATCH 0211/1168] core: Fix JPA again --- .../org/jvalue/ods/coreservice/model/NotificationConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java b/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java index 16ff3f845..51df966a8 100644 --- a/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java +++ b/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java @@ -19,7 +19,7 @@ public class NotificationConfig { @NotNull private String condition; - @OneToOne + @OneToOne(cascade = CascadeType.ALL) private NotificationParams params; //Constructor for JPA From ddea17a38f9a1b7f842b51bd567bf3286e672fca Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Thu, 5 Dec 2019 10:25:51 +0100 Subject: [PATCH 0212/1168] core: Fix JPA for good --- .../coreservice/model/NotificationConfig.java | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java b/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java index 51df966a8..24b687f66 100644 --- a/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java +++ b/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java @@ -92,7 +92,9 @@ public FirebaseParams asFirebase() { @Entity @DiscriminatorValue("Webhook") public static class WebhookParams extends NotificationParams { - private final String url; + private String url; + + public WebhookParams() { } // Default constructor for JPA public WebhookParams(@JsonProperty(value = "url", required = true) String url) { this.url = url; @@ -119,9 +121,11 @@ public int hashCode() { @Entity @DiscriminatorValue("Slack") public static class SlackParams extends NotificationParams { - @NotNull private final String workspaceId; - @NotNull private final String channelId; - @NotNull private final String secret; + @NotNull private String workspaceId; + @NotNull private String channelId; + @NotNull private String secret; + + public SlackParams() { } // Default constructor for JPA public SlackParams( @JsonProperty(value = "workspaceId", required = true) String workspaceId, @@ -163,11 +167,12 @@ public int hashCode() { @Entity @DiscriminatorValue("Firebase") public static class FirebaseParams extends NotificationParams { - private final String projectId; - private final String clientEmail; - private final String privateKey; - private final String topic; + private String projectId; + private String clientEmail; + private String privateKey; + private String topic; + public FirebaseParams() { } // Default constructor for JPA public FirebaseParams( @JsonProperty(value = "projectId", required = true) String projectId, From 77b769749fa5c11eb0691ea2fc6b05cf9b73756d Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Thu, 5 Dec 2019 10:33:59 +0100 Subject: [PATCH 0213/1168] documentation: Update example requests to match new notification model --- doc/example-requests/core.http | 6 +++-- doc/example-requests/transformation.http | 31 ++++++++++++++++-------- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/doc/example-requests/core.http b/doc/example-requests/core.http index 4c5b83850..36915f71f 100644 --- a/doc/example-requests/core.http +++ b/doc/example-requests/core.http @@ -38,9 +38,11 @@ Content-Type: application/json }, "notifications": [ { - "notificationType": "WEBHOOK", "condition": "data.test === 'abc'", - "url": "http://www.mocky.io/v2/5dc94f7a2f0000680073eb96" + "params": { + "type": "WEBHOOK", + "url": "http://www.mocky.io/v2/5dc94f7a2f0000680073eb96" + } } ] } diff --git a/doc/example-requests/transformation.http b/doc/example-requests/transformation.http index 99ff5cc94..5afdefda2 100644 --- a/doc/example-requests/transformation.http +++ b/doc/example-requests/transformation.http @@ -1,5 +1,5 @@ -# @baseURL = http://localhost:9000/api/transformation -@baseURL = http://localhost:8080 +@baseURL = http://localhost:9000/api/transformation +#@baseURL = http://localhost:8080 ### Get version GET {{baseURL}}/version HTTP/1.1 @@ -80,48 +80,59 @@ Content-Type: application/json { "pipelineId": 666, "pipelineName": "peterchens pipeline", - "url": "http://www.mocky.io/v2/5185415ba171ea3a00704eed", "data": { "eins": "one", "zwei": 2 }, "dataLocation": "ods-storage", "condition": "data.zwei > 1", - "notificationType": "WEBHOOK" + "params": { + "type": "WEBHOOK", + "url": "http://www.mocky.io/v2/5185415ba171ea3a00704eed" + } } ### Trigger slack notification -### Please set slackCallback environment variable according to the slack webhook you want to use +### Please environment variables according to the slack workspace/channel you want to use POST {{baseURL}}/notification HTTP/1.1 Content-Type: application/json { "pipelineId": 666, "pipelineName": "peterchens pipeline", - "url": "https://hooks.slack.com/services/{{slackCallback}}", "data": { "eins": "one", "zwei": 2 }, "dataLocation": "ods-storage", "condition": "data.zwei > 1", - "notificationType": "SLACK" + "params": { + "type": "SLACK", + "workspaceId": "{{slackWorkspaceId}}", + "channelId": "{{slackChannelId}}", + "secret": "{{slackSecret}}" + } } ### Trigger firebase notification -### please set fcmProject environment variable according to the project id of your firebase project +### please set environment variables according to the credentials of your firebase project POST {{baseURL}}/notification HTTP/1.1 Content-Type: application/json { "pipelineId": 666, "pipelineName": "peterchens pipeline", - "url": "https://fcm.googleapis.com/v1/projects/{{fcmProject}}/messages:send", "data": { "eins": "one", "zwei": 2 }, "dataLocation": "ods-storage", "condition": "data.zwei > 1", - "notificationType": "FCM" + "params": { + "type": "FCM", + "projectId": "{{fcmProjectId}}", + "clientEmail": "{{fcmClientEmail}}", + "privateKey": "{{fcmKey}}", + "topic": "{{fcmTopic}}" + } } From 664a5bd5a53ad8c054dbb301c8ce450af25df7cc Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Thu, 5 Dec 2019 12:53:32 +0100 Subject: [PATCH 0214/1168] transformation: Fix firebase initialization --- transformation/src/jsTransformationService.ts | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/transformation/src/jsTransformationService.ts b/transformation/src/jsTransformationService.ts index ba17744d8..20e4eeadb 100644 --- a/transformation/src/jsTransformationService.ts +++ b/transformation/src/jsTransformationService.ts @@ -11,6 +11,7 @@ import SandboxExecutor from './interfaces/sandboxExecutor' import SlackCallback from './interfaces/slackCallback' import FcmCallback from './interfaces/fcmCallback' import WebhookCallback from './interfaces/webhookCallback' +import App = firebase.app.App; const VERSION = '0.0.2' @@ -68,8 +69,8 @@ export default class JSTransformationService implements TransformationService { return Promise.resolve() } - const message = `Pipeline ${notificationRequest.pipelineName}(${notificationRequest.pipelineId}) has new data available.` + - `Fetch at ${notificationRequest.dataLocation}.` + const message = `Pipeline ${notificationRequest.pipelineName}(${notificationRequest.pipelineId})` + + `has new data available. Fetch at ${notificationRequest.dataLocation}.` switch (notificationRequest.params.type) { case 'WEBHOOK': @@ -82,7 +83,7 @@ export default class JSTransformationService implements TransformationService { await this.handleSlack(notificationRequest.params, message) break default: - throw new Error(`Notification type not implemented.`) + throw new Error('Notification type not implemented.') } } @@ -96,7 +97,7 @@ export default class JSTransformationService implements TransformationService { private async handleSlack (params: SlackParams, message: string): Promise { let slackBaseUri = 'https://hooks.slack.com/services' - if(process.env.MOCK_RECEIVER_HOST && process.env.MOCK_RECEIVER_PORT) { + if (process.env.MOCK_RECEIVER_HOST && process.env.MOCK_RECEIVER_PORT) { slackBaseUri = `http://${process.env.MOCK_RECEIVER_HOST}:${process.env.MOCK_RECEIVER_PORT}/slack` } const callbackObject: SlackCallback = { @@ -107,8 +108,11 @@ export default class JSTransformationService implements TransformationService { } private async handleFCM (params: FirebaseParams, message: string): Promise { - if(!firebase.app(params.clientEmail)) { - firebase.initializeApp({ + let app: App + try { + app = firebase.app(params.clientEmail) + } catch (e) { // app does not exist yet + app = firebase.initializeApp({ credential: firebase.credential.cert({ projectId: params.projectId, clientEmail: params.clientEmail, @@ -128,7 +132,7 @@ export default class JSTransformationService implements TransformationService { }, topic: params.topic } - const firebaseResponse = await firebase.messaging().send(firebaseMessage) + const firebaseResponse = await firebase.messaging(app).send(firebaseMessage) console.log(`Firebase message sent to: ${firebaseResponse}`) } } From 331afe75b71087cef49e3685a219af7ca1b98adb Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Thu, 5 Dec 2019 13:03:08 +0100 Subject: [PATCH 0215/1168] transformation: Adapt unit tests --- transformation/src/jsTransformationService.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/transformation/src/jsTransformationService.test.ts b/transformation/src/jsTransformationService.test.ts index 5569f8aa9..51ed1ccf9 100644 --- a/transformation/src/jsTransformationService.test.ts +++ b/transformation/src/jsTransformationService.test.ts @@ -155,7 +155,7 @@ describe('JSTransformationService', () => { await transformationService.handleNotification(request) const expectedObject: SlackCallback = { - text: `Pipeline ${request.pipelineName}(${request.pipelineId}) has new data available.Fetch at ${request.dataLocation}.` + text: `Pipeline ${request.pipelineName}(${request.pipelineId}) has new data available. Fetch at ${request.dataLocation}.` } expect(post).toHaveBeenCalledTimes(1) const slackParams = request.params as SlackParams From 9b5ef0c1761a89555484038a8d58165bedd9adc3 Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Thu, 5 Dec 2019 13:03:41 +0100 Subject: [PATCH 0216/1168] transformation: Adapt integration test --- transformation/integration-test/src/transformation.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/transformation/integration-test/src/transformation.test.js b/transformation/integration-test/src/transformation.test.js index 6b23348f5..3834d80be 100644 --- a/transformation/integration-test/src/transformation.test.js +++ b/transformation/integration-test/src/transformation.test.js @@ -227,7 +227,7 @@ describe('Scheduler', () => { expect(receiverResponse.status).toEqual(200) expect(receiverResponse.body.text) - .toEqual(`Pipeline ${slackJob.pipelineName}(${slackJob.pipelineId}) has new data available.Fetch at ${dataLocation}.`) + .toEqual(`Pipeline ${slackJob.pipelineName}(${slackJob.pipelineId}) has new data available. Fetch at ${dataLocation}.`) }) function sleep (ms) { From 73ffd8bb1cb0ee4e6e392136a7305f2d7a0e701f Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Thu, 5 Dec 2019 13:08:30 +0100 Subject: [PATCH 0217/1168] core: Update models in readme --- core/README.md | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/core/README.md b/core/README.md index 449c93151..e532e9a47 100644 --- a/core/README.md +++ b/core/README.md @@ -93,8 +93,33 @@ Note that you need to delete existing docker images from your local docker daemo ### NotificationConfig ``` { - "notificationType":"WEBHOOK", - "condition":String (Javascript boolean expression), - "url":String + "condition":String (Javascript boolean expression), + "params": WebhookParams || SlackParams || FirebaseParams +} +``` + +### WebhookParams +``` +{ + "url": String (the url of the webhook you want to be triggered) +} +``` + +### SlackParams +``` +{ + "workspaceId": String (id of your slack workspace), + "channelId": String (id of the channel where the notification is to be posted), + "secret": String (secret part of the slack webhook, get it at slack management console) +} +``` + +### FirebaseParams +``` +{ + "projectId": String (id of your firebase project), + "clientEmail": String (email of the firebase service account), + "privateKey: String (secret key associated with the service account), + "topic": String (topic under which the notification is to be posted) } ``` From 41c142039a50925258dc841d2d9bb84c4dcc8dcb Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Thu, 5 Dec 2019 13:09:59 +0100 Subject: [PATCH 0218/1168] documentation: Add comments to example requests --- doc/example-requests/transformation.http | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/example-requests/transformation.http b/doc/example-requests/transformation.http index 5afdefda2..f2fa3011a 100644 --- a/doc/example-requests/transformation.http +++ b/doc/example-requests/transformation.http @@ -94,6 +94,7 @@ Content-Type: application/json ### Trigger slack notification ### Please environment variables according to the slack workspace/channel you want to use +### For further informations on the fields see readme of the "core" subproject. POST {{baseURL}}/notification HTTP/1.1 Content-Type: application/json @@ -116,6 +117,7 @@ Content-Type: application/json ### Trigger firebase notification ### please set environment variables according to the credentials of your firebase project +### For further informations on the fields see readme of the "core" subproject. POST {{baseURL}}/notification HTTP/1.1 Content-Type: application/json From d64f9e0c34524f57241f3f0b9b05c3475682b22c Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Thu, 5 Dec 2019 13:12:46 +0100 Subject: [PATCH 0219/1168] transformation: Fix typo in notification message --- transformation/src/jsTransformationService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/transformation/src/jsTransformationService.ts b/transformation/src/jsTransformationService.ts index 20e4eeadb..ad097368e 100644 --- a/transformation/src/jsTransformationService.ts +++ b/transformation/src/jsTransformationService.ts @@ -69,7 +69,7 @@ export default class JSTransformationService implements TransformationService { return Promise.resolve() } - const message = `Pipeline ${notificationRequest.pipelineName}(${notificationRequest.pipelineId})` + + const message = `Pipeline ${notificationRequest.pipelineName}(${notificationRequest.pipelineId}) ` + `has new data available. Fetch at ${notificationRequest.dataLocation}.` switch (notificationRequest.params.type) { From af257d390cca362104abb8c1124d57ac8d6aef22 Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Thu, 5 Dec 2019 13:31:18 +0100 Subject: [PATCH 0220/1168] core: Fix JPA for good --- .../org/jvalue/ods/coreservice/model/NotificationConfig.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java b/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java index 24b687f66..42f0ca64e 100644 --- a/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java +++ b/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java @@ -169,6 +169,7 @@ public int hashCode() { public static class FirebaseParams extends NotificationParams { private String projectId; private String clientEmail; + @Column(columnDefinition = "LONGTEXT") private String privateKey; private String topic; From 8609d3d269cf41fc8d22dfa85570674c9562608a Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Thu, 5 Dec 2019 13:34:12 +0100 Subject: [PATCH 0221/1168] documentation: Include firebase notification in core example request --- doc/example-requests/core.http | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/doc/example-requests/core.http b/doc/example-requests/core.http index 36915f71f..94999e453 100644 --- a/doc/example-requests/core.http +++ b/doc/example-requests/core.http @@ -30,7 +30,7 @@ Content-Type: application/json "trigger": { "firstExecution": "2018-10-07T01:32:00.123Z", "periodic": true, - "interval": 60000 + "interval": 1000 }, "metadata": { "author": "icke", @@ -38,11 +38,21 @@ Content-Type: application/json }, "notifications": [ { - "condition": "data.test === 'abc'", - "params": { - "type": "WEBHOOK", - "url": "http://www.mocky.io/v2/5dc94f7a2f0000680073eb96" - } + "condition": "data.test === 'abc'", + "params": { + "type": "WEBHOOK", + "url": "http://www.mocky.io/v2/5dc94f7a2f0000680073eb96" + } + }, + { + "condition": "typeof data.test === 'string'", + "params": { + "type": "FCM", + "projectId": "{{fcmProjectId}}", + "clientEmail": "{{fcmClientEmail}}", + "privateKey": "{{fcmKey}}", + "topic": "{{fcmTopic}}" + } } ] } From bdeffcb971a47796c4ca0a1109df4c84dc57b813 Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Thu, 5 Dec 2019 13:39:31 +0100 Subject: [PATCH 0222/1168] core: Fix JPA --- .../org/jvalue/ods/coreservice/model/NotificationConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java b/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java index 42f0ca64e..01f59d50e 100644 --- a/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java +++ b/core/src/main/java/org/jvalue/ods/coreservice/model/NotificationConfig.java @@ -169,7 +169,7 @@ public int hashCode() { public static class FirebaseParams extends NotificationParams { private String projectId; private String clientEmail; - @Column(columnDefinition = "LONGTEXT") + @Column(length = 2000) private String privateKey; private String topic; From a2c0ee2b43889bd0b170ed643ab601a51b81ffb9 Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Fri, 6 Dec 2019 10:39:08 +0100 Subject: [PATCH 0223/1168] Adapter: fix failing tests because of parameter type mismatch --- .../ods/adapterservice/interpreter/JsonInterpreterTest.java | 2 +- .../ods/adapterservice/interpreter/XmlInterpreterTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/adapter/src/test/java/org/jvalue/ods/adapterservice/interpreter/JsonInterpreterTest.java b/adapter/src/test/java/org/jvalue/ods/adapterservice/interpreter/JsonInterpreterTest.java index acbe3945a..43cef8199 100644 --- a/adapter/src/test/java/org/jvalue/ods/adapterservice/interpreter/JsonInterpreterTest.java +++ b/adapter/src/test/java/org/jvalue/ods/adapterservice/interpreter/JsonInterpreterTest.java @@ -29,7 +29,7 @@ public void interpretMalformedData() throws IOException { @Test public void testSerialization() throws IOException { - JsonNode expected = mapper.readTree("{\"type\":\"JSON\",\"description\":\"Interpret data as JSON data\",\"parameters\":{}}"); + JsonNode expected = mapper.readTree("{\"type\":\"JSON\",\"description\":\"Interpret data as JSON data\",\"parameters\":[]}"); JsonNode result = mapper.valueToTree(interpreter); assertEquals(expected, result); diff --git a/adapter/src/test/java/org/jvalue/ods/adapterservice/interpreter/XmlInterpreterTest.java b/adapter/src/test/java/org/jvalue/ods/adapterservice/interpreter/XmlInterpreterTest.java index 1f732b3c7..8d6a55aec 100644 --- a/adapter/src/test/java/org/jvalue/ods/adapterservice/interpreter/XmlInterpreterTest.java +++ b/adapter/src/test/java/org/jvalue/ods/adapterservice/interpreter/XmlInterpreterTest.java @@ -30,7 +30,7 @@ public void interpretMalformedData() throws IOException { @Test public void testSerialization() throws IOException { - JsonNode expected = mapper.readTree("{\"type\":\"XML\",\"description\":\"Interpret data as XML data\",\"parameters\":{}}"); + JsonNode expected = mapper.readTree("{\"type\":\"XML\",\"description\":\"Interpret data as XML data\",\"parameters\":[]}"); JsonNode result = mapper.valueToTree(interpreter); assertEquals(expected, result); From 1742bc55a2a09546c9be169ba97f941ceeea8b33 Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Fri, 6 Dec 2019 11:28:17 +0100 Subject: [PATCH 0224/1168] Adapter: Refactor CsvInterpreter and add header functionality and test cases --- .../interpreter/CsvInterpreter.java | 117 +++++++---- .../interpreter/CsvInterpreterTest.java | 194 ++++++++++++++---- 2 files changed, 227 insertions(+), 84 deletions(-) diff --git a/adapter/src/main/java/org/jvalue/ods/adapterservice/interpreter/CsvInterpreter.java b/adapter/src/main/java/org/jvalue/ods/adapterservice/interpreter/CsvInterpreter.java index cdc8885b0..70389c11d 100644 --- a/adapter/src/main/java/org/jvalue/ods/adapterservice/interpreter/CsvInterpreter.java +++ b/adapter/src/main/java/org/jvalue/ods/adapterservice/interpreter/CsvInterpreter.java @@ -9,58 +9,95 @@ import com.fasterxml.jackson.dataformat.csv.CsvSchema; import java.io.IOException; -import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; public class CsvInterpreter extends Interpreter { - private final List parameters = Collections.unmodifiableList(List.of( - new InterpreterParameterDescription("columnSeparator", "Column delimiter character", Character.class), - new InterpreterParameterDescription("lineSeparator", "Line delimiter character", String.class), - new InterpreterParameterDescription("skipFirstDataRow", "Skip first data row (after header)", Boolean.class), - new InterpreterParameterDescription("firstRowAsHeader", "Interpret first row as header for columns", Boolean.class) - )); - private final CsvMapper mapper = new CsvMapper().enable(CsvParser.Feature.WRAP_AS_ARRAY); - private final ObjectMapper jsonMapper = new ObjectMapper(); - - @Override - public String getType() { + private final List parameters = Collections.unmodifiableList(List.of( + new InterpreterParameterDescription("columnSeparator", "Column delimiter character", Character.class), + new InterpreterParameterDescription("lineSeparator", "Line delimiter character, only \\r, \\r\\n, and \\n supported", String.class), + new InterpreterParameterDescription("skipFirstDataRow", "Skip first data row (after header)", Boolean.class), + new InterpreterParameterDescription("firstRowAsHeader", "Interpret first row as header for columns", Boolean.class) + )); + private final CsvMapper mapper = new CsvMapper().enable(CsvParser.Feature.WRAP_AS_ARRAY); + private final ObjectMapper jsonMapper = new ObjectMapper(); + + @Override + public String getType() { return "CSV"; - } + } - @Override - public String getDescription() { + @Override + public String getDescription() { return "Interpret data as CSV data"; - } + } - @Override - public List getAvailableParameters() { + @Override + public List getAvailableParameters() { return parameters; + } + + @Override + protected void validateParameters(Map inputParameters) { + super.validateParameters(inputParameters); + + String lineSeparator = (String) inputParameters.get("lineSeparator"); + if (!lineSeparator.equals("\n") && !lineSeparator.equals("\r") && !lineSeparator.equals("\r\n")) { + throw new IllegalArgumentException(getType() + " interpreter requires parameter lineSeparator to have" + + " value \\n, \\r, or \\r\\n. Your given value " + lineSeparator + " is invalid!"); + } + } + + @Override + protected JsonNode doInterpret(String data, Map parameters) throws IOException { + CsvSchema csvSchema = createSchema(parameters); + if((boolean) parameters.get("firstRowAsHeader")) { + return parseWithHeader(data, csvSchema); + } else { + return parseWithoutHeader(data, csvSchema); } + } - @Override - protected JsonNode doInterpret(String data, Map parameters) throws IOException { - CsvSchema csvSchema = CsvSchema - .emptySchema() - .withColumnSeparator((char) parameters.get("columnSeparator")) - .withLineSeparator((String) parameters.get("lineSeparator")) - .withSkipFirstDataRow((boolean) parameters.get("skipFirstDataRow")); - if((boolean) parameters.get("firstRowAsHeader")) { - csvSchema = csvSchema - .withHeader(); - } - MappingIterator allLines = mapper - .readerFor(Object[].class) - .with(csvSchema) - .readValues(data); - - ArrayNode result = mapper.createArrayNode(); - while(allLines.hasNext()) { - result.add(jsonMapper.valueToTree(allLines.next())); - } - - return result; + private CsvSchema createSchema(Map parameters) { + CsvSchema csvSchema = CsvSchema + .emptySchema() + .withColumnSeparator((char) parameters.get("columnSeparator")) + .withLineSeparator((String) parameters.get("lineSeparator")) + .withSkipFirstDataRow((boolean) parameters.get("skipFirstDataRow")); + if((boolean) parameters.get("firstRowAsHeader")) { + csvSchema = csvSchema + .withHeader(); } + return csvSchema; + } + + private JsonNode parseWithoutHeader(String data, CsvSchema csvSchema) throws IOException { + MappingIterator allLines = mapper + .readerFor(Object[].class) + .with(csvSchema) + .readValues(data); + + ArrayNode result = mapper.createArrayNode(); + while(allLines.hasNext()) { + result.add(jsonMapper.valueToTree(allLines.next())); + } + + return result; + } + + private JsonNode parseWithHeader(String data, CsvSchema csvSchema) throws IOException { + MappingIterator> allLines = mapper + .readerFor(Map.class) + .with(csvSchema) + .readValues(data); + + ArrayNode result = mapper.createArrayNode(); + while(allLines.hasNext()) { + result.add(jsonMapper.valueToTree(allLines.next())); + } + + return result; + } } diff --git a/adapter/src/test/java/org/jvalue/ods/adapterservice/interpreter/CsvInterpreterTest.java b/adapter/src/test/java/org/jvalue/ods/adapterservice/interpreter/CsvInterpreterTest.java index c3ee96033..8f08bd855 100644 --- a/adapter/src/test/java/org/jvalue/ods/adapterservice/interpreter/CsvInterpreterTest.java +++ b/adapter/src/test/java/org/jvalue/ods/adapterservice/interpreter/CsvInterpreterTest.java @@ -12,49 +12,155 @@ import static org.junit.Assert.assertEquals; public class CsvInterpreterTest { - private final Interpreter interpreter = new CsvInterpreter(); - private static final String CSV_STRING = "1;2;sadf\n5;3;fasd"; - private final ObjectMapper mapper = new ObjectMapper(); - - @Test - public void interpretCSVData() throws IOException { - JsonNode result = interpreter.interpret(CSV_STRING, Map.of( - "columnSeparator", ';', - "lineSeparator", "/n", - "skipFirstDataRow", false, - "firstRowAsHeader", false - )); - - assertEquals(JsonNodeType.ARRAY, result.getNodeType()); - final ArrayNode results = (ArrayNode) result; - - JsonNode row = results.get(0); - // TODO - } - - @Test(expected = IllegalArgumentException.class) - public void interpretMissingParameters() throws IOException { - interpreter.interpret("{\"this is\":\"no CSV\"", Map.of()); - } - - @Test(expected = IllegalArgumentException.class) - public void interpretWrongParameterType() throws IOException { - interpreter.interpret("{\"this is\":\"no CSV\"", Map.of("columnSeparator", "String")); - } - - @Test - public void testSerialization() throws IOException { - JsonNode expected = mapper.readTree("{\"type\":\"CSV\"," + - "\"description\":\"Interpret data as CSV data\"," + - "\"parameters\":[" + - "{\"name\":\"columnSeparator\",\"description\":\"Column delimiter character\",\"type\":\"java.lang.Character\"}," + - "{\"name\":\"lineSeparator\",\"description\":\"Line delimiter character\",\"type\":\"java.lang.String\"}," + - "{\"name\":\"skipFirstDataRow\",\"description\":\"Skip first data row (after header)\",\"type\":\"java.lang.Boolean\"}," + - "{\"name\":\"firstRowAsHeader\",\"description\":\"Interpret first row as header for columns\",\"type\":\"java.lang.Boolean\"}" + - "]}"); - JsonNode result = mapper.valueToTree(interpreter); - - assertEquals(expected, result); - } + private final Interpreter interpreter = new CsvInterpreter(); + private static final String CSV_STRING = "1;2;sadf\n5;3;fasd"; + private final ObjectMapper mapper = new ObjectMapper(); + + @Test + public void interpretSimpleCSVData() throws IOException { + JsonNode result = interpreter.interpret(CSV_STRING, Map.of( + "columnSeparator", ';', + "lineSeparator", "\n", + "skipFirstDataRow", false, + "firstRowAsHeader", false + )); + + assertEquals(JsonNodeType.ARRAY, result.getNodeType()); + final ArrayNode results = (ArrayNode) result; + + assertEquals(2, results.size()); + + // first row + assertEquals(3, result.get(0).size()); + assertEquals("1", results.get(0).get(0).asText()); + assertEquals("2", results.get(0).get(1).asText()); + assertEquals("sadf", results.get(0).get(2).asText()); + + // second row + assertEquals(3, result.get(1).size()); + assertEquals("5", results.get(1).get(0).asText()); + assertEquals("3", results.get(1).get(1).asText()); + assertEquals("fasd", results.get(1).get(2).asText()); + } + + @Test + public void interpretCSVDataOtherColumnSeparator() throws IOException { + String csv = CSV_STRING.replace(';', '&'); + JsonNode result = interpreter.interpret(csv, Map.of( + "columnSeparator", '&', + "lineSeparator", "\n", + "skipFirstDataRow", false, + "firstRowAsHeader", false + )); + + assertEquals(JsonNodeType.ARRAY, result.getNodeType()); + final ArrayNode results = (ArrayNode) result; + + assertEquals(2, results.size()); + assertEquals(3, result.get(0).size()); + assertEquals(3, result.get(1).size()); + } + + @Test + public void interpretCSVDataOtherLineSeparator() throws IOException { + String csv = CSV_STRING.replace('\n', '\r'); + JsonNode result = interpreter.interpret(csv, Map.of( + "columnSeparator", ';', + "lineSeparator", "\r", + "skipFirstDataRow", false, + "firstRowAsHeader", false + )); + + assertEquals(JsonNodeType.ARRAY, result.getNodeType()); + final ArrayNode results = (ArrayNode) result; + + assertEquals(2, results.size()); + assertEquals(3, result.get(0).size()); + assertEquals(3, result.get(1).size()); + } + + @Test + public void interpretCSVDataSkipFirstRow() throws IOException { + JsonNode result = interpreter.interpret(CSV_STRING, Map.of( + "columnSeparator", ';', + "lineSeparator", "\n", + "skipFirstDataRow", true, + "firstRowAsHeader", false + )); + + assertEquals(JsonNodeType.ARRAY, result.getNodeType()); + final ArrayNode results = (ArrayNode) result; + + assertEquals(1, results.size()); + + // first row + assertEquals(3, result.get(0).size()); + assertEquals("5", results.get(0).get(0).asText()); + assertEquals("3", results.get(0).get(1).asText()); + assertEquals("fasd", results.get(0).get(2).asText()); + } + + @Test + public void interpretCSVDataHeaderRow() throws IOException { + String csv = "1;2;sadf\n5;3;fasd"; + JsonNode result = interpreter.interpret(csv, Map.of( + "columnSeparator", ';', + "lineSeparator", "\n", + "skipFirstDataRow", false, + "firstRowAsHeader", true + )); + + assertEquals(JsonNodeType.ARRAY, result.getNodeType()); + final ArrayNode results = (ArrayNode) result; + + assertEquals(1, results.size()); + + // first row + assertEquals(3, result.get(0).size()); + assertEquals("5", results.get(0).get("1").asText()); + assertEquals("3", results.get(0).get("2").asText()); + assertEquals("fasd", results.get(0).get("sadf").asText()); + } + + @Test(expected = IllegalArgumentException.class) + public void interpretMissingParameters() throws IOException { + interpreter.interpret("{\"this is\":\"no CSV\"", Map.of()); + } + + @Test(expected = IllegalArgumentException.class) + public void interpretWrongParameterType() throws IOException { + interpreter.interpret(CSV_STRING, Map.of( + "columnSeparator", ',', + "lineSeparator", ";", + "skipFirstDataRow", false, + "firstRowAsHeader", 123 // should be boolean! + )); + } + + @Test(expected = IllegalArgumentException.class) + public void interpretInvalidLineSeparator() throws IOException { + interpreter.interpret(CSV_STRING, Map.of( + "columnSeparator", ',', + "lineSeparator", "&", // only \n, \r, or \r\n + "skipFirstDataRow", false, + "firstRowAsHeader", false + )); + } + + + @Test + public void testSerialization() throws IOException { + JsonNode expected = mapper.readTree("{\"type\":\"CSV\"," + + "\"description\":\"Interpret data as CSV data\"," + + "\"parameters\":[" + + "{\"name\":\"columnSeparator\",\"description\":\"Column delimiter character\",\"type\":\"java.lang.Character\"}," + + "{\"name\":\"lineSeparator\",\"description\":\"Line delimiter character, only \\\\r, \\\\r\\\\n, and \\\\n supported\",\"type\":\"java.lang.String\"}," + + "{\"name\":\"skipFirstDataRow\",\"description\":\"Skip first data row (after header)\",\"type\":\"java.lang.Boolean\"}," + + "{\"name\":\"firstRowAsHeader\",\"description\":\"Interpret first row as header for columns\",\"type\":\"java.lang.Boolean\"}" + + "]}"); + JsonNode result = mapper.valueToTree(interpreter); + + assertEquals(expected, result); + } } From 4eb4a7d96627cba97277c60f73723ba5043683c3 Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Fri, 6 Dec 2019 13:11:38 +0100 Subject: [PATCH 0225/1168] Adapter: CSV parameter change columnSeparator from char to string with restriction length one (char not supported by JSON) --- .../interpreter/CsvInterpreter.java | 10 +++++-- .../interpreter/Interpreter.java | 2 +- .../interpreter/CsvInterpreterTest.java | 26 +++++++++++++------ 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/adapter/src/main/java/org/jvalue/ods/adapterservice/interpreter/CsvInterpreter.java b/adapter/src/main/java/org/jvalue/ods/adapterservice/interpreter/CsvInterpreter.java index 70389c11d..0a5e6e0fa 100644 --- a/adapter/src/main/java/org/jvalue/ods/adapterservice/interpreter/CsvInterpreter.java +++ b/adapter/src/main/java/org/jvalue/ods/adapterservice/interpreter/CsvInterpreter.java @@ -16,7 +16,7 @@ public class CsvInterpreter extends Interpreter { private final List parameters = Collections.unmodifiableList(List.of( - new InterpreterParameterDescription("columnSeparator", "Column delimiter character", Character.class), + new InterpreterParameterDescription("columnSeparator", "Column delimiter character, only one character supported", String.class), new InterpreterParameterDescription("lineSeparator", "Line delimiter character, only \\r, \\r\\n, and \\n supported", String.class), new InterpreterParameterDescription("skipFirstDataRow", "Skip first data row (after header)", Boolean.class), new InterpreterParameterDescription("firstRowAsHeader", "Interpret first row as header for columns", Boolean.class) @@ -48,6 +48,12 @@ protected void validateParameters(Map inputParameters) { throw new IllegalArgumentException(getType() + " interpreter requires parameter lineSeparator to have" + " value \\n, \\r, or \\r\\n. Your given value " + lineSeparator + " is invalid!"); } + + String columnSeparator = (String) inputParameters.get("columnSeparator"); + if (columnSeparator.length() != 1) { + throw new IllegalArgumentException(getType() + " interpreter requires parameter columnSeparator to have" + + " length 1. Your given value " + columnSeparator + " is invalid!"); + } } @Override @@ -63,7 +69,7 @@ protected JsonNode doInterpret(String data, Map parameters) thro private CsvSchema createSchema(Map parameters) { CsvSchema csvSchema = CsvSchema .emptySchema() - .withColumnSeparator((char) parameters.get("columnSeparator")) + .withColumnSeparator(((String) parameters.get("columnSeparator")).charAt(0)) .withLineSeparator((String) parameters.get("lineSeparator")) .withSkipFirstDataRow((boolean) parameters.get("skipFirstDataRow")); if((boolean) parameters.get("firstRowAsHeader")) { diff --git a/adapter/src/main/java/org/jvalue/ods/adapterservice/interpreter/Interpreter.java b/adapter/src/main/java/org/jvalue/ods/adapterservice/interpreter/Interpreter.java index 32af7b8d3..35e8d10c2 100644 --- a/adapter/src/main/java/org/jvalue/ods/adapterservice/interpreter/Interpreter.java +++ b/adapter/src/main/java/org/jvalue/ods/adapterservice/interpreter/Interpreter.java @@ -31,7 +31,7 @@ protected void validateParameters(Map inputParameters) { if (inputParameters.get(requiredParameter.getName()) == null) { illegalArguments = true; illegalArgumentsMessage = illegalArgumentsMessage + getType() + " interpreter requires parameter " - + requiredParameter.getName() + "/n"; + + requiredParameter.getName() + "/n"; } else if (inputParameters.get(requiredParameter.getName()).getClass() != requiredParameter.getType()) { illegalArguments = true; diff --git a/adapter/src/test/java/org/jvalue/ods/adapterservice/interpreter/CsvInterpreterTest.java b/adapter/src/test/java/org/jvalue/ods/adapterservice/interpreter/CsvInterpreterTest.java index 8f08bd855..c424dae52 100644 --- a/adapter/src/test/java/org/jvalue/ods/adapterservice/interpreter/CsvInterpreterTest.java +++ b/adapter/src/test/java/org/jvalue/ods/adapterservice/interpreter/CsvInterpreterTest.java @@ -19,7 +19,7 @@ public class CsvInterpreterTest { @Test public void interpretSimpleCSVData() throws IOException { JsonNode result = interpreter.interpret(CSV_STRING, Map.of( - "columnSeparator", ';', + "columnSeparator", ";", "lineSeparator", "\n", "skipFirstDataRow", false, "firstRowAsHeader", false @@ -47,7 +47,7 @@ public void interpretSimpleCSVData() throws IOException { public void interpretCSVDataOtherColumnSeparator() throws IOException { String csv = CSV_STRING.replace(';', '&'); JsonNode result = interpreter.interpret(csv, Map.of( - "columnSeparator", '&', + "columnSeparator", "&", "lineSeparator", "\n", "skipFirstDataRow", false, "firstRowAsHeader", false @@ -65,7 +65,7 @@ public void interpretCSVDataOtherColumnSeparator() throws IOException { public void interpretCSVDataOtherLineSeparator() throws IOException { String csv = CSV_STRING.replace('\n', '\r'); JsonNode result = interpreter.interpret(csv, Map.of( - "columnSeparator", ';', + "columnSeparator", ";", "lineSeparator", "\r", "skipFirstDataRow", false, "firstRowAsHeader", false @@ -82,7 +82,7 @@ public void interpretCSVDataOtherLineSeparator() throws IOException { @Test public void interpretCSVDataSkipFirstRow() throws IOException { JsonNode result = interpreter.interpret(CSV_STRING, Map.of( - "columnSeparator", ';', + "columnSeparator", ";", "lineSeparator", "\n", "skipFirstDataRow", true, "firstRowAsHeader", false @@ -104,7 +104,7 @@ public void interpretCSVDataSkipFirstRow() throws IOException { public void interpretCSVDataHeaderRow() throws IOException { String csv = "1;2;sadf\n5;3;fasd"; JsonNode result = interpreter.interpret(csv, Map.of( - "columnSeparator", ';', + "columnSeparator", ";", "lineSeparator", "\n", "skipFirstDataRow", false, "firstRowAsHeader", true @@ -130,7 +130,7 @@ public void interpretMissingParameters() throws IOException { @Test(expected = IllegalArgumentException.class) public void interpretWrongParameterType() throws IOException { interpreter.interpret(CSV_STRING, Map.of( - "columnSeparator", ',', + "columnSeparator", ",", "lineSeparator", ";", "skipFirstDataRow", false, "firstRowAsHeader", 123 // should be boolean! @@ -140,20 +140,30 @@ public void interpretWrongParameterType() throws IOException { @Test(expected = IllegalArgumentException.class) public void interpretInvalidLineSeparator() throws IOException { interpreter.interpret(CSV_STRING, Map.of( - "columnSeparator", ',', + "columnSeparator", ",", "lineSeparator", "&", // only \n, \r, or \r\n "skipFirstDataRow", false, "firstRowAsHeader", false )); } + @Test(expected = IllegalArgumentException.class) + public void interpretInvalidColumnSeparator() throws IOException { + interpreter.interpret(CSV_STRING, Map.of( + "columnSeparator", ",asd", + "lineSeparator", "\n", // only \n, \r, or \r\n + "skipFirstDataRow", false, + "firstRowAsHeader", false + )); + } + @Test public void testSerialization() throws IOException { JsonNode expected = mapper.readTree("{\"type\":\"CSV\"," + "\"description\":\"Interpret data as CSV data\"," + "\"parameters\":[" + - "{\"name\":\"columnSeparator\",\"description\":\"Column delimiter character\",\"type\":\"java.lang.Character\"}," + + "{\"name\":\"columnSeparator\",\"description\":\"Column delimiter character, only one character supported\",\"type\":\"java.lang.String\"}," + "{\"name\":\"lineSeparator\",\"description\":\"Line delimiter character, only \\\\r, \\\\r\\\\n, and \\\\n supported\",\"type\":\"java.lang.String\"}," + "{\"name\":\"skipFirstDataRow\",\"description\":\"Skip first data row (after header)\",\"type\":\"java.lang.Boolean\"}," + "{\"name\":\"firstRowAsHeader\",\"description\":\"Interpret first row as header for columns\",\"type\":\"java.lang.Boolean\"}" + From 4a622b90ff17e1cff0cbaac3c85a9c0585d0a7d6 Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Fri, 6 Dec 2019 13:11:58 +0100 Subject: [PATCH 0226/1168] Adapter: add CSV to interpreter lookup --- .../org/jvalue/ods/adapterservice/adapter/AdapterManager.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/adapter/src/main/java/org/jvalue/ods/adapterservice/adapter/AdapterManager.java b/adapter/src/main/java/org/jvalue/ods/adapterservice/adapter/AdapterManager.java index ec4c8848f..daadc1341 100644 --- a/adapter/src/main/java/org/jvalue/ods/adapterservice/adapter/AdapterManager.java +++ b/adapter/src/main/java/org/jvalue/ods/adapterservice/adapter/AdapterManager.java @@ -2,6 +2,7 @@ import org.jvalue.ods.adapterservice.importer.HttpImporter; import org.jvalue.ods.adapterservice.importer.Importer; +import org.jvalue.ods.adapterservice.interpreter.CsvInterpreter; import org.jvalue.ods.adapterservice.interpreter.Interpreter; import org.jvalue.ods.adapterservice.interpreter.JsonInterpreter; import org.jvalue.ods.adapterservice.interpreter.XmlInterpreter; @@ -21,7 +22,8 @@ public class AdapterManager { ); private static final Map interpreters = Map.ofEntries( entry("JSON", new JsonInterpreter()), - entry("XML", new XmlInterpreter()) + entry("XML", new XmlInterpreter()), + entry("CSV", new CsvInterpreter()) ); From be4372639fd3ec17460eab716484b408368e0bf0 Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Fri, 6 Dec 2019 13:13:35 +0100 Subject: [PATCH 0227/1168] Adapter: Add Jackson CSV to buildpath --- adapter/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/adapter/build.gradle b/adapter/build.gradle index 26a8bbadf..2fa59581f 100644 --- a/adapter/build.gradle +++ b/adapter/build.gradle @@ -42,6 +42,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml' + implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-csv' testImplementation 'org.springframework.boot:spring-boot-starter-test' } From b45e7fa96db5df2d6da6b2271f3f2e9b5957c71e Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Fri, 6 Dec 2019 13:13:52 +0100 Subject: [PATCH 0228/1168] Adapter: add integration tests for CSV interpreter --- adapter/integration-test/src/adapter.test.js | 36 ++++++++++++++++++++ adapter/integration-test/src/mock.server.js | 10 ++++++ 2 files changed, 46 insertions(+) diff --git a/adapter/integration-test/src/adapter.test.js b/adapter/integration-test/src/adapter.test.js index 7b76c3b66..741a35c06 100644 --- a/adapter/integration-test/src/adapter.test.js +++ b/adapter/integration-test/src/adapter.test.js @@ -103,4 +103,40 @@ describe("Adapter", () => { to: "Morty" }); }); + + test("POST /dataImport CSV-Adapter", async () => { + const reqBody = { + protocol: { + type: "HTTP", + parameters: { + location: MOCK_SERVER_URL + "/csv" + } + }, + format: { + type: "CSV", + parameters: { + columnSeparator: ",", + lineSeparator: "\n", + skipFirstDataRow: false, + firstRowAsHeader: true + } + } + }; + + const response = await request(URL) + .post("/dataImport") + .send(reqBody); + expect(response.status).toEqual(200); + expect(response.body).toEqual([ + { + col1: "val11", + col2: "val12", + col3: "val13" + }, { + col1: "val21", + col2: "val22", + col3: "val23" + } + ]); + }); }); diff --git a/adapter/integration-test/src/mock.server.js b/adapter/integration-test/src/mock.server.js index dda4c8762..a191ef8c5 100644 --- a/adapter/integration-test/src/mock.server.js +++ b/adapter/integration-test/src/mock.server.js @@ -23,6 +23,16 @@ router.get("/xml", async ctx => { "RickMorty"; }); +router.get("/csv", async ctx => { + console.log("GET /CSV"); + + ctx.type = "text/csv"; + ctx.body = + 'col1,col2,col3\n' + + 'val11,val12,val13\n' + + 'val21,val22,val23'; +}); + app.use(router.routes()); const server = app.listen(PORT, () => console.log("Starting mock server on port " + PORT)); From a223bb45c2f477f906db76b4419d5c236e972843 Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Fri, 6 Dec 2019 13:25:29 +0100 Subject: [PATCH 0229/1168] Documentation: add CSV example to HTTP examples --- doc/example-requests/adapter.http | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/doc/example-requests/adapter.http b/doc/example-requests/adapter.http index b6dee36ff..79525989e 100644 --- a/doc/example-requests/adapter.http +++ b/doc/example-requests/adapter.http @@ -1,6 +1,6 @@ @baseURL = http://localhost:9000/api/adapter -### Perform Data Import +### Perform Data Import JSON POST {{baseURL}}/dataImport HTTP/1.1 Content-Type: application/json @@ -12,6 +12,29 @@ Content-Type: application/json } }, "format": { - "type": "JSON" + "type": "JSON", + "parameters": {} + } +} + +### Perform Data Import CSV +POST {{baseURL}}/dataImport HTTP/1.1 +Content-Type: application/json + +{ + "protocol": { + "type": "HTTP", + "parameters": { + "location": "https://www.bka.de/SharedDocs/Downloads/DE/Publikationen/PolizeilicheKriminalstatistik/2018/BKATabellen/FaelleLaenderKreiseStaedte/BKA-LKS-F-03-T01-Kreise_csv.csv?__blob=publicationFile&v=3" + } + }, + "format": { + "type": "CSV", + "parameters": { + "columnSeparator": ";", + "lineSeparator": "\n", + "skipFirstDataRow": false, + "firstRowAsHeader": true + } } } From 76a10b032d7e2b5f527276d864893ea3f812077b Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Fri, 6 Dec 2019 14:37:55 +0100 Subject: [PATCH 0230/1168] UI: add configuration for CSV adapter format --- ui/src/pipeline/PipelineEdit.vue | 2 +- .../{ => adapter}/PipelineAdapterConfig.vue | 29 ++++++- .../edit/adapter/PipelineCsvAdapterConfig.vue | 77 +++++++++++++++++++ 3 files changed, 103 insertions(+), 5 deletions(-) rename ui/src/pipeline/edit/{ => adapter}/PipelineAdapterConfig.vue (57%) create mode 100644 ui/src/pipeline/edit/adapter/PipelineCsvAdapterConfig.vue diff --git a/ui/src/pipeline/PipelineEdit.vue b/ui/src/pipeline/PipelineEdit.vue index 36b85892b..648ed2128 100644 --- a/ui/src/pipeline/PipelineEdit.vue +++ b/ui/src/pipeline/PipelineEdit.vue @@ -122,7 +122,7 @@ import { Watch } from 'vue-property-decorator' import { Action, State } from 'vuex-class' import Pipeline from './pipeline' -import PipelineAdapterConfig from './edit/PipelineAdapterConfig.vue' +import PipelineAdapterConfig from './edit/adapter/PipelineAdapterConfig.vue' import PipelineEditStepperButtonGroup from './edit/PipelineEditStepperButtonGroup.vue' import PipelineMetadataConfig from './edit/PipelineMetadataConfig.vue' import PipelineTransformationConfig from './edit/PipelineTransformationConfig.vue' diff --git a/ui/src/pipeline/edit/PipelineAdapterConfig.vue b/ui/src/pipeline/edit/adapter/PipelineAdapterConfig.vue similarity index 57% rename from ui/src/pipeline/edit/PipelineAdapterConfig.vue rename to ui/src/pipeline/edit/adapter/PipelineAdapterConfig.vue index 69941a4dd..0bbbb1a03 100644 --- a/ui/src/pipeline/edit/PipelineAdapterConfig.vue +++ b/ui/src/pipeline/edit/adapter/PipelineAdapterConfig.vue @@ -22,6 +22,11 @@ :rules="[required]" @change="formChanged" /> + @@ -32,15 +37,19 @@ import Component from 'vue-class-component' import { Emit, PropSync } from 'vue-property-decorator' -import { AdapterConfig } from '../pipeline' +import { AdapterConfig } from '../../pipeline' +import PipelineCsvAdapterConfig from './PipelineCsvAdapterConfig.vue' -@Component({ }) +@Component({ + components: { PipelineCsvAdapterConfig } +}) export default class PipelineAdapterConfig extends Vue { private availableAdapterProtocols = ['HTTP'] - private availableAdapterFormats = ['JSON', 'XML'] + private availableAdapterFormats = ['JSON', 'XML', 'CSV'] private validForm: boolean = true; + private validFormatParameters: boolean = true; @PropSync('value') @@ -53,10 +62,22 @@ export default class PipelineAdapterConfig extends Vue { @Emit("validityChanged") emitValid() { - return this.validForm; + return this.validForm && this.validFormatParameters } formChanged() { + if(this.adapterConfig.format.type === 'CSV') { + this.adapterConfig.format.parameters = { + lineSeparator: ';', + columnSeparator: '\\n', + firstRowAsHeader: true, + skipFirstDataRow: false + } + } else { + this.adapterConfig.format.parameters = {} + this.validFormatParameters = true; + } + this.emitValue(); this.emitValid(); } diff --git a/ui/src/pipeline/edit/adapter/PipelineCsvAdapterConfig.vue b/ui/src/pipeline/edit/adapter/PipelineCsvAdapterConfig.vue new file mode 100644 index 000000000..79a2e8535 --- /dev/null +++ b/ui/src/pipeline/edit/adapter/PipelineCsvAdapterConfig.vue @@ -0,0 +1,77 @@ + + + + From de08d514ab3dd45db9ea07ce5c11df4b094f1281 Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Fri, 6 Dec 2019 15:11:06 +0100 Subject: [PATCH 0231/1168] Core: store generic adapter parameters as Object and not as String --- .../model/AdapterFormatConfig.java | 17 ++++----- .../model/AdapterProtocolConfig.java | 17 ++++----- .../repository/GenericParameterConverter.java | 38 +++++++++++++++++++ 3 files changed, 52 insertions(+), 20 deletions(-) create mode 100644 core/src/main/java/org/jvalue/ods/coreservice/repository/GenericParameterConverter.java diff --git a/core/src/main/java/org/jvalue/ods/coreservice/model/AdapterFormatConfig.java b/core/src/main/java/org/jvalue/ods/coreservice/model/AdapterFormatConfig.java index 8d1fae14b..45cc1615d 100644 --- a/core/src/main/java/org/jvalue/ods/coreservice/model/AdapterFormatConfig.java +++ b/core/src/main/java/org/jvalue/ods/coreservice/model/AdapterFormatConfig.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import org.jvalue.ods.coreservice.repository.GenericParameterConverter; import javax.persistence.*; import javax.validation.constraints.NotNull; @@ -17,20 +18,16 @@ public class AdapterFormatConfig { private String type; @NotNull - @ElementCollection - @CollectionTable(name = "adapter_format_parameter_mapping", - joinColumns = {@JoinColumn(name = "pipelineconfig_id", referencedColumnName = "id")}) - @MapKeyColumn(name = "parameter_name") - @Column(name = "value") - private Map parameters; + @Column(name = "format_parameters") + @Convert(converter = GenericParameterConverter.class) + private Map parameters; // Constructor for JPA - private AdapterFormatConfig() { - } + private AdapterFormatConfig() { } @JsonCreator public AdapterFormatConfig(@JsonProperty("type") String type, - @JsonProperty("parameters") Map parameters) { + @JsonProperty("parameters") Map parameters) { this.type = type; this.parameters = parameters; } @@ -39,7 +36,7 @@ public String getType() { return type; } - public Map getParameters() { + public Map getParameters() { return parameters; } diff --git a/core/src/main/java/org/jvalue/ods/coreservice/model/AdapterProtocolConfig.java b/core/src/main/java/org/jvalue/ods/coreservice/model/AdapterProtocolConfig.java index a48e47938..c7ab82e5a 100644 --- a/core/src/main/java/org/jvalue/ods/coreservice/model/AdapterProtocolConfig.java +++ b/core/src/main/java/org/jvalue/ods/coreservice/model/AdapterProtocolConfig.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import org.jvalue.ods.coreservice.repository.GenericParameterConverter; import javax.persistence.*; import javax.validation.constraints.NotNull; @@ -17,20 +18,16 @@ public class AdapterProtocolConfig { private String type; @NotNull - @ElementCollection - @CollectionTable(name = "adapter_protocol_parameter_mapping", - joinColumns = {@JoinColumn(name = "pipelineconfig_id", referencedColumnName = "id")}) - @MapKeyColumn(name = "parameter_name") - @Column(name = "value") - private Map parameters; + @Column(name = "protocol_parameters") + @Convert(converter = GenericParameterConverter.class) + private Map parameters; // Constructor for JPA - private AdapterProtocolConfig() { - } + private AdapterProtocolConfig() { } @JsonCreator public AdapterProtocolConfig(@JsonProperty("type") String type, - @JsonProperty("parameters") Map parameters) { + @JsonProperty("parameters") Map parameters) { this.type = type; this.parameters = parameters; } @@ -39,7 +36,7 @@ public String getType() { return type; } - public Map getParameters() { + public Map getParameters() { return parameters; } diff --git a/core/src/main/java/org/jvalue/ods/coreservice/repository/GenericParameterConverter.java b/core/src/main/java/org/jvalue/ods/coreservice/repository/GenericParameterConverter.java new file mode 100644 index 000000000..25318bbff --- /dev/null +++ b/core/src/main/java/org/jvalue/ods/coreservice/repository/GenericParameterConverter.java @@ -0,0 +1,38 @@ +package org.jvalue.ods.coreservice.repository; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.persistence.AttributeConverter; +import java.io.IOException; +import java.util.Map; + +public class GenericParameterConverter implements AttributeConverter, String> { + + private ObjectMapper objectMapper = new ObjectMapper(); + private final Logger logger = LoggerFactory.getLogger(GenericParameterConverter.class); + + @Override + public String convertToDatabaseColumn(Map parameters) { + String parametersJson = null; + try { + parametersJson = objectMapper.writeValueAsString(parameters); + } catch (final JsonProcessingException e) { + logger.error("JSON serialization error", e); + } + return parametersJson; + } + + @Override + public Map convertToEntityAttribute(String parametersJson) { + Map parameters = null; + try { + parameters = objectMapper.readValue(parametersJson, Map.class); + } catch (final IOException e) { + logger.error("JSON deserialization error", e); + } + return parameters; + } +} From f46cb81665e979772a8e6c5461a273ae7635f790 Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Fri, 6 Dec 2019 15:24:18 +0100 Subject: [PATCH 0232/1168] UI: refactor CSV adapter line separator to be a selection element --- .../edit/adapter/PipelineAdapterConfig.vue | 4 ++-- .../edit/adapter/PipelineCsvAdapterConfig.vue | 18 ++++++++++-------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/ui/src/pipeline/edit/adapter/PipelineAdapterConfig.vue b/ui/src/pipeline/edit/adapter/PipelineAdapterConfig.vue index 0bbbb1a03..e18bcf0b6 100644 --- a/ui/src/pipeline/edit/adapter/PipelineAdapterConfig.vue +++ b/ui/src/pipeline/edit/adapter/PipelineAdapterConfig.vue @@ -68,8 +68,8 @@ export default class PipelineAdapterConfig extends Vue { formChanged() { if(this.adapterConfig.format.type === 'CSV') { this.adapterConfig.format.parameters = { - lineSeparator: ';', - columnSeparator: '\\n', + lineSeparator: '\n', + columnSeparator: ';', firstRowAsHeader: true, skipFirstDataRow: false } diff --git a/ui/src/pipeline/edit/adapter/PipelineCsvAdapterConfig.vue b/ui/src/pipeline/edit/adapter/PipelineCsvAdapterConfig.vue index 79a2e8535..c42e61068 100644 --- a/ui/src/pipeline/edit/adapter/PipelineCsvAdapterConfig.vue +++ b/ui/src/pipeline/edit/adapter/PipelineCsvAdapterConfig.vue @@ -16,11 +16,12 @@ :rules="[required, validateColumnSeparator]" @keyup="formChanged" /> -
@@ -32,7 +33,7 @@ import Component from 'vue-class-component' import { Emit, PropSync } from 'vue-property-decorator' -class CsvConfig { +type CsvConfig = { lineSeparator: string; columnSeparator: string; firstRowAsHeader: boolean; @@ -43,6 +44,11 @@ class CsvConfig { export default class PipelineCsvAdapterConfig extends Vue { private validForm: boolean = true; + private availableLineSeparators = [ + { value: '\n', text: '\\n' }, + { value: '\r', text: '\\r' }, + { value: '\r\n', text: '\\r\\n' }, + ] @PropSync('value') private csvConfig!: CsvConfig; @@ -66,10 +72,6 @@ export default class PipelineCsvAdapterConfig extends Vue { return !!val || 'required.' } - private validateLineSeparator (val: string) { - return !!val && (val === '\n' || val === '\r' || val === '\r\n') - } - private validateColumnSeparator (val: string) { return !!val && val.length == 1 } From 0953d8e61b61c752831b2b1dc07339f64ddbd963 Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Fri, 6 Dec 2019 15:29:40 +0100 Subject: [PATCH 0233/1168] UI: add padding for adapter form format and protocol parameter --- ui/src/pipeline/edit/adapter/PipelineAdapterConfig.vue | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ui/src/pipeline/edit/adapter/PipelineAdapterConfig.vue b/ui/src/pipeline/edit/adapter/PipelineAdapterConfig.vue index e18bcf0b6..028515e71 100644 --- a/ui/src/pipeline/edit/adapter/PipelineAdapterConfig.vue +++ b/ui/src/pipeline/edit/adapter/PipelineAdapterConfig.vue @@ -12,6 +12,7 @@ @@ -26,6 +27,7 @@ v-if="adapterConfig.format.type === 'CSV'" v-model="adapterConfig.format.parameters" v-on:validityChanged="validFormatParameters = $event" + class="pl-7" /> From e2fb39e057901c3001bc591a2635e53bf4e2c5a5 Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Fri, 6 Dec 2019 15:36:07 +0100 Subject: [PATCH 0234/1168] Scheduler: set max limit of data to 10MiB --- scheduler/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scheduler/package.json b/scheduler/package.json index 2dfd1ce85..10ba2805a 100644 --- a/scheduler/package.json +++ b/scheduler/package.json @@ -5,8 +5,8 @@ "main": "dist/index.js", "scripts": { "test": "jest", - "start": "tsc && node --max-http-header-size 1000000 dist/index.js", - "start:transpiled": "node --max-http-header-size 1000000 dist/index.js", + "start": "tsc && node --max-http-header-size 10000000 dist/index.js", + "start:transpiled": "node --max-http-header-size 10000000 dist/index.js", "tsc": "tsc", "watch:node": "nodemon dist/src/index.js", "watch:ts": "tsc -w", From 1cbde8620b41aadd7bd9066821a8845c02a1ef1c Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Fri, 6 Dec 2019 15:56:33 +0100 Subject: [PATCH 0235/1168] CI: change image names to changes --- .gitlab-ci.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1aa1c3b73..5eca37d6b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -16,14 +16,14 @@ variables: # See further: https://docs.gitlab.com/ee/ci/docker/using_docker_build.html DOCKER_DRIVER: "overlay2" - ADAPTER_DOCKER_IMAGE_NAME: ${CI_REGISTRY_IMAGE}/adapter-service - AUTH_DOCKER_IMAGE_NAME: ${CI_REGISTRY_IMAGE}/auth-service - UI_DOCKER_IMAGE_NAME: ${CI_REGISTRY_IMAGE}/ui-service - SCHEDULER_DOCKER_IMAGE_NAME: ${CI_REGISTRY_IMAGE}/scheduler-service - STORAGE_POSTGREST_DOCKER_IMAGE_NAME: ${CI_REGISTRY_IMAGE}/storage-service-postgrest - STORAGE_LIQUIBASE_DOCKER_IMAGE_NAME: ${CI_REGISTRY_IMAGE}/storage-service-liquibase - TRANSFORMATION_DOCKER_IMAGE_NAME: ${CI_REGISTRY_IMAGE}/transformation-service - CORE_DOCKER_IMAGE_NAME: ${CI_REGISTRY_IMAGE}/core-service + ADAPTER_DOCKER_IMAGE_NAME: ${CI_REGISTRY_IMAGE}/adapter + AUTH_DOCKER_IMAGE_NAME: ${CI_REGISTRY_IMAGE}/auth + UI_DOCKER_IMAGE_NAME: ${CI_REGISTRY_IMAGE}/ui + SCHEDULER_DOCKER_IMAGE_NAME: ${CI_REGISTRY_IMAGE}/scheduler + STORAGE_POSTGREST_DOCKER_IMAGE_NAME: ${CI_REGISTRY_IMAGE}/storage + STORAGE_LIQUIBASE_DOCKER_IMAGE_NAME: ${CI_REGISTRY_IMAGE}/storage-db-liquibase + TRANSFORMATION_DOCKER_IMAGE_NAME: ${CI_REGISTRY_IMAGE}/transformation + CORE_DOCKER_IMAGE_NAME: ${CI_REGISTRY_IMAGE}/core From a6de21186f0bb74fb5352fdedf41dcaa550f719d Mon Sep 17 00:00:00 2001 From: Andreas Bauer Date: Fri, 6 Dec 2019 18:22:46 +0100 Subject: [PATCH 0236/1168] adapter: Use npm ci integreation tests --- adapter/integration-test/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adapter/integration-test/Dockerfile b/adapter/integration-test/Dockerfile index 02933bdac..541d53041 100644 --- a/adapter/integration-test/Dockerfile +++ b/adapter/integration-test/Dockerfile @@ -1,7 +1,7 @@ FROM node:12-alpine COPY . . -RUN npm install +RUN npm ci EXPOSE 8080 From e209d05ee750f3b5621ed392ce19c7983690a70d Mon Sep 17 00:00:00 2001 From: Andreas Bauer Date: Fri, 6 Dec 2019 18:23:35 +0100 Subject: [PATCH 0237/1168] core: Use npm ci in integration-test Dockerfile --- core/integration-test/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/integration-test/Dockerfile b/core/integration-test/Dockerfile index 02933bdac..541d53041 100644 --- a/core/integration-test/Dockerfile +++ b/core/integration-test/Dockerfile @@ -1,7 +1,7 @@ FROM node:12-alpine COPY . . -RUN npm install +RUN npm ci EXPOSE 8080 From 8ad76beafaa4920b0a0c06b37078b4dfa64d4c76 Mon Sep 17 00:00:00 2001 From: Andreas Bauer Date: Fri, 6 Dec 2019 18:25:09 +0100 Subject: [PATCH 0238/1168] scheduler: Use npm ci in integration-test Dockerfile --- scheduler/integration-test/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scheduler/integration-test/Dockerfile b/scheduler/integration-test/Dockerfile index dd7a03706..e7f406cba 100644 --- a/scheduler/integration-test/Dockerfile +++ b/scheduler/integration-test/Dockerfile @@ -2,7 +2,7 @@ FROM node:lts-alpine as builder COPY ./src ./src COPY ./package*.json ./ -RUN npm install +RUN npm ci EXPOSE 8080 From 0c3323c787225a8f8987e7c99e040a94bef1736a Mon Sep 17 00:00:00 2001 From: Andreas Bauer Date: Fri, 6 Dec 2019 18:26:04 +0100 Subject: [PATCH 0239/1168] scheduler: Use npm ci in Dockerfile --- scheduler/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scheduler/Dockerfile b/scheduler/Dockerfile index ac7bcfd82..0fe8ac43a 100644 --- a/scheduler/Dockerfile +++ b/scheduler/Dockerfile @@ -8,7 +8,7 @@ COPY ./tsconfig.json ./ COPY ./jest.config.js ./ # Install dependencies and run build -RUN npm install +RUN npm ci RUN npm run tsc RUN npm run test @@ -21,7 +21,7 @@ WORKDIR /app COPY --from=builder /build/dist/ ./dist/ COPY --from=builder /build/package*.json ./ -RUN npm install --only=production +RUN npm ci --only=production EXPOSE 8080 CMD [ "npm", "run", "start:transpiled" ] From 7a1b679ce7acb818d9fc99b4e2a80ea9bad9b597 Mon Sep 17 00:00:00 2001 From: Andreas Bauer Date: Fri, 6 Dec 2019 18:27:04 +0100 Subject: [PATCH 0240/1168] storage: Use npm ci in integration-test Dockerfile --- storage/integration-test/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storage/integration-test/Dockerfile b/storage/integration-test/Dockerfile index 02933bdac..541d53041 100644 --- a/storage/integration-test/Dockerfile +++ b/storage/integration-test/Dockerfile @@ -1,7 +1,7 @@ FROM node:12-alpine COPY . . -RUN npm install +RUN npm ci EXPOSE 8080 From 15413b5a82464acf1b6c3a5d60aefaf85c1ee9cd Mon Sep 17 00:00:00 2001 From: Andreas Bauer Date: Fri, 6 Dec 2019 18:27:38 +0100 Subject: [PATCH 0241/1168] system-test: Use npm ci in Dockerfile --- system-test/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system-test/Dockerfile b/system-test/Dockerfile index d1bb92838..5cc759059 100644 --- a/system-test/Dockerfile +++ b/system-test/Dockerfile @@ -2,7 +2,7 @@ FROM node:lts-alpine COPY ./src ./src COPY ./package*.json ./ -RUN npm install +RUN npm ci EXPOSE 8080 From 0bdeac00b0171f71a9f3d4b77e725f6e5239d560 Mon Sep 17 00:00:00 2001 From: Andreas Bauer Date: Fri, 6 Dec 2019 18:28:12 +0100 Subject: [PATCH 0242/1168] transformation: Use npm ci in integration-test Dockerfile --- transformation/integration-test/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/transformation/integration-test/Dockerfile b/transformation/integration-test/Dockerfile index dd7a03706..e7f406cba 100644 --- a/transformation/integration-test/Dockerfile +++ b/transformation/integration-test/Dockerfile @@ -2,7 +2,7 @@ FROM node:lts-alpine as builder COPY ./src ./src COPY ./package*.json ./ -RUN npm install +RUN npm ci EXPOSE 8080 From 3edfa1eea983e8387deaf126489b119dc48ca0b8 Mon Sep 17 00:00:00 2001 From: Andreas Bauer Date: Fri, 6 Dec 2019 18:29:19 +0100 Subject: [PATCH 0243/1168] transformation: Use npm ci in Dockerfile --- transformation/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/transformation/Dockerfile b/transformation/Dockerfile index 9e8a192e3..cfb57ff6e 100644 --- a/transformation/Dockerfile +++ b/transformation/Dockerfile @@ -8,7 +8,7 @@ COPY ./tsconfig.json ./ COPY ./jest.config.js ./ # Install dependencies and run build -RUN npm install +RUN npm ci RUN npm run tsc RUN npm run test @@ -22,7 +22,7 @@ COPY --from=builder /build/dist/ ./dist/ COPY --from=builder /build/package*.json ./ COPY ./keycloak.json ./ -RUN npm install --only=production +RUN npm ci --only=production EXPOSE 8080 CMD [ "npm", "run", "start:transpiled" ] From 89522dfc86a44e09ba1981a4af9a8f2134ccb43e Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Mon, 9 Dec 2019 09:55:10 +0100 Subject: [PATCH 0244/1168] UI: fix CSV config reset --- .../edit/adapter/PipelineAdapterConfig.vue | 33 +++++++++++-------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/ui/src/pipeline/edit/adapter/PipelineAdapterConfig.vue b/ui/src/pipeline/edit/adapter/PipelineAdapterConfig.vue index 028515e71..b2cdd3084 100644 --- a/ui/src/pipeline/edit/adapter/PipelineAdapterConfig.vue +++ b/ui/src/pipeline/edit/adapter/PipelineAdapterConfig.vue @@ -37,7 +37,7 @@ import Vue from 'vue' import Component from 'vue-class-component' -import { Emit, PropSync } from 'vue-property-decorator' +import { Emit, PropSync, Watch } from 'vue-property-decorator' import { AdapterConfig } from '../../pipeline' import PipelineCsvAdapterConfig from './PipelineCsvAdapterConfig.vue' @@ -62,24 +62,31 @@ export default class PipelineAdapterConfig extends Vue { return this.adapterConfig; } + @Watch("adapterConfig.format.type") + private formatChanged(val: string) { + switch (val) { + case 'CSV': { + this.adapterConfig.format.parameters = { + lineSeparator: '\n', + columnSeparator: ';', + firstRowAsHeader: true, + skipFirstDataRow: false + } + break + } case 'JSON' || 'XML': { + this.adapterConfig.format.parameters = {} + this.validFormatParameters = true; + break + } + } + } + @Emit("validityChanged") emitValid() { return this.validForm && this.validFormatParameters } formChanged() { - if(this.adapterConfig.format.type === 'CSV') { - this.adapterConfig.format.parameters = { - lineSeparator: '\n', - columnSeparator: ';', - firstRowAsHeader: true, - skipFirstDataRow: false - } - } else { - this.adapterConfig.format.parameters = {} - this.validFormatParameters = true; - } - this.emitValue(); this.emitValid(); } From 7859791d786cb343bd6218da89038d49d4f81fec Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Mon, 9 Dec 2019 13:00:34 +0100 Subject: [PATCH 0245/1168] Documentation: use better CSV example --- doc/example-requests/adapter.http | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/example-requests/adapter.http b/doc/example-requests/adapter.http index 79525989e..c4346b834 100644 --- a/doc/example-requests/adapter.http +++ b/doc/example-requests/adapter.http @@ -25,7 +25,7 @@ Content-Type: application/json "protocol": { "type": "HTTP", "parameters": { - "location": "https://www.bka.de/SharedDocs/Downloads/DE/Publikationen/PolizeilicheKriminalstatistik/2018/BKATabellen/FaelleLaenderKreiseStaedte/BKA-LKS-F-03-T01-Kreise_csv.csv?__blob=publicationFile&v=3" + "location": "http://daten.transparenz.hamburg.de/Dataport.HmbTG.ZS.Webservice.GetRessource100/GetRessource100.svc/10dfeb66-e756-4322-bf22-0535b6ef1bdd/Indikatorpflanzen__Gras.csv" } }, "format": { From 506878b4f6a0f4795956944a88313a995000b04b Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Tue, 10 Dec 2019 09:53:55 +0100 Subject: [PATCH 0246/1168] adapter: Update documentation --- .../ods/adapterservice/interpreter/CsvInterpreterTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/adapter/src/test/java/org/jvalue/ods/adapterservice/interpreter/CsvInterpreterTest.java b/adapter/src/test/java/org/jvalue/ods/adapterservice/interpreter/CsvInterpreterTest.java index c424dae52..6e57b16f8 100644 --- a/adapter/src/test/java/org/jvalue/ods/adapterservice/interpreter/CsvInterpreterTest.java +++ b/adapter/src/test/java/org/jvalue/ods/adapterservice/interpreter/CsvInterpreterTest.java @@ -150,8 +150,8 @@ public void interpretInvalidLineSeparator() throws IOException { @Test(expected = IllegalArgumentException.class) public void interpretInvalidColumnSeparator() throws IOException { interpreter.interpret(CSV_STRING, Map.of( - "columnSeparator", ",asd", - "lineSeparator", "\n", // only \n, \r, or \r\n + "columnSeparator", ",asd", // only one char + "lineSeparator", "\n", "skipFirstDataRow", false, "firstRowAsHeader", false )); From 08623bef58a5b145bae6d68c296ddc1ec3446fca Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Tue, 10 Dec 2019 10:38:42 +0100 Subject: [PATCH 0247/1168] core: Test notification persistence in integration test --- core/integration-test/src/core.test.js | 31 ++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/core/integration-test/src/core.test.js b/core/integration-test/src/core.test.js index 6248d6409..3554e3d98 100644 --- a/core/integration-test/src/core.test.js +++ b/core/integration-test/src/core.test.js @@ -47,6 +47,14 @@ describe("Core", () => { expect(response.body.id).toBeDefined(); expect(response.body.id).not.toEqual(pipelineConfig.id); // id not under control of client + //Check if notifications were stored correctly + expect(response.body.notifications).toHaveLength(pipelineConfig.notifications.length) + pipelineConfig.notifications.forEach(n => { + expect(response.body.notifications).toEqual( + expect.arrayContaining([ + expect.objectContaining(n)])) + }) + const delResponse = await request(URL) .delete("/pipelines/" + response.body.id) .send(); @@ -224,7 +232,7 @@ describe("Core", () => { .get('/pipelines/' + pipelineId) .send(); - expect(pipelineResponse.body.notifications.length).toEqual(2); + expect(pipelineResponse.body.notifications.length).toEqual(4); //clean up await request(URL) @@ -261,7 +269,7 @@ describe("Core", () => { .get('/pipelines/' + pipelineId) .send(); - expect(pipelineResponse.body.notifications.length).toEqual(0); + expect(pipelineResponse.body.notifications.length).toEqual(2); //clean up await request(URL) @@ -313,6 +321,25 @@ const pipelineConfig = { "type": "WEBHOOK", "url": "http://www.webhookland.com" } + }, + { + "condition": "false", + "params": { + "type": "SLACK", + "workspaceId": "123", + "channelId": "456", + "secret": "789" + }, + }, + { + "condition": "1 === 2", + "params": { + "type": "FCM", + "projectId": "nebelalarm", + "clientEmail": "client@mail.yeah", + "privateKey": "verylongverysecretkey", + "topic": "interestingstuff" + } } ] }; From a66843e40b5fd3c87d5fbd312a20cc974f91af2d Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Tue, 10 Dec 2019 15:06:00 +0100 Subject: [PATCH 0248/1168] core: Fix error in readme --- core/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/README.md b/core/README.md index e532e9a47..cb4402d7e 100644 --- a/core/README.md +++ b/core/README.md @@ -101,6 +101,7 @@ Note that you need to delete existing docker images from your local docker daemo ### WebhookParams ``` { + "type": "WEBHOOK", "url": String (the url of the webhook you want to be triggered) } ``` @@ -108,6 +109,7 @@ Note that you need to delete existing docker images from your local docker daemo ### SlackParams ``` { + "type": "SLACK", "workspaceId": String (id of your slack workspace), "channelId": String (id of the channel where the notification is to be posted), "secret": String (secret part of the slack webhook, get it at slack management console) @@ -117,6 +119,7 @@ Note that you need to delete existing docker images from your local docker daemo ### FirebaseParams ``` { + "type": "FCM", "projectId": String (id of your firebase project), "clientEmail": String (email of the firebase service account), "privateKey: String (secret key associated with the service account), From 875d0e4da48e7c0d8674d7ff2ee8e3bbbee3beda Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Fri, 13 Dec 2019 09:41:01 +0100 Subject: [PATCH 0249/1168] Adapter: update spring boot plugin version --- adapter/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adapter/build.gradle b/adapter/build.gradle index 2fa59581f..02a9a94cc 100644 --- a/adapter/build.gradle +++ b/adapter/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'org.springframework.boot' version '2.2.0.M5' + id 'org.springframework.boot' version '2.2.2.RELEASE' id 'java' } From 696d5253848c83ca5663a8ce8d70026f21e546ce Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Fri, 13 Dec 2019 09:46:11 +0100 Subject: [PATCH 0250/1168] Adapter: gradle wrapper upgrade --- adapter/gradle/wrapper/gradle-wrapper.jar | Bin 55190 -> 55616 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- adapter/gradlew | 22 +++++++++++++++--- adapter/gradlew.bat | 18 +++++++++++++- 4 files changed, 37 insertions(+), 5 deletions(-) diff --git a/adapter/gradle/wrapper/gradle-wrapper.jar b/adapter/gradle/wrapper/gradle-wrapper.jar index 87b738cbd051603d91cc39de6cb000dd98fe6b02..5c2d1cf016b3885f6930543d57b744ea8c220a1a 100644 GIT binary patch delta 3320 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 Date: Fri, 13 Dec 2019 09:53:04 +0100 Subject: [PATCH 0251/1168] Adapter: upgrade integration-test libraries --- adapter/integration-test/package-lock.json | 1582 +++++++++----------- adapter/integration-test/package.json | 10 +- 2 files changed, 742 insertions(+), 850 deletions(-) diff --git a/adapter/integration-test/package-lock.json b/adapter/integration-test/package-lock.json index de5dbc1ab..e2159cac3 100644 --- a/adapter/integration-test/package-lock.json +++ b/adapter/integration-test/package-lock.json @@ -1,35 +1,35 @@ { - "name": "integrationtest", + "name": "adapter-it", "version": "1.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", "dev": true, "requires": { "@babel/highlight": "^7.0.0" } }, "@babel/core": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.5.tgz", - "integrity": "sha512-OvjIh6aqXtlsA8ujtGKfC7LYWksYSX8yQcM8Ay3LuvVeQ63lcOKgoZWVqcpFwkd29aYU9rVx7jxhfhiEDV9MZA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.4", - "@babel/helpers": "^7.4.4", - "@babel/parser": "^7.4.5", - "@babel/template": "^7.4.4", - "@babel/traverse": "^7.4.5", - "@babel/types": "^7.4.4", - "convert-source-map": "^1.1.0", + "version": "7.7.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.7.5.tgz", + "integrity": "sha512-M42+ScN4+1S9iB6f+TL7QBpoQETxbclx+KNoKJABghnKYE+fMzSGqst0BZJc8CpI625bwPwYgUyRvxZ+0mZzpw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.7.4", + "@babel/helpers": "^7.7.4", + "@babel/parser": "^7.7.5", + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4", + "convert-source-map": "^1.7.0", "debug": "^4.1.0", "json5": "^2.1.0", - "lodash": "^4.17.11", + "lodash": "^4.17.13", "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" @@ -59,16 +59,15 @@ } }, "@babel/generator": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", - "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.4.tgz", + "integrity": "sha512-m5qo2WgdOJeyYngKImbkyQrnUN1mPceaG5BV+G0E3gWsa4l/jCSryWJdM2x8OuGAOyh+3d5pVYfZWCiNFtynxg==", "dev": true, "requires": { - "@babel/types": "^7.4.4", + "@babel/types": "^7.7.4", "jsesc": "^2.5.1", - "lodash": "^4.17.11", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" + "lodash": "^4.17.13", + "source-map": "^0.5.0" }, "dependencies": { "source-map": { @@ -80,23 +79,23 @@ } }, "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", + "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/helper-get-function-arity": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4" } }, "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", + "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", "dev": true, "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.7.4" } }, "@babel/helper-plugin-utils": { @@ -106,29 +105,29 @@ "dev": true }, "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", + "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", "dev": true, "requires": { - "@babel/types": "^7.4.4" + "@babel/types": "^7.7.4" } }, "@babel/helpers": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.4.4.tgz", - "integrity": "sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.7.4.tgz", + "integrity": "sha512-ak5NGZGJ6LV85Q1Zc9gn2n+ayXOizryhjSUBTdu5ih1tlVCJeuQENzc4ItyCVhINVXvIT/ZQ4mheGIsfBkpskg==", "dev": true, "requires": { - "@babel/template": "^7.4.4", - "@babel/traverse": "^7.4.4", - "@babel/types": "^7.4.4" + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4" } }, "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", "dev": true, "requires": { "chalk": "^2.0.0", @@ -137,46 +136,46 @@ } }, "@babel/parser": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", - "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==", + "version": "7.7.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.5.tgz", + "integrity": "sha512-KNlOe9+/nk4i29g0VXgl8PEXIRms5xKLJeuZ6UptN0fHv+jDiriG+y94X6qAgWTR0h3KaoM1wK5G5h7MHFRSig==", "dev": true }, "@babel/plugin-syntax-object-rest-spread": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", - "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.7.4.tgz", + "integrity": "sha512-mObR+r+KZq0XhRVS2BrBKBpr5jqrqzlPvS9C9vuOf5ilSwzloAl7RPWLrgKdWS6IreaVrjHxTjtyqFiOisaCwg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", - "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", + "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4" + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4" } }, "@babel/traverse": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz", - "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz", + "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.4", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.4.5", - "@babel/types": "^7.4.4", + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.7.4", + "@babel/helper-function-name": "^7.7.4", + "@babel/helper-split-export-declaration": "^7.7.4", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4", "debug": "^4.1.0", "globals": "^11.1.0", - "lodash": "^4.17.11" + "lodash": "^4.17.13" }, "dependencies": { "debug": { @@ -197,13 +196,13 @@ } }, "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", "dev": true, "requires": { "esutils": "^2.0.2", - "lodash": "^4.17.11", + "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } }, @@ -217,85 +216,120 @@ "minimist": "^1.2.0" } }, + "@hapi/address": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", + "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==" + }, + "@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==" + }, + "@hapi/hoek": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.0.tgz", + "integrity": "sha512-7XYT10CZfPsH7j9F1Jmg1+d0ezOux2oM2GfArAzLwWe4mE2Dr3hVjsAL6+TFY49RRJlCdJDMw3nJsLFroTc8Kw==" + }, + "@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==", + "requires": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "requires": { + "@hapi/hoek": "^8.3.0" + } + }, "@jest/console": { - "version": "24.7.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.7.1.tgz", - "integrity": "sha512-iNhtIy2M8bXlAOULWVTUxmnelTLFneTNEkHCgPmgd+zNwy9zVddJ6oS5rZ9iwoscNdT5mMwUd0C51v/fSlzItg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", "dev": true, "requires": { - "@jest/source-map": "^24.3.0", + "@jest/source-map": "^24.9.0", "chalk": "^2.0.1", "slash": "^2.0.0" } }, "@jest/core": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.8.0.tgz", - "integrity": "sha512-R9rhAJwCBQzaRnrRgAdVfnglUuATXdwTRsYqs6NMdVcAl5euG8LtWDe+fVkN27YfKVBW61IojVsXKaOmSnqd/A==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", + "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", "dev": true, "requires": { "@jest/console": "^24.7.1", - "@jest/reporters": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/reporters": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", "ansi-escapes": "^3.0.0", "chalk": "^2.0.1", "exit": "^0.1.2", "graceful-fs": "^4.1.15", - "jest-changed-files": "^24.8.0", - "jest-config": "^24.8.0", - "jest-haste-map": "^24.8.0", - "jest-message-util": "^24.8.0", + "jest-changed-files": "^24.9.0", + "jest-config": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-message-util": "^24.9.0", "jest-regex-util": "^24.3.0", - "jest-resolve-dependencies": "^24.8.0", - "jest-runner": "^24.8.0", - "jest-runtime": "^24.8.0", - "jest-snapshot": "^24.8.0", - "jest-util": "^24.8.0", - "jest-validate": "^24.8.0", - "jest-watcher": "^24.8.0", + "jest-resolve": "^24.9.0", + "jest-resolve-dependencies": "^24.9.0", + "jest-runner": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "jest-watcher": "^24.9.0", "micromatch": "^3.1.10", "p-each-series": "^1.0.0", - "pirates": "^4.0.1", "realpath-native": "^1.1.0", "rimraf": "^2.5.4", + "slash": "^2.0.0", "strip-ansi": "^5.0.0" } }, "@jest/environment": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.8.0.tgz", - "integrity": "sha512-vlGt2HLg7qM+vtBrSkjDxk9K0YtRBi7HfRFaDxoRtyi+DyVChzhF20duvpdAnKVBV6W5tym8jm0U9EfXbDk1tw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", + "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", "dev": true, "requires": { - "@jest/fake-timers": "^24.8.0", - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", - "jest-mock": "^24.8.0" + "@jest/fake-timers": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0" } }, "@jest/fake-timers": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.8.0.tgz", - "integrity": "sha512-2M4d5MufVXwi6VzZhJ9f5S/wU4ud2ck0kxPof1Iz3zWx6Y+V2eJrES9jEktB6O3o/oEyk+il/uNu9PvASjWXQw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", + "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", "dev": true, "requires": { - "@jest/types": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-mock": "^24.8.0" + "@jest/types": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0" } }, "@jest/reporters": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.8.0.tgz", - "integrity": "sha512-eZ9TyUYpyIIXfYCrw0UHUWUvE35vx5I92HGMgS93Pv7du+GHIzl+/vh8Qj9MCWFK/4TqyttVBPakWMOfZRIfxw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", + "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", "dev": true, "requires": { - "@jest/environment": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", "exit": "^0.1.2", "glob": "^7.1.2", @@ -303,22 +337,22 @@ "istanbul-lib-instrument": "^3.0.1", "istanbul-lib-report": "^2.0.4", "istanbul-lib-source-maps": "^3.0.1", - "istanbul-reports": "^2.1.1", - "jest-haste-map": "^24.8.0", - "jest-resolve": "^24.8.0", - "jest-runtime": "^24.8.0", - "jest-util": "^24.8.0", + "istanbul-reports": "^2.2.6", + "jest-haste-map": "^24.9.0", + "jest-resolve": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-util": "^24.9.0", "jest-worker": "^24.6.0", - "node-notifier": "^5.2.1", + "node-notifier": "^5.4.2", "slash": "^2.0.0", "source-map": "^0.6.0", "string-length": "^2.0.0" } }, "@jest/source-map": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.3.0.tgz", - "integrity": "sha512-zALZt1t2ou8le/crCeeiRYzvdnTzaIlpOWaet45lNSqNJUnXbppUUFR4ZUAlzgDmKee4Q5P/tKXypI1RiHwgag==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", "dev": true, "requires": { "callsites": "^3.0.0", @@ -327,45 +361,46 @@ } }, "@jest/test-result": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.8.0.tgz", - "integrity": "sha512-+YdLlxwizlfqkFDh7Mc7ONPQAhA4YylU1s529vVM1rsf67vGZH/2GGm5uO8QzPeVyaVMobCQ7FTxl38QrKRlng==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", "dev": true, "requires": { - "@jest/console": "^24.7.1", - "@jest/types": "^24.8.0", + "@jest/console": "^24.9.0", + "@jest/types": "^24.9.0", "@types/istanbul-lib-coverage": "^2.0.0" } }, "@jest/test-sequencer": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.8.0.tgz", - "integrity": "sha512-OzL/2yHyPdCHXEzhoBuq37CE99nkme15eHkAzXRVqthreWZamEMA0WoetwstsQBCXABhczpK03JNbc4L01vvLg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", + "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", "dev": true, "requires": { - "@jest/test-result": "^24.8.0", - "jest-haste-map": "^24.8.0", - "jest-runner": "^24.8.0", - "jest-runtime": "^24.8.0" + "@jest/test-result": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-runner": "^24.9.0", + "jest-runtime": "^24.9.0" } }, "@jest/transform": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.8.0.tgz", - "integrity": "sha512-xBMfFUP7TortCs0O+Xtez2W7Zu1PLH9bvJgtraN1CDST6LBM/eTOZ9SfwS/lvV8yOfcDpFmwf9bq5cYbXvqsvA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", + "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "babel-plugin-istanbul": "^5.1.0", "chalk": "^2.0.1", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.8.0", - "jest-regex-util": "^24.3.0", - "jest-util": "^24.8.0", + "jest-haste-map": "^24.9.0", + "jest-regex-util": "^24.9.0", + "jest-util": "^24.9.0", "micromatch": "^3.1.10", + "pirates": "^4.0.1", "realpath-native": "^1.1.0", "slash": "^2.0.0", "source-map": "^0.6.1", @@ -373,20 +408,20 @@ } }, "@jest/types": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.8.0.tgz", - "integrity": "sha512-g17UxVr2YfBtaMUxn9u/4+siG1ptg9IGYAYwvpwn61nBg779RXnjE/m7CxYcIzEt0AbHZZAHSEZNhkE2WxURVg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^12.0.9" + "@types/yargs": "^13.0.0" } }, "@types/babel__core": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.2.tgz", - "integrity": "sha512-cfCCrFmiGY/yq0NuKNxIQvZFy9kY/1immpSpTngOnyIbD4+eJOG5mxphhHDv3CHL9GltO4GcKr54kGBg3RNdbg==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.3.tgz", + "integrity": "sha512-8fBo0UR2CcwWxeX7WIIgJ7lXjasFxoYgRnFHUj+hRvKkpiBJbxhdAPTCY6/ZKM0uxANFVzt4yObSLuTiTnazDA==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -397,9 +432,9 @@ } }, "@types/babel__generator": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.0.2.tgz", - "integrity": "sha512-NHcOfab3Zw4q5sEE2COkpfXjoE7o+PmqD9DQW4koUT3roNxwziUdXGnRndMat/LJNUtePwn1TlP4do3uoe3KZQ==", + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", + "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", "dev": true, "requires": { "@babel/types": "^7.0.0" @@ -416,9 +451,9 @@ } }, "@types/babel__traverse": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.7.tgz", - "integrity": "sha512-CeBpmX1J8kWLcDEnI3Cl2Eo6RfbGvzUctA+CjZUhOKDFbLfcr7fc4usEqLNWetrlJd7RhAkyYe2czXop4fICpw==", + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.8.tgz", + "integrity": "sha512-yGeB2dHEdvxjP0y4UbRtQaSkXJ9649fYCmIdRoul5kfAoGCwxuCbMhag0k3RPfnuh9kPGm8x89btcfDEXdVWGw==", "dev": true, "requires": { "@babel/types": "^7.3.0" @@ -456,15 +491,24 @@ "dev": true }, "@types/yargs": { - "version": "12.0.12", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-12.0.12.tgz", - "integrity": "sha512-SOhuU4wNBxhhTHxYaiG5NY4HBhDIDnJF60GU+2LqHAdKKer86//e4yg69aENCtQ04n0ovz+tq2YPME5t5yp4pw==", + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.3.tgz", + "integrity": "sha512-K8/LfZq2duW33XW/tFwEAfnZlqIfVsoyRB3kfXdPXYhl0nfM8mmh7GS0jg7WrX2Dgq/0Ha/pR1PaR+BvmWwjiQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-13.1.0.tgz", + "integrity": "sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg==", "dev": true }, "abab": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", - "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", + "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", "dev": true }, "accepts": { @@ -483,9 +527,9 @@ "dev": true }, "acorn-globals": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.2.tgz", - "integrity": "sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", "dev": true, "requires": { "acorn": "^6.0.1", @@ -493,23 +537,23 @@ }, "dependencies": { "acorn": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", - "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", + "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==", "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": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", "dev": true }, "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", "requires": { "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", @@ -609,9 +653,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": { @@ -631,53 +675,54 @@ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" }, "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.0.tgz", + "integrity": "sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A==" }, "babel-jest": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.8.0.tgz", - "integrity": "sha512-+5/kaZt4I9efoXzPlZASyK/lN9qdRKmmUav9smVc0ruPQD7IsfucQ87gpOE8mn2jbDuS6M/YOW6n3v9ZoIfgnw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", + "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", "dev": true, "requires": { - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", "@types/babel__core": "^7.1.0", "babel-plugin-istanbul": "^5.1.0", - "babel-preset-jest": "^24.6.0", + "babel-preset-jest": "^24.9.0", "chalk": "^2.4.2", "slash": "^2.0.0" } }, "babel-plugin-istanbul": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.4.tgz", - "integrity": "sha512-dySz4VJMH+dpndj0wjJ8JPs/7i1TdSPb1nRrn56/92pKOF9VKC1FMFJmMXjzlGGusnCAqujP6PBCiKq0sVA+YQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", + "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", "dev": true, "requires": { + "@babel/helper-plugin-utils": "^7.0.0", "find-up": "^3.0.0", "istanbul-lib-instrument": "^3.3.0", "test-exclude": "^5.2.3" } }, "babel-plugin-jest-hoist": { - "version": "24.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.6.0.tgz", - "integrity": "sha512-3pKNH6hMt9SbOv0F3WVmy5CWQ4uogS3k0GY5XLyQHJ9EGpAT9XWkFd2ZiXXtkwFHdAHa5j7w7kfxSP5lAIwu7w==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", + "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", "dev": true, "requires": { "@types/babel__traverse": "^7.0.6" } }, "babel-preset-jest": { - "version": "24.6.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.6.0.tgz", - "integrity": "sha512-pdZqLEdmy1ZK5kyRUfvBb2IfTPb2BUvIJczlPspS8fWmBQslNNDBqVfh7BW5leOVJMDZKzjD8XEyABTk6gQ5yw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", + "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", "dev": true, "requires": { "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^24.6.0" + "babel-plugin-jest-hoist": "^24.9.0" } }, "balanced-match": { @@ -812,9 +857,9 @@ } }, "bser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", - "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", + "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" @@ -919,31 +964,14 @@ } }, "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" } }, "co": { @@ -951,12 +979,6 @@ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -991,9 +1013,9 @@ } }, "commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "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, "optional": true }, @@ -1023,9 +1045,9 @@ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "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" @@ -1038,12 +1060,19 @@ "dev": true }, "cookies": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.7.3.tgz", - "integrity": "sha512-+gixgxYSgQLTaTIilDHAdlNPZDENDQernEMiIcZpYYP14zgHsCt4Ce1FEjFtcp6GefhozebB6orvhAAWx/IS0A==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", + "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", "requires": { - "depd": "~1.1.2", - "keygrip": "~1.0.3" + "depd": "~2.0.0", + "keygrip": "~1.1.0" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + } } }, "copy-descriptor": { @@ -1053,9 +1082,9 @@ "dev": true }, "core-js": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", - "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==" + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" }, "core-util-is": { "version": "1.0.2", @@ -1076,15 +1105,15 @@ } }, "cssom": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.6.tgz", - "integrity": "sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", "dev": true }, "cssstyle": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.2.2.tgz", - "integrity": "sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", + "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", "dev": true, "requires": { "cssom": "0.3.x" @@ -1110,9 +1139,9 @@ }, "dependencies": { "whatwg-url": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", - "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", "dev": true, "requires": { "lodash.sortby": "^4.7.0", @@ -1231,9 +1260,9 @@ "dev": true }, "diff-sequences": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.3.0.tgz", - "integrity": "sha512-xLqpez+Zj9GKSnPWS0WZw1igGocZ+uua8+y+5dDNTT934N3QuY1sp2LkHzwiaYQGz60hMq0pjAshdeXm5VUOEw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", + "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", "dev": true }, "domexception": { @@ -1259,10 +1288,21 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, + "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 + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, "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==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, "requires": { "once": "^1.4.0" @@ -1283,23 +1323,28 @@ "integrity": "sha1-4rPZG1Su1nLzCdlQ0VSFD6EdTzc=" }, "es-abstract": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", - "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "version": "1.17.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0-next.1.tgz", + "integrity": "sha512-7MmGr03N7Rnuid6+wyhD9sHNE2n4tFSwExnU2lQl3lIo2ShXWGePY80zYaoMOmILWv57H0amMjZGHNzzGG70Rw==", "dev": true, "requires": { - "es-to-primitive": "^1.2.0", + "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", + "has-symbols": "^1.0.1", "is-callable": "^1.1.4", "is-regex": "^1.0.4", - "object-keys": "^1.0.12" + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.0", + "string.prototype.trimright": "^2.1.0" } }, "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "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", @@ -1319,9 +1364,9 @@ "dev": true }, "escodegen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", - "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz", + "integrity": "sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==", "dev": true, "requires": { "esprima": "^3.1.3", @@ -1338,21 +1383,21 @@ "dev": true }, "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, "exec-sh": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.2.tgz", - "integrity": "sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", + "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", "dev": true }, "execa": { @@ -1412,17 +1457,17 @@ } }, "expect": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-24.8.0.tgz", - "integrity": "sha512-/zYvP8iMDrzaaxHVa724eJBCKqSHmO0FA7EDkBiRHxg6OipmMn1fN+C8T9L9K8yr7UONkOifu6+LLH+z76CnaA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", + "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", "dev": true, "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "ansi-styles": "^3.2.0", - "jest-get-type": "^24.8.0", - "jest-matcher-utils": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-regex-util": "^24.3.0" + "jest-get-type": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-regex-util": "^24.9.0" } }, "extend": { @@ -1538,12 +1583,12 @@ "dev": true }, "fb-watchman": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", - "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", + "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.0.0" + "bser": "2.1.1" } }, "fill-range": { @@ -2180,9 +2225,9 @@ "dev": true }, "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, "get-stream": { @@ -2209,9 +2254,9 @@ } }, "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "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", @@ -2229,9 +2274,9 @@ "dev": true }, "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", "dev": true }, "growly": { @@ -2241,9 +2286,9 @@ "dev": true }, "handlebars": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", - "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.3.tgz", + "integrity": "sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA==", "dev": true, "requires": { "neo-async": "^2.6.0", @@ -2282,9 +2327,9 @@ "dev": true }, "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "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 }, "has-value": { @@ -2319,15 +2364,10 @@ } } }, - "hoek": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-5.0.4.tgz", - "integrity": "sha512-Alr4ZQgoMlnere5FZJsIyfIjORBqZll5POhDsF4q64dPuJR6rNxXdDxtHSQq8OXRurhmx+PWYEE8bXRROY8h0w==" - }, "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", + "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==", "dev": true }, "html-encoding-sniffer": { @@ -2419,12 +2459,6 @@ "loose-envify": "^1.0.0" } }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", @@ -2585,12 +2619,12 @@ "dev": true }, "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "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": { - "has-symbols": "^1.0.0" + "has-symbols": "^1.0.1" } }, "is-typedarray": { @@ -2616,14 +2650,6 @@ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, - "isemail": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/isemail/-/isemail-3.2.0.tgz", - "integrity": "sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg==", - "requires": { - "punycode": "2.x.x" - } - }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -2663,9 +2689,9 @@ }, "dependencies": { "semver": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz", - "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } @@ -2732,215 +2758,216 @@ } }, "jest": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-24.8.0.tgz", - "integrity": "sha512-o0HM90RKFRNWmAWvlyV8i5jGZ97pFwkeVoGvPW1EtLTgJc2+jcuqcbbqcSZLE/3f2S5pt0y2ZBETuhpWNl1Reg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", + "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", "dev": true, "requires": { "import-local": "^2.0.0", - "jest-cli": "^24.8.0" + "jest-cli": "^24.9.0" }, "dependencies": { "jest-cli": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.8.0.tgz", - "integrity": "sha512-+p6J00jSMPQ116ZLlHJJvdf8wbjNbZdeSX9ptfHX06/MSNaXmKihQzx5vQcw0q2G6JsdVkUIdWbOWtSnaYs3yA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", + "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", "dev": true, "requires": { - "@jest/core": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/core": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", "exit": "^0.1.2", "import-local": "^2.0.0", "is-ci": "^2.0.0", - "jest-config": "^24.8.0", - "jest-util": "^24.8.0", - "jest-validate": "^24.8.0", + "jest-config": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", "prompts": "^2.0.1", "realpath-native": "^1.1.0", - "yargs": "^12.0.2" + "yargs": "^13.3.0" } } } }, "jest-changed-files": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.8.0.tgz", - "integrity": "sha512-qgANC1Yrivsq+UrLXsvJefBKVoCsKB0Hv+mBb6NMjjZ90wwxCDmU3hsCXBya30cH+LnPYjwgcU65i6yJ5Nfuug==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", + "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", "dev": true, "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "execa": "^1.0.0", "throat": "^4.0.0" } }, "jest-config": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.8.0.tgz", - "integrity": "sha512-Czl3Nn2uEzVGsOeaewGWoDPD8GStxCpAe0zOYs2x2l0fZAgPbCr3uwUkgNKV3LwE13VXythM946cd5rdGkkBZw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", + "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^24.8.0", - "@jest/types": "^24.8.0", - "babel-jest": "^24.8.0", + "@jest/test-sequencer": "^24.9.0", + "@jest/types": "^24.9.0", + "babel-jest": "^24.9.0", "chalk": "^2.0.1", "glob": "^7.1.1", - "jest-environment-jsdom": "^24.8.0", - "jest-environment-node": "^24.8.0", - "jest-get-type": "^24.8.0", - "jest-jasmine2": "^24.8.0", + "jest-environment-jsdom": "^24.9.0", + "jest-environment-node": "^24.9.0", + "jest-get-type": "^24.9.0", + "jest-jasmine2": "^24.9.0", "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.8.0", - "jest-util": "^24.8.0", - "jest-validate": "^24.8.0", + "jest-resolve": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", "micromatch": "^3.1.10", - "pretty-format": "^24.8.0", + "pretty-format": "^24.9.0", "realpath-native": "^1.1.0" } }, "jest-diff": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.8.0.tgz", - "integrity": "sha512-wxetCEl49zUpJ/bvUmIFjd/o52J+yWcoc5ZyPq4/W1LUKGEhRYDIbP1KcF6t+PvqNrGAFk4/JhtxDq/Nnzs66g==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", + "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", "dev": true, "requires": { "chalk": "^2.0.1", - "diff-sequences": "^24.3.0", - "jest-get-type": "^24.8.0", - "pretty-format": "^24.8.0" + "diff-sequences": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" } }, "jest-docblock": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.3.0.tgz", - "integrity": "sha512-nlANmF9Yq1dufhFlKG9rasfQlrY7wINJbo3q01tu56Jv5eBU5jirylhF2O5ZBnLxzOVBGRDz/9NAwNyBtG4Nyg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz", + "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==", "dev": true, "requires": { "detect-newline": "^2.1.0" } }, "jest-each": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.8.0.tgz", - "integrity": "sha512-NrwK9gaL5+XgrgoCsd9svsoWdVkK4gnvyhcpzd6m487tXHqIdYeykgq3MKI1u4I+5Zf0tofr70at9dWJDeb+BA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", + "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", "dev": true, "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", - "jest-get-type": "^24.8.0", - "jest-util": "^24.8.0", - "pretty-format": "^24.8.0" + "jest-get-type": "^24.9.0", + "jest-util": "^24.9.0", + "pretty-format": "^24.9.0" } }, "jest-environment-jsdom": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.8.0.tgz", - "integrity": "sha512-qbvgLmR7PpwjoFjM/sbuqHJt/NCkviuq9vus9NBn/76hhSidO+Z6Bn9tU8friecegbJL8gzZQEMZBQlFWDCwAQ==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", + "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", "dev": true, "requires": { - "@jest/environment": "^24.8.0", - "@jest/fake-timers": "^24.8.0", - "@jest/types": "^24.8.0", - "jest-mock": "^24.8.0", - "jest-util": "^24.8.0", + "@jest/environment": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-util": "^24.9.0", "jsdom": "^11.5.1" } }, "jest-environment-node": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.8.0.tgz", - "integrity": "sha512-vIGUEScd1cdDgR6sqn2M08sJTRLQp6Dk/eIkCeO4PFHxZMOgy+uYLPMC4ix3PEfM5Au/x3uQ/5Tl0DpXXZsJ/Q==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", + "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", "dev": true, "requires": { - "@jest/environment": "^24.8.0", - "@jest/fake-timers": "^24.8.0", - "@jest/types": "^24.8.0", - "jest-mock": "^24.8.0", - "jest-util": "^24.8.0" + "@jest/environment": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-util": "^24.9.0" } }, "jest-get-type": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.8.0.tgz", - "integrity": "sha512-RR4fo8jEmMD9zSz2nLbs2j0zvPpk/KCEz3a62jJWbd2ayNo0cb+KFRxPHVhE4ZmgGJEQp0fosmNz84IfqM8cMQ==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", "dev": true }, "jest-haste-map": { - "version": "24.8.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.8.1.tgz", - "integrity": "sha512-SwaxMGVdAZk3ernAx2Uv2sorA7jm3Kx+lR0grp6rMmnY06Kn/urtKx1LPN2mGTea4fCT38impYT28FfcLUhX0g==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", + "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", "dev": true, "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "anymatch": "^2.0.0", "fb-watchman": "^2.0.0", "fsevents": "^1.2.7", "graceful-fs": "^4.1.15", "invariant": "^2.2.4", - "jest-serializer": "^24.4.0", - "jest-util": "^24.8.0", - "jest-worker": "^24.6.0", + "jest-serializer": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.9.0", "micromatch": "^3.1.10", "sane": "^4.0.3", "walker": "^1.0.7" } }, "jest-jasmine2": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.8.0.tgz", - "integrity": "sha512-cEky88npEE5LKd5jPpTdDCLvKkdyklnaRycBXL6GNmpxe41F0WN44+i7lpQKa/hcbXaQ+rc9RMaM4dsebrYong==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", + "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", "co": "^4.6.0", - "expect": "^24.8.0", + "expect": "^24.9.0", "is-generator-fn": "^2.0.0", - "jest-each": "^24.8.0", - "jest-matcher-utils": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-runtime": "^24.8.0", - "jest-snapshot": "^24.8.0", - "jest-util": "^24.8.0", - "pretty-format": "^24.8.0", + "jest-each": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "pretty-format": "^24.9.0", "throat": "^4.0.0" } }, "jest-leak-detector": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.8.0.tgz", - "integrity": "sha512-cG0yRSK8A831LN8lIHxI3AblB40uhv0z+SsQdW3GoMMVcK+sJwrIIyax5tu3eHHNJ8Fu6IMDpnLda2jhn2pD/g==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", + "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", "dev": true, "requires": { - "pretty-format": "^24.8.0" + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" } }, "jest-matcher-utils": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.8.0.tgz", - "integrity": "sha512-lex1yASY51FvUuHgm0GOVj7DCYEouWSlIYmCW7APSqB9v8mXmKSn5+sWVF0MhuASG0bnYY106/49JU1FZNl5hw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", + "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", "dev": true, "requires": { "chalk": "^2.0.1", - "jest-diff": "^24.8.0", - "jest-get-type": "^24.8.0", - "pretty-format": "^24.8.0" + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" } }, "jest-message-util": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.8.0.tgz", - "integrity": "sha512-p2k71rf/b6ns8btdB0uVdljWo9h0ovpnEe05ZKWceQGfXYr4KkzgKo3PBi8wdnd9OtNh46VpNIJynUn/3MKm1g==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "@types/stack-utils": "^1.0.1", "chalk": "^2.0.1", "micromatch": "^3.1.10", @@ -2949,12 +2976,12 @@ } }, "jest-mock": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.8.0.tgz", - "integrity": "sha512-6kWugwjGjJw+ZkK4mDa0Df3sDlUTsV47MSrT0nGQ0RBWJbpODDQ8MHDVtGtUYBne3IwZUhtB7elxHspU79WH3A==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", + "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", "dev": true, "requires": { - "@jest/types": "^24.8.0" + "@jest/types": "^24.9.0" } }, "jest-pnp-resolver": { @@ -2964,18 +2991,18 @@ "dev": true }, "jest-regex-util": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.3.0.tgz", - "integrity": "sha512-tXQR1NEOyGlfylyEjg1ImtScwMq8Oh3iJbGTjN7p0J23EuVX1MA8rwU69K4sLbCmwzgCUbVkm0FkSF9TdzOhtg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", + "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", "dev": true }, "jest-resolve": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.8.0.tgz", - "integrity": "sha512-+hjSzi1PoRvnuOICoYd5V/KpIQmkAsfjFO71458hQ2Whi/yf1GDeBOFj8Gxw4LrApHsVJvn5fmjcPdmoUHaVKw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", + "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", "dev": true, "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "browser-resolve": "^1.11.3", "chalk": "^2.0.1", "jest-pnp-resolver": "^1.2.1", @@ -2983,111 +3010,120 @@ } }, "jest-resolve-dependencies": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.8.0.tgz", - "integrity": "sha512-hyK1qfIf/krV+fSNyhyJeq3elVMhK9Eijlwy+j5jqmZ9QsxwKBiP6qukQxaHtK8k6zql/KYWwCTQ+fDGTIJauw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz", + "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", "dev": true, "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "jest-regex-util": "^24.3.0", - "jest-snapshot": "^24.8.0" + "jest-snapshot": "^24.9.0" } }, "jest-runner": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.8.0.tgz", - "integrity": "sha512-utFqC5BaA3JmznbissSs95X1ZF+d+4WuOWwpM9+Ak356YtMhHE/GXUondZdcyAAOTBEsRGAgH/0TwLzfI9h7ow==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", + "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", "dev": true, "requires": { "@jest/console": "^24.7.1", - "@jest/environment": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "chalk": "^2.4.2", "exit": "^0.1.2", "graceful-fs": "^4.1.15", - "jest-config": "^24.8.0", + "jest-config": "^24.9.0", "jest-docblock": "^24.3.0", - "jest-haste-map": "^24.8.0", - "jest-jasmine2": "^24.8.0", - "jest-leak-detector": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-resolve": "^24.8.0", - "jest-runtime": "^24.8.0", - "jest-util": "^24.8.0", + "jest-haste-map": "^24.9.0", + "jest-jasmine2": "^24.9.0", + "jest-leak-detector": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-resolve": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-util": "^24.9.0", "jest-worker": "^24.6.0", "source-map-support": "^0.5.6", "throat": "^4.0.0" } }, "jest-runtime": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.8.0.tgz", - "integrity": "sha512-Mq0aIXhvO/3bX44ccT+czU1/57IgOMyy80oM0XR/nyD5zgBcesF84BPabZi39pJVA6UXw+fY2Q1N+4BiVUBWOA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", + "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", "dev": true, "requires": { "@jest/console": "^24.7.1", - "@jest/environment": "^24.8.0", + "@jest/environment": "^24.9.0", "@jest/source-map": "^24.3.0", - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", - "@types/yargs": "^12.0.2", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/yargs": "^13.0.0", "chalk": "^2.0.1", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.1.15", - "jest-config": "^24.8.0", - "jest-haste-map": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-mock": "^24.8.0", + "jest-config": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0", "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.8.0", - "jest-snapshot": "^24.8.0", - "jest-util": "^24.8.0", - "jest-validate": "^24.8.0", + "jest-resolve": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", "realpath-native": "^1.1.0", "slash": "^2.0.0", "strip-bom": "^3.0.0", - "yargs": "^12.0.2" + "yargs": "^13.3.0" } }, "jest-serializer": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.4.0.tgz", - "integrity": "sha512-k//0DtglVstc1fv+GY/VHDIjrtNjdYvYjMlbLUed4kxrE92sIUewOi5Hj3vrpB8CXfkJntRPDRjCrCvUhBdL8Q==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", + "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", "dev": true }, "jest-snapshot": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.8.0.tgz", - "integrity": "sha512-5ehtWoc8oU9/cAPe6fez6QofVJLBKyqkY2+TlKTOf0VllBB/mqUNdARdcjlZrs9F1Cv+/HKoCS/BknT0+tmfPg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", + "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", "dev": true, "requires": { "@babel/types": "^7.0.0", - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", - "expect": "^24.8.0", - "jest-diff": "^24.8.0", - "jest-matcher-utils": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-resolve": "^24.8.0", + "expect": "^24.9.0", + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-resolve": "^24.9.0", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "pretty-format": "^24.8.0", - "semver": "^5.5.0" + "pretty-format": "^24.9.0", + "semver": "^6.2.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 + } } }, "jest-util": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.8.0.tgz", - "integrity": "sha512-DYZeE+XyAnbNt0BG1OQqKy/4GVLPtzwGx5tsnDrFcax36rVE3lTA5fbvgmbVPUZf9w77AJ8otqR4VBbfFJkUZA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", + "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", "dev": true, "requires": { - "@jest/console": "^24.7.1", - "@jest/fake-timers": "^24.8.0", - "@jest/source-map": "^24.3.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/console": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/source-map": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "callsites": "^3.0.0", "chalk": "^2.0.1", "graceful-fs": "^4.1.15", @@ -3098,41 +3134,41 @@ } }, "jest-validate": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.8.0.tgz", - "integrity": "sha512-+/N7VOEMW1Vzsrk3UWBDYTExTPwf68tavEPKDnJzrC6UlHtUDU/fuEdXqFoHzv9XnQ+zW6X3qMZhJ3YexfeLDA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", + "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", "dev": true, "requires": { - "@jest/types": "^24.8.0", - "camelcase": "^5.0.0", + "@jest/types": "^24.9.0", + "camelcase": "^5.3.1", "chalk": "^2.0.1", - "jest-get-type": "^24.8.0", - "leven": "^2.1.0", - "pretty-format": "^24.8.0" + "jest-get-type": "^24.9.0", + "leven": "^3.1.0", + "pretty-format": "^24.9.0" } }, "jest-watcher": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.8.0.tgz", - "integrity": "sha512-SBjwHt5NedQoVu54M5GEx7cl7IGEFFznvd/HNT8ier7cCAx/Qgu9ZMlaTQkvK22G1YOpcWBLQPFSImmxdn3DAw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz", + "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", "dev": true, "requires": { - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", - "@types/yargs": "^12.0.9", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/yargs": "^13.0.0", "ansi-escapes": "^3.0.0", "chalk": "^2.0.1", - "jest-util": "^24.8.0", + "jest-util": "^24.9.0", "string-length": "^2.0.0" } }, "jest-worker": { - "version": "24.6.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.6.0.tgz", - "integrity": "sha512-jDwgW5W9qGNvpI1tNnvajh0a5IE/PuGLFmHk6aR/BZFz8tSgGw17GsDPXAJ6p91IvYDjOw8GpFbvvZGAK+DPQQ==", + "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": "^1.0.1", + "merge-stream": "^2.0.0", "supports-color": "^6.1.0" }, "dependencies": { @@ -3147,16 +3183,6 @@ } } }, - "joi": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-13.7.0.tgz", - "integrity": "sha512-xuY5VkHfeOYK3Hdi91ulocfuFopwgbSORmIwzcwHKESQhC7w1kD5jaVSPnqDxS2I8t3RZ9omCKAxNwXN5zG1/Q==", - "requires": { - "hoek": "5.x.x", - "isemail": "3.x.x", - "topo": "3.x.x" - } - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -3230,9 +3256,9 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "json5": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", - "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", + "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", "dev": true, "requires": { "minimist": "^1.2.0" @@ -3250,9 +3276,12 @@ } }, "keygrip": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.0.3.tgz", - "integrity": "sha512-/PpesirAIfaklxUzp4Yb7xBper9MwP6hNRA6BGGUFCgbJ+BM5CKBtsoxinNXkLHAr+GXS1/lSlF2rP7cv5Fl+g==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", + "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", + "requires": { + "tsscmp": "1.0.6" + } }, "kind-of": { "version": "6.0.2", @@ -3267,19 +3296,20 @@ "dev": true }, "koa": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.7.0.tgz", - "integrity": "sha512-7ojD05s2Q+hFudF8tDLZ1CpCdVZw8JQELWSkcfG9bdtoTDzMmkRF6BQBU7JzIzCCOY3xd3tftiy/loHBUYaY2Q==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.11.0.tgz", + "integrity": "sha512-EpR9dElBTDlaDgyhDMiLkXrPwp6ZqgAIBvhhmxQ9XN4TFgW+gEz6tkcsNI6BnUbUftrKDjVFj4lW2/J2aNBMMA==", "requires": { "accepts": "^1.3.5", "cache-content-type": "^1.0.0", "content-disposition": "~0.5.2", "content-type": "^1.0.4", - "cookies": "~0.7.1", + "cookies": "~0.8.0", "debug": "~3.1.0", "delegates": "^1.0.0", "depd": "^1.1.2", "destroy": "^1.0.4", + "encodeurl": "^1.0.2", "error-inject": "^1.0.0", "escape-html": "^1.0.3", "fresh": "~0.5.2", @@ -3288,7 +3318,6 @@ "is-generator-function": "^1.0.7", "koa-compose": "^4.1.0", "koa-convert": "^1.2.0", - "koa-is-json": "^1.0.0", "on-finished": "^2.3.0", "only": "~0.0.2", "parseurl": "^1.3.2", @@ -3331,11 +3360,6 @@ } } }, - "koa-is-json": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/koa-is-json/-/koa-is-json-1.0.0.tgz", - "integrity": "sha1-JzwH7c3Ljfaiwat9We52SRRR7BQ=" - }, "koa-router": { "version": "7.4.0", "resolved": "https://registry.npmjs.org/koa-router/-/koa-router-7.4.0.tgz", @@ -3372,15 +3396,6 @@ } } }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, "left-pad": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", @@ -3388,9 +3403,9 @@ "dev": true }, "leven": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", - "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "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": { @@ -3426,9 +3441,9 @@ } }, "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, "lodash.sortby": { @@ -3473,15 +3488,6 @@ "tmpl": "1.0.x" } }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -3502,25 +3508,11 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - } - }, "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } + "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 }, "methods": { "version": "1.1.2", @@ -3567,12 +3559,6 @@ "mime-db": "1.40.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 - }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -3588,9 +3574,9 @@ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" }, "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "dev": true, "requires": { "for-in": "^1.0.2", @@ -3692,9 +3678,9 @@ "dev": true }, "node-notifier": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.0.tgz", - "integrity": "sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ==", + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", + "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", "dev": true, "requires": { "growly": "^1.3.0", @@ -3734,16 +3720,10 @@ "path-key": "^2.0.0" } }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, "nwsapi": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz", - "integrity": "sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", "dev": true }, "oauth-sign": { @@ -3782,6 +3762,12 @@ } } }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -3797,14 +3783,26 @@ "isobject": "^3.0.0" } }, - "object.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "dev": true, "requires": { "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" } }, "object.pick": { @@ -3857,44 +3855,19 @@ } }, "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, "requires": { "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", + "fast-levenshtein": "~2.0.6", "levn": "~0.3.0", "prelude-ls": "~1.1.2", "type-check": "~0.3.2", - "wordwrap": "~1.0.0" - }, - "dependencies": { - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - } - } - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" + "word-wrap": "~1.2.3" } }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, "p-each-series": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", @@ -3910,16 +3883,10 @@ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true - }, "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "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" @@ -4069,12 +4036,12 @@ "dev": true }, "pretty-format": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.8.0.tgz", - "integrity": "sha512-P952T7dkrDEplsR+TuY7q3VXDae5Sr7zmQb12JU/NDQa/3CH7/QW0yvqLcGN6jL+zQFKaoJcPc+yJxMTGmosqw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", "dev": true, "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "ansi-regex": "^4.0.0", "ansi-styles": "^3.2.0", "react-is": "^16.8.4" @@ -4087,19 +4054,19 @@ "dev": true }, "prompts": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.1.0.tgz", - "integrity": "sha512-+x5TozgqYdOwWsQFZizE/Tra3fKvAoy037kOyU6cgz84n8f6zxngLOV4O32kTwt9FcLCxAqw0P/c8rOr9y+Gfg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.0.tgz", + "integrity": "sha512-NfbbPPg/74fT7wk2XYQ7hAIp9zJyZp5Fu19iRbORqqy1BhtrkZ0fPafBU+7bmn8ie69DpT0R6QpJIN2oisYjJg==", "dev": true, "requires": { - "kleur": "^3.0.2", - "sisteransi": "^1.0.0" + "kleur": "^3.0.3", + "sisteransi": "^1.0.3" } }, "psl": { - "version": "1.1.32", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.32.tgz", - "integrity": "sha512-MHACAkHpihU/REGGPLj4sEfc/XKW2bheigvHO1dUqjaKigMp1C8+WLQYRGgeKFMsw5PMfegZcaN8IDXK/cD0+g==" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.6.0.tgz", + "integrity": "sha512-SYKKmVel98NCOYXpkwUqZqh0ahZeeKfmisiLIcEZdsb+WbLv02g/dI5BUmZnIyOe7RzZtLax81nnb2HbvC2tzA==" }, "pump": { "version": "3.0.0", @@ -4122,9 +4089,9 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, "react-is": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", - "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==", + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", + "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==", "dev": true }, "read-pkg": { @@ -4244,21 +4211,21 @@ } }, "request-promise-core": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", - "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", + "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", "dev": true, "requires": { - "lodash": "^4.17.11" + "lodash": "^4.17.15" } }, "request-promise-native": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", - "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", + "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", "dev": true, "requires": { - "request-promise-core": "1.1.2", + "request-promise-core": "1.1.3", "stealthy-require": "^1.1.1", "tough-cookie": "^2.3.3" } @@ -4276,9 +4243,9 @@ "dev": true }, "resolve": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz", - "integrity": "sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.13.1.tgz", + "integrity": "sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -4312,9 +4279,9 @@ "dev": true }, "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "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" @@ -4374,9 +4341,9 @@ "dev": true }, "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, "set-blocking": { @@ -4386,9 +4353,9 @@ "dev": true }, "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "dev": true, "requires": { "extend-shallow": "^2.0.1", @@ -4441,9 +4408,9 @@ "dev": true }, "sisteransi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.0.tgz", - "integrity": "sha512-N+z4pHB4AmUv0SjveWRd6q1Nj5w62m5jodv+GD8lvmbY/83T/rpbJGZOnK5T149OldDj4Db07BSv9xY4K6NTPQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.4.tgz", + "integrity": "sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig==", "dev": true }, "slash": { @@ -4585,9 +4552,9 @@ } }, "source-map-support": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", - "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -4627,9 +4594,9 @@ } }, "spdx-license-ids": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", - "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", "dev": true }, "split-string": { @@ -4723,30 +4690,34 @@ } }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { + "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } + "strip-ansi": "^5.1.0" + } + }, + "string.prototype.trimleft": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", + "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", + "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" } }, "string_decoder": { @@ -4916,21 +4887,6 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" }, - "topo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/topo/-/topo-3.0.3.tgz", - "integrity": "sha512-IgpPtvD4kjrJ7CRA3ov2FhWQADwv+Tdqbsf1ZnPUSAtCJ9e1Z44MmoSGDXGk4IppoZA7jd/QRkNddlLJWlUZsQ==", - "requires": { - "hoek": "6.x.x" - }, - "dependencies": { - "hoek": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-6.1.3.tgz", - "integrity": "sha512-YXXAAhmF9zpQbC7LEcREFtXfGq5K1fmd+4PHkBq8NUqmzW3G+Dq10bI/i0KucLRwss3YYFQ0fSfoxBZYiGUqtQ==" - } - } - }, "tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -4950,11 +4906,10 @@ "punycode": "^2.1.0" } }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true + "tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==" }, "tunnel-agent": { "version": "0.6.0", @@ -4988,49 +4943,26 @@ } }, "uglify-js": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", - "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.7.2.tgz", + "integrity": "sha512-uhRwZcANNWVLrxLfNFEdltoPNhECUR3lc+UdJoG9CBpMcSnKyWA94tc3eAujB1GcMY5Uwq8ZMp4qWpxWYDQmaA==", "dev": true, "optional": true, "requires": { - "commander": "~2.20.0", + "commander": "~2.20.3", "source-map": "~0.6.1" } }, "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "dev": true, "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } + "set-value": "^2.0.1" } }, "unset-value": { @@ -5115,9 +5047,9 @@ } }, "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" }, "validate-npm-package-license": { "version": "3.0.4", @@ -5154,12 +5086,12 @@ } }, "wait-on": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-3.2.0.tgz", - "integrity": "sha512-QUGNKlKLDyY6W/qHdxaRlXUAgLPe+3mLL/tRByHpRNcHs/c7dZXbu+OnJWGNux6tU1WFh/Z8aEwvbuzSAu79Zg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-3.3.0.tgz", + "integrity": "sha512-97dEuUapx4+Y12aknWZn7D25kkjMk16PbWoYzpSdA8bYpVfS6hpl2a2pOWZ3c+Tyt3/i4/pglyZctG3J4V1hWQ==", "requires": { - "core-js": "^2.5.7", - "joi": "^13.0.0", + "@hapi/joi": "^15.0.3", + "core-js": "^2.6.5", "minimist": "^1.2.0", "request": "^2.88.0", "rx": "^4.1.0" @@ -5221,6 +5153,12 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, "wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", @@ -5228,50 +5166,14 @@ "dev": true }, "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "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 - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "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" - } - } + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" } }, "wrappy": { @@ -5313,37 +5215,27 @@ "dev": true }, "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", "dev": true, "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", + "cliui": "^5.0.0", "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", + "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", + "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^2.0.0", + "string-width": "^3.0.0", "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - }, - "dependencies": { - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - } + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" } }, "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", "dev": true, "requires": { "camelcase": "^5.0.0", diff --git a/adapter/integration-test/package.json b/adapter/integration-test/package.json index 6b7124a02..d7bc5d140 100644 --- a/adapter/integration-test/package.json +++ b/adapter/integration-test/package.json @@ -1,7 +1,7 @@ { - "name": "adapter-service-it", + "name": "adapter-it", "version": "1.0.0", - "description": "Adapter-Service Integration-Tests", + "description": "Adapter Integration-Tests", "scripts": { "mock": "node src/mock.server.js", "pretest": "npm run mock &", @@ -9,15 +9,15 @@ "posttest": "killall node" }, "devDependencies": { - "jest": "^24.8.0", + "jest": "^24.9.0", "supertest": "^4.0.2" }, "jest": { "testEnvironment": "node" }, "dependencies": { - "koa": "^2.7.0", + "koa": "^2.11.0", "koa-router": "^7.4.0", - "wait-on": "^3.2.0" + "wait-on": "^3.3.0" } } From bd67ac21206de2fc3552f5f2851b28474114ea32 Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Fri, 13 Dec 2019 09:56:20 +0100 Subject: [PATCH 0252/1168] Adapter: upgrade java version in Dockerfile --- adapter/Dockerfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/adapter/Dockerfile b/adapter/Dockerfile index 1ab70374c..ea312e8a9 100644 --- a/adapter/Dockerfile +++ b/adapter/Dockerfile @@ -1,7 +1,7 @@ ######################################################### # First stage: image to build and test Java application # ######################################################### -FROM adoptopenjdk/openjdk12-openj9:alpine-slim as builder +FROM adoptopenjdk/openjdk13-openj9:alpine-slim as builder WORKDIR /builder COPY *.gradle /builder/ @@ -16,7 +16,7 @@ RUN ./gradlew test ######################################################### # Second stage: image to run Java application # ######################################################### -FROM adoptopenjdk/openjdk12-openj9:alpine-slim +FROM adoptopenjdk/openjdk13-openj9:alpine-slim RUN mkdir /app WORKDIR /app @@ -26,4 +26,4 @@ COPY --from=builder /builder/build/libs/* app.jar # Run app EXPOSE 8080 -ENTRYPOINT ["java", "-jar", "app.jar"] \ No newline at end of file +ENTRYPOINT ["java", "-jar", "app.jar"] From db7c16c69db6a5104467aaf9c9c397241e14e799 Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Fri, 13 Dec 2019 10:02:22 +0100 Subject: [PATCH 0253/1168] Core: gradle wrapper upgrade --- core/gradle/wrapper/gradle-wrapper.jar | Bin 55190 -> 55616 bytes core/gradle/wrapper/gradle-wrapper.properties | 2 +- core/gradlew | 22 +++++++++++++++--- core/gradlew.bat | 18 +++++++++++++- 4 files changed, 37 insertions(+), 5 deletions(-) diff --git a/core/gradle/wrapper/gradle-wrapper.jar b/core/gradle/wrapper/gradle-wrapper.jar index 87b738cbd051603d91cc39de6cb000dd98fe6b02..5c2d1cf016b3885f6930543d57b744ea8c220a1a 100644 GIT binary patch delta 3320 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 Date: Fri, 13 Dec 2019 10:04:07 +0100 Subject: [PATCH 0254/1168] Core: upgrade spring boot plugin version --- core/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/build.gradle b/core/build.gradle index a6d855870..91f0da872 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'org.springframework.boot' version '2.2.0.M5' + id 'org.springframework.boot' version '2.2.2.RELEASE' id 'java' } From a53d961d5a5f546791f8f348612eb448bc85946a Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Fri, 13 Dec 2019 10:07:52 +0100 Subject: [PATCH 0255/1168] Core: upgrade java version --- core/Dockerfile | 6 +++--- core/build.gradle | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/Dockerfile b/core/Dockerfile index 9d9313cb8..74eeb51b1 100644 --- a/core/Dockerfile +++ b/core/Dockerfile @@ -1,7 +1,7 @@ ######################################################### # First stage: image to build and test Java application # ######################################################### -FROM adoptopenjdk/openjdk12-openj9:alpine-slim as builder +FROM adoptopenjdk/openjdk13-openj9:alpine-slim as builder WORKDIR /builder COPY *.gradle /builder/ @@ -16,7 +16,7 @@ RUN ./gradlew test ######################################################### # Second stage: image to run Java application # ######################################################### -FROM adoptopenjdk/openjdk12-openj9:alpine-slim +FROM adoptopenjdk/openjdk13-openj9:alpine-slim RUN mkdir /app WORKDIR /app @@ -28,4 +28,4 @@ COPY --from=builder /builder/build/libs/* app.jar # Run app EXPOSE 8080 -ENTRYPOINT ["java", "-jar", "app.jar"] \ No newline at end of file +ENTRYPOINT ["java", "-jar", "app.jar"] diff --git a/core/build.gradle b/core/build.gradle index 91f0da872..4d3589019 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -10,7 +10,7 @@ apply plugin: 'io.spring.dependency-management' group = 'org.jvalue.ods' version = props.getProperty("app.version") -sourceCompatibility = '12' +sourceCompatibility = '13' repositories { mavenCentral() From afd6577c70fc12d709047984ef341b54b92334af Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Fri, 13 Dec 2019 10:16:41 +0100 Subject: [PATCH 0256/1168] Core: rename ci package name --- core/integration-test/package-lock.json | 28 ++++++++++++------------- core/integration-test/package.json | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/core/integration-test/package-lock.json b/core/integration-test/package-lock.json index a5b12dbf6..aed5e4031 100644 --- a/core/integration-test/package-lock.json +++ b/core/integration-test/package-lock.json @@ -1,5 +1,5 @@ { - "name": "core-service-it", + "name": "core-it", "version": "1.0.0", "lockfileVersion": 1, "requires": true, @@ -218,9 +218,9 @@ } }, "@hapi/address": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.0.0.tgz", - "integrity": "sha512-mV6T0IYqb0xL1UALPFplXYQmR0twnXG0M6jUswpquqT2sD12BOiCiLy3EvMp/Fy7s3DZElC4/aPjEjo2jeZpvw==" + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", + "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==" }, "@hapi/bourne": { "version": "1.3.2", @@ -228,9 +228,9 @@ "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==" }, "@hapi/hoek": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.2.1.tgz", - "integrity": "sha512-JPiBy+oSmsq3St7XlipfN5pNA6bDJ1kpa73PrK/zR29CVClDVqy04AanM/M/qx5bSF+I61DdCfAvRrujau+zRg==" + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.0.tgz", + "integrity": "sha512-7XYT10CZfPsH7j9F1Jmg1+d0ezOux2oM2GfArAzLwWe4mE2Dr3hVjsAL6+TFY49RRJlCdJDMw3nJsLFroTc8Kw==" }, "@hapi/joi": { "version": "15.1.1", @@ -244,11 +244,11 @@ } }, "@hapi/topo": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.3.tgz", - "integrity": "sha512-JmS9/vQK6dcUYn7wc2YZTqzIKubAQcJKu2KCKAru6es482U5RT5fP1EXCPtlXpiK7PR0On/kpQKI4fRKkzpZBQ==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", "requires": { - "@hapi/hoek": "8.x.x" + "@hapi/hoek": "^8.3.0" } }, "@jest/console": { @@ -1032,9 +1032,9 @@ "dev": true }, "core-js": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", - "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==" + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" }, "core-util-is": { "version": "1.0.2", diff --git a/core/integration-test/package.json b/core/integration-test/package.json index ab9fd7af9..edc6b0341 100644 --- a/core/integration-test/package.json +++ b/core/integration-test/package.json @@ -1,5 +1,5 @@ { - "name": "core-service-it", + "name": "core-it", "version": "1.0.0", "description": "Core-Service Integration-Tests", "scripts": { From b41b898b9b0f34002f84d63e2e56bdc3e49fec21 Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Fri, 13 Dec 2019 10:29:24 +0100 Subject: [PATCH 0257/1168] Scheduler: upgrade libraries --- scheduler/package-lock.json | 756 ++++++++++++++++++++++++------------ scheduler/package.json | 28 +- 2 files changed, 532 insertions(+), 252 deletions(-) diff --git a/scheduler/package-lock.json b/scheduler/package-lock.json index 550c0e0d0..84f2d6c74 100644 --- a/scheduler/package-lock.json +++ b/scheduler/package-lock.json @@ -475,9 +475,9 @@ "dev": true }, "@types/express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.1.tgz", - "integrity": "sha512-VfH/XCP0QbQk5B5puLqTLEeFgR8lfCJHZJKkInZ9mkYd+u8byX0kztXEQxEk4wZXJs8HI+7km2ALXjn4YKcX9w==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.2.tgz", + "integrity": "sha512-5mHFNyavtLoJmnusB8OKJ5bshSzw+qkMIBAobLrIM48HJvunFva9mOa6aBwh64lBFyNwBbs0xiEFuj4eU/NjCA==", "dev": true, "requires": { "@types/body-parser": "*", @@ -486,9 +486,9 @@ } }, "@types/express-serve-static-core": { - "version": "4.16.9", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.16.9.tgz", - "integrity": "sha512-GqpaVWR0DM8FnRUJYKlWgyARoBUAVfRIeVDZQKOttLFp5SmhhF9YFIYeTPwMd/AXfxlP7xVO2dj1fGu0Q+krKQ==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.0.tgz", + "integrity": "sha512-Xnub7w57uvcBqFdIGoRg1KhNOeEj0vB6ykUM7uFWyxvbdE89GFyqgmUcanAriMr4YOxNFZBAWkfcWIb4WBPt3g==", "dev": true, "requires": { "@types/node": "*", @@ -521,20 +521,14 @@ } }, "@types/jest": { - "version": "24.0.18", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.0.18.tgz", - "integrity": "sha512-jcDDXdjTcrQzdN06+TSVsPPqxvsZA/5QkYfIZlq1JMw7FdP5AZylbOc+6B/cuDurctRe+MziUMtQ3xQdrbjqyQ==", + "version": "24.0.23", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.0.23.tgz", + "integrity": "sha512-L7MBvwfNpe7yVPTXLn32df/EK+AMBFAFvZrRuArGs7npEWnlziUXK+5GMIUTI4NIuwok3XibsjXCs5HxviYXjg==", "dev": true, "requires": { - "@types/jest-diff": "*" + "jest-diff": "^24.3.0" } }, - "@types/jest-diff": { - "version": "20.0.1", - "resolved": "https://registry.npmjs.org/@types/jest-diff/-/jest-diff-20.0.1.tgz", - "integrity": "sha512-yALhelO3i0hqZwhjtcr6dYyaLoCHbAMshwtj6cGxTvHZAKXHsYGdff6E8EPw3xLKY0ELUTQ69Q1rQiJENnccMA==", - "dev": true - }, "@types/json-schema": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.3.tgz", @@ -600,62 +594,85 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.0.0.tgz", - "integrity": "sha512-Mo45nxTTELODdl7CgpZKJISvLb+Fu64OOO2ZFc2x8sYSnUpFrBUW3H+H/ZGYmEkfnL6VkdtOSxgdt+Av79j0sA==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.11.0.tgz", + "integrity": "sha512-G2HHA1vpMN0EEbUuWubiCCfd0R3a30BB+UdvnFkxwZIxYEGOrWEXDv8tBFO9f44CWc47Xv9lLM3VSn4ORLI2bA==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "2.0.0", - "eslint-utils": "^1.4.0", + "@typescript-eslint/experimental-utils": "2.11.0", + "eslint-utils": "^1.4.3", "functional-red-black-tree": "^1.0.1", - "regexpp": "^2.0.1", - "tsutils": "^3.14.0" - }, - "dependencies": { - "eslint-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.2.tgz", - "integrity": "sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.0.0" - } - } + "regexpp": "^3.0.0", + "tsutils": "^3.17.1" } }, "@typescript-eslint/experimental-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.0.0.tgz", - "integrity": "sha512-XGJG6GNBXIEx/mN4eTRypN/EUmsd0VhVGQ1AG+WTgdvjHl0G8vHhVBHrd/5oI6RRYBRnedNymSYWW1HAdivtmg==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.11.0.tgz", + "integrity": "sha512-YxcA/y0ZJaCc/fB/MClhcDxHI0nOBB7v2/WxBju2cOTanX7jO9ttQq6Fy4yW9UaY5bPd9xL3cun3lDVqk67sPQ==", "dev": true, "requires": { "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.0.0", - "eslint-scope": "^4.0.0" + "@typescript-eslint/typescript-estree": "2.11.0", + "eslint-scope": "^5.0.0" } }, "@typescript-eslint/parser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.0.0.tgz", - "integrity": "sha512-ibyMBMr0383ZKserIsp67+WnNVoM402HKkxqXGlxEZsXtnGGurbnY90pBO3e0nBUM7chEEOcxUhgw9aPq7fEBA==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.11.0.tgz", + "integrity": "sha512-DyGXeqhb3moMioEFZIHIp7oXBBh7dEfPTzGrlyP0Mi9ScCra4SWEGs3kPd18mG7Sy9Wy8z88zmrw5tSGL6r/6A==", "dev": true, "requires": { "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.0.0", - "@typescript-eslint/typescript-estree": "2.0.0", - "eslint-visitor-keys": "^1.0.0" + "@typescript-eslint/experimental-utils": "2.11.0", + "@typescript-eslint/typescript-estree": "2.11.0", + "eslint-visitor-keys": "^1.1.0" } }, "@typescript-eslint/typescript-estree": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.0.0.tgz", - "integrity": "sha512-NXbmzA3vWrSgavymlzMWNecgNOuiMMp62MO3kI7awZRLRcsA1QrYWo6q08m++uuAGVbXH/prZi2y1AWuhSu63w==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.11.0.tgz", + "integrity": "sha512-HGY4+d4MagO6cKMcKfIKaTMxcAv7dEVnji2Zi+vi5VV8uWAM631KjAB5GxFcexMYrwKT0EekRiiGK1/Sd7VFGA==", "dev": true, "requires": { + "debug": "^4.1.1", + "eslint-visitor-keys": "^1.1.0", + "glob": "^7.1.6", + "is-glob": "^4.0.1", "lodash.unescape": "4.0.1", - "semver": "^6.2.0" + "semver": "^6.3.0", + "tsutils": "^3.17.1" }, "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" + } + }, + "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" + } + }, + "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 + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -686,9 +703,9 @@ } }, "acorn": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.0.0.tgz", - "integrity": "sha512-PaF/MduxijYYt7unVGRuds1vBC9bFxbNf+VWqhOClfdgy7RlVkQqt610ig1/yxTgsDIfW1cWDel5EBbOy3jdtQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", + "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", "dev": true }, "acorn-globals": { @@ -710,9 +727,9 @@ } }, "acorn-jsx": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.2.tgz", - "integrity": "sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", + "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", "dev": true }, "acorn-walk": { @@ -812,13 +829,57 @@ "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, "array-includes": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", - "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.0.tgz", + "integrity": "sha512-ONOEQoKrvXPKk7Su92Co0YMqYO32FfqJTzkKU9u2UpIXyYZIzLSvpdg4AwvSw4mSUW0czu6inK+zby6Oj6gDjQ==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.7.0" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.0" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0-next.1.tgz", + "integrity": "sha512-7MmGr03N7Rnuid6+wyhD9sHNE2n4tFSwExnU2lQl3lIo2ShXWGePY80zYaoMOmILWv57H0amMjZGHNzzGG70Rw==", + "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.1.4", + "is-regex": "^1.0.4", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.0", + "string.prototype.trimright": "^2.1.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": { + "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 + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + } } }, "array-unique": { @@ -827,6 +888,60 @@ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, + "array.prototype.flat": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", + "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0-next.1.tgz", + "integrity": "sha512-7MmGr03N7Rnuid6+wyhD9sHNE2n4tFSwExnU2lQl3lIo2ShXWGePY80zYaoMOmILWv57H0amMjZGHNzzGG70Rw==", + "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.1.4", + "is-regex": "^1.0.4", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.0", + "string.prototype.trimright": "^2.1.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": { + "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 + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + } + } + }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -1227,9 +1342,9 @@ "dev": true }, "chokidar": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", - "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", "dev": true, "requires": { "anymatch": "^2.0.0", @@ -1246,6 +1361,27 @@ "upath": "^1.1.1" }, "dependencies": { + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -1290,12 +1426,12 @@ "dev": true }, "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, "requires": { - "restore-cursor": "^2.0.0" + "restore-cursor": "^3.1.0" } }, "cli-width": { @@ -1590,9 +1726,9 @@ "dev": true }, "deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.0.tgz", - "integrity": "sha512-ZbfWJq/wN1Z273o7mUSjILYqehAktR2NVoSrOukDkU9kg2v/Uv89yU4Cvz8seJeAmtN5oqiefKq8FPuXOboqLw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", "requires": { "is-arguments": "^1.0.4", "is-date-object": "^1.0.1", @@ -1833,9 +1969,9 @@ } }, "eslint": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.2.2.tgz", - "integrity": "sha512-mf0elOkxHbdyGX1IJEUsNBzCDdyoUgljF3rRlgfyYh0pwGnreLc0jjD6ZuleOibjmnUWZLY2eXwSooeOgGJ2jw==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.7.2.tgz", + "integrity": "sha512-qMlSWJaCSxDFr8fBPvJM9kJwbazrhNcBU3+DszDW1OlEwKBBRWsJc7NJFelvwQpanHCR14cOLD41x8Eqvo3Nng==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -1845,19 +1981,19 @@ "debug": "^4.0.1", "doctrine": "^3.0.0", "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.2", + "eslint-utils": "^1.4.3", "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.1", + "espree": "^6.1.2", "esquery": "^1.0.1", "esutils": "^2.0.2", "file-entry-cache": "^5.0.1", "functional-red-black-tree": "^1.0.1", "glob-parent": "^5.0.0", - "globals": "^11.7.0", + "globals": "^12.1.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^6.4.1", + "inquirer": "^7.0.0", "is-glob": "^4.0.0", "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", @@ -1866,7 +2002,7 @@ "minimatch": "^3.0.4", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "optionator": "^0.8.2", + "optionator": "^0.8.3", "progress": "^2.0.0", "regexpp": "^2.0.1", "semver": "^6.1.2", @@ -1892,38 +2028,39 @@ "ms": "^2.1.1" } }, - "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "globals": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", + "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==", "dev": true, "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "type-fest": "^0.8.1" } }, - "eslint-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.2.tgz", - "integrity": "sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^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==", + "dev": true }, - "glob-parent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.0.0.tgz", - "integrity": "sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg==", + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, "requires": { - "is-glob": "^4.0.1" + "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" } }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", "dev": true }, "semver": { @@ -1940,12 +2077,6 @@ "requires": { "ansi-regex": "^4.1.0" } - }, - "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", - "dev": true } } }, @@ -1966,42 +2097,51 @@ } }, "eslint-module-utils": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.1.tgz", - "integrity": "sha512-H6DOj+ejw7Tesdgbfs4jeS4YMFrT8uI8xwd1gtQqXssaR0EQ26L+2O/w6wkYFy2MymON0fTwHmXBvvfLNZVZEw==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.5.0.tgz", + "integrity": "sha512-kCo8pZaNz2dsAW7nCUjuVoI11EBXXpIzfNxmaoLhXoRDOnqXLC4iSGVRdZPhOitfbdEfMEfKOiENaK6wDPZEGw==", "dev": true, "requires": { - "debug": "^2.6.8", + "debug": "^2.6.9", "pkg-dir": "^2.0.0" } }, "eslint-plugin-es": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-1.4.0.tgz", - "integrity": "sha512-XfFmgFdIUDgvaRAlaXUkxrRg5JSADoRC8IkKLc/cISeR3yHVMefFHQZpcyXXEUUPHfy5DwviBcrfqlyqEwlQVw==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-1.4.1.tgz", + "integrity": "sha512-5fa/gR2yR3NxQf+UXkeLeP8FBBl6tSgdrAz1+cF84v1FMM4twGwQoqTnn+QxFLcPOrF4pdKEJKDB/q9GoyJrCA==", "dev": true, "requires": { - "eslint-utils": "^1.3.0", + "eslint-utils": "^1.4.2", "regexpp": "^2.0.1" + }, + "dependencies": { + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + } } }, "eslint-plugin-import": { - "version": "2.18.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz", - "integrity": "sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ==", + "version": "2.19.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.19.1.tgz", + "integrity": "sha512-x68131aKoCZlCae7rDXKSAQmbT5DQuManyXo2sK6fJJ0aK5CWAkv6A6HJZGgqC8IhjQxYPgo6/IY4Oz8AFsbBw==", "dev": true, "requires": { "array-includes": "^3.0.3", + "array.prototype.flat": "^1.2.1", "contains-path": "^0.1.0", "debug": "^2.6.9", "doctrine": "1.5.0", "eslint-import-resolver-node": "^0.3.2", - "eslint-module-utils": "^2.4.0", + "eslint-module-utils": "^2.4.1", "has": "^1.0.3", "minimatch": "^3.0.4", "object.values": "^1.1.0", "read-pkg-up": "^2.0.0", - "resolve": "^1.11.0" + "resolve": "^1.12.0" }, "dependencies": { "doctrine": { @@ -2017,13 +2157,13 @@ } }, "eslint-plugin-node": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-9.1.0.tgz", - "integrity": "sha512-ZwQYGm6EoV2cfLpE1wxJWsfnKUIXfM/KM09/TlorkukgCAwmkgajEJnPCmyzoFPQQkmvo5DrW/nyKutNIw36Mw==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-9.2.0.tgz", + "integrity": "sha512-2abNmzAH/JpxI4gEOwd6K8wZIodK3BmHbTxz4s79OIYwwIt2gkpEXlAouJXu4H1c9ySTnRso0tsuthSOZbUMlA==", "dev": true, "requires": { - "eslint-plugin-es": "^1.4.0", - "eslint-utils": "^1.3.1", + "eslint-plugin-es": "^1.4.1", + "eslint-utils": "^1.4.2", "ignore": "^5.1.1", "minimatch": "^3.0.4", "resolve": "^1.10.1", @@ -2031,24 +2171,15 @@ }, "dependencies": { "ignore": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.2.tgz", - "integrity": "sha512-vdqWBp7MyzdmHkkRWV5nY+PfGRbYbahfuvsBCh277tq+w9zyNi7h5CYJCK0kmzti9kU+O/cB7sE8HvKv6aXAKQ==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", + "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", "dev": true }, - "resolve": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", - "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, "semver": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz", - "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } @@ -2066,9 +2197,9 @@ "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==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", "dev": true, "requires": { "esrecurse": "^4.1.0", @@ -2076,10 +2207,13 @@ } }, "eslint-utils": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz", - "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==", - "dev": true + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } }, "eslint-visitor-keys": { "version": "1.1.0", @@ -2088,13 +2222,13 @@ "dev": true }, "espree": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.1.tgz", - "integrity": "sha512-EYbr8XZUhWbYCqQRW0duU5LxzL5bETN6AjKBGy1302qqzPaCH10QbRg3Wvco79Z8x9WbiE8HYB4e75xl6qUYvQ==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", + "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", "dev": true, "requires": { - "acorn": "^7.0.0", - "acorn-jsx": "^5.0.2", + "acorn": "^7.1.0", + "acorn-jsx": "^5.1.0", "eslint-visitor-keys": "^1.1.0" } }, @@ -2389,9 +2523,9 @@ } }, "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", + "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", "dev": true, "requires": { "escape-string-regexp": "^1.0.5" @@ -3139,24 +3273,12 @@ } }, "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", "dev": true, "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } + "is-glob": "^4.0.1" } }, "global-dirs": { @@ -3352,9 +3474,9 @@ "dev": true }, "import-fresh": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", - "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", "dev": true, "requires": { "parent-module": "^1.0.0", @@ -3416,32 +3538,75 @@ "dev": true }, "inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.0.tgz", + "integrity": "sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ==", "dev": true, "requires": { - "ansi-escapes": "^3.2.0", + "ansi-escapes": "^4.2.1", "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", + "cli-cursor": "^3.1.0", "cli-width": "^2.0.0", "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", "run-async": "^2.2.0", "rxjs": "^6.4.0", - "string-width": "^2.1.0", + "string-width": "^4.1.0", "strip-ansi": "^5.1.0", "through": "^2.3.6" }, "dependencies": { + "ansi-escapes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", + "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "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 + }, + "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" + }, + "dependencies": { + "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-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", @@ -3449,6 +3614,14 @@ "dev": true, "requires": { "ansi-regex": "^4.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 + } } } } @@ -3700,9 +3873,9 @@ } }, "is-retry-allowed": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", "dev": true }, "is-stream": { @@ -4706,6 +4879,12 @@ "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", @@ -4945,9 +5124,9 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, "nan": { @@ -5035,18 +5214,18 @@ } }, "nodemon": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.19.1.tgz", - "integrity": "sha512-/DXLzd/GhiaDXXbGId5BzxP1GlsqtMGM9zTmkWrgXtSqjKmGSbLicM/oAy4FR0YWm14jCHRwnR31AHS2dYFHrg==", + "version": "1.19.4", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.19.4.tgz", + "integrity": "sha512-VGPaqQBNk193lrJFotBU8nvWZPqEZY2eIzymy2jjY0fJ9qIsxA0sxQ8ATPl0gZC645gijYEc1jtZvpS8QWzJGQ==", "dev": true, "requires": { - "chokidar": "^2.1.5", - "debug": "^3.1.0", + "chokidar": "^2.1.8", + "debug": "^3.2.6", "ignore-by-default": "^1.0.1", "minimatch": "^3.0.4", - "pstree.remy": "^1.1.6", - "semver": "^5.5.0", - "supports-color": "^5.2.0", + "pstree.remy": "^1.1.7", + "semver": "^5.7.1", + "supports-color": "^5.5.0", "touch": "^3.1.0", "undefsafe": "^2.0.2", "update-notifier": "^2.5.0" @@ -5066,6 +5245,12 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true } } }, @@ -5157,6 +5342,12 @@ } } }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, "object-is": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", @@ -5176,6 +5367,18 @@ "isobject": "^3.0.0" } }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, "object.getownpropertydescriptors": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", @@ -5196,15 +5399,59 @@ } }, "object.values": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", - "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", "dev": true, "requires": { "define-properties": "^1.1.3", - "es-abstract": "^1.12.0", + "es-abstract": "^1.17.0-next.1", "function-bind": "^1.1.1", "has": "^1.0.3" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0-next.1.tgz", + "integrity": "sha512-7MmGr03N7Rnuid6+wyhD9sHNE2n4tFSwExnU2lQl3lIo2ShXWGePY80zYaoMOmILWv57H0amMjZGHNzzGG70Rw==", + "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.1.4", + "is-regex": "^1.0.4", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.0", + "string.prototype.trimright": "^2.1.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": { + "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 + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + } } }, "on-finished": { @@ -5225,20 +5472,12 @@ } }, "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "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": "^1.0.0" - }, - "dependencies": { - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - } + "mimic-fn": "^2.1.0" } }, "optimist": { @@ -5579,9 +5818,9 @@ } }, "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "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": { @@ -5674,6 +5913,14 @@ "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "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 + } } }, "react-is": { @@ -5813,9 +6060,9 @@ } }, "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.0.0.tgz", + "integrity": "sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g==", "dev": true }, "registry-auth-token": { @@ -5978,12 +6225,12 @@ "dev": true }, "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "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": "^2.0.0", + "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, @@ -6503,6 +6750,26 @@ } } }, + "string.prototype.trimleft": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", + "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", + "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -6534,9 +6801,9 @@ "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=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", "dev": true }, "supports-color": { @@ -6832,15 +7099,16 @@ "dev": true }, "ts-jest": { - "version": "24.0.2", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-24.0.2.tgz", - "integrity": "sha512-h6ZCZiA1EQgjczxq+uGLXQlNgeg02WWJBbeT8j6nyIBRQdglqbvzDoHahTEIiS6Eor6x8mK6PfZ7brQ9Q6tzHw==", + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-24.2.0.tgz", + "integrity": "sha512-Yc+HLyldlIC9iIK8xEN7tV960Or56N49MDP7hubCZUeI7EbIOTsas6rXCMB4kQjLACJ7eDOF4xWEO5qumpKsag==", "dev": true, "requires": { "bs-logger": "0.x", "buffer-from": "1.x", "fast-json-stable-stringify": "2.x", "json5": "2.x", + "lodash.memoize": "4.x", "make-error": "1.x", "mkdirp": "0.x", "resolve": "1.x", @@ -6904,6 +7172,12 @@ "prelude-ls": "~1.1.2" } }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -6914,9 +7188,9 @@ } }, "typescript": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.6.2.tgz", - "integrity": "sha512-lmQ4L+J6mnu3xweP8+rOrUwzmN+MRAj7TgtJtDaXE5PMyX2kCrklhg3rvOsOIfNeAWMQWO2F1GPc1kMD2vLAfw==", + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.3.tgz", + "integrity": "sha512-Mcr/Qk7hXqFBXMN7p7Lusj1ktCBydylfQM/FZCk5glCNQJrCUKPkMHdo9R0MTFWsC/4kPFvDS0fDPvukfCkFsw==", "dev": true }, "uglify-js": { @@ -7035,9 +7309,9 @@ "dev": true }, "upath": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", - "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", "dev": true }, "update-notifier": { @@ -7238,6 +7512,12 @@ "string-width": "^2.1.1" } }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", diff --git a/scheduler/package.json b/scheduler/package.json index 10ba2805a..39889cac4 100644 --- a/scheduler/package.json +++ b/scheduler/package.json @@ -21,28 +21,28 @@ "author": "", "dependencies": { "axios": "^0.19.0", - "deep-equal": "^1.1.0", + "deep-equal": "^1.1.1", "express": "^4.17.1", "node-schedule": "^1.3.2" }, "devDependencies": { "@types/deep-equal": "^1.0.1", - "@types/express": "^4.17.1", - "@types/jest": "^24.0.18", + "@types/express": "^4.17.2", + "@types/jest": "^24.0.23", "@types/node-schedule": "^1.2.4", - "@typescript-eslint/eslint-plugin": "^2.0.0", - "@typescript-eslint/parser": "^2.0.0", + "@typescript-eslint/eslint-plugin": "^2.11.0", + "@typescript-eslint/parser": "^2.11.0", "concurrently": "^4.1.2", - "jest": "^24.9.0", - "nodemon": "^1.19.1", - "ts-jest": "^24.0.2", - "tslib": "^1.10.0", - "typescript": "^3.6.2", - "eslint": "^6.2.2", + "eslint": "^6.7.2", "eslint-config-standard": "^14.1.0", - "eslint-plugin-import": "^2.18.2", - "eslint-plugin-node": "^9.1.0", + "eslint-plugin-import": "^2.19.1", + "eslint-plugin-node": "^9.2.0", "eslint-plugin-promise": "^4.2.1", - "eslint-plugin-standard": "^4.0.1" + "eslint-plugin-standard": "^4.0.1", + "jest": "^24.9.0", + "nodemon": "^1.19.4", + "ts-jest": "^24.2.0", + "tslib": "^1.10.0", + "typescript": "^3.7.3" } } From 835518873d9b4583a5255514ca22a0e0e8e09fd6 Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Fri, 13 Dec 2019 10:29:49 +0100 Subject: [PATCH 0258/1168] Scheduler: upgrade integration test libraries --- scheduler/integration-test/package-lock.json | 117 +++++++++++-------- scheduler/integration-test/package.json | 2 +- 2 files changed, 70 insertions(+), 49 deletions(-) diff --git a/scheduler/integration-test/package-lock.json b/scheduler/integration-test/package-lock.json index 658e6e269..cb57849d1 100644 --- a/scheduler/integration-test/package-lock.json +++ b/scheduler/integration-test/package-lock.json @@ -218,9 +218,9 @@ } }, "@hapi/address": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.0.0.tgz", - "integrity": "sha512-mV6T0IYqb0xL1UALPFplXYQmR0twnXG0M6jUswpquqT2sD12BOiCiLy3EvMp/Fy7s3DZElC4/aPjEjo2jeZpvw==" + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", + "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==" }, "@hapi/bourne": { "version": "1.3.2", @@ -228,9 +228,9 @@ "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==" }, "@hapi/hoek": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.2.1.tgz", - "integrity": "sha512-JPiBy+oSmsq3St7XlipfN5pNA6bDJ1kpa73PrK/zR29CVClDVqy04AanM/M/qx5bSF+I61DdCfAvRrujau+zRg==" + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.0.tgz", + "integrity": "sha512-7XYT10CZfPsH7j9F1Jmg1+d0ezOux2oM2GfArAzLwWe4mE2Dr3hVjsAL6+TFY49RRJlCdJDMw3nJsLFroTc8Kw==" }, "@hapi/joi": { "version": "15.1.1", @@ -244,11 +244,11 @@ } }, "@hapi/topo": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.3.tgz", - "integrity": "sha512-JmS9/vQK6dcUYn7wc2YZTqzIKubAQcJKu2KCKAru6es482U5RT5fP1EXCPtlXpiK7PR0On/kpQKI4fRKkzpZBQ==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", "requires": { - "@hapi/hoek": "8.x.x" + "@hapi/hoek": "^8.3.0" } }, "@jest/console": { @@ -997,9 +997,9 @@ } }, "chokidar": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", - "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", "dev": true, "requires": { "anymatch": "^2.0.0", @@ -1205,12 +1205,19 @@ "dev": true }, "cookies": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.7.3.tgz", - "integrity": "sha512-+gixgxYSgQLTaTIilDHAdlNPZDENDQernEMiIcZpYYP14zgHsCt4Ce1FEjFtcp6GefhozebB6orvhAAWx/IS0A==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", + "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", "requires": { - "depd": "~1.1.2", - "keygrip": "~1.0.3" + "depd": "~2.0.0", + "keygrip": "~1.1.0" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + } } }, "copy-descriptor": { @@ -1225,9 +1232,9 @@ "integrity": "sha1-JoD7uAaKSNCGVrYJgJK9r8kG9KU=" }, "core-js": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", - "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==" + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" }, "core-util-is": { "version": "1.0.2", @@ -1473,6 +1480,11 @@ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, "end-of-stream": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", @@ -2922,9 +2934,9 @@ } }, "is-retry-allowed": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", "dev": true }, "is-stream": { @@ -3591,9 +3603,12 @@ } }, "keygrip": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.0.3.tgz", - "integrity": "sha512-/PpesirAIfaklxUzp4Yb7xBper9MwP6hNRA6BGGUFCgbJ+BM5CKBtsoxinNXkLHAr+GXS1/lSlF2rP7cv5Fl+g==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", + "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", + "requires": { + "tsscmp": "1.0.6" + } }, "kind-of": { "version": "6.0.2", @@ -3608,19 +3623,20 @@ "dev": true }, "koa": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.8.1.tgz", - "integrity": "sha512-iCgjRkntcVud5amnioi+79r7TPVhKPfCY8UzL9GjyU+nIWTE9xsqyrJ6kib3InT9JYRyUu9Y67i5apCjf997TQ==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.11.0.tgz", + "integrity": "sha512-EpR9dElBTDlaDgyhDMiLkXrPwp6ZqgAIBvhhmxQ9XN4TFgW+gEz6tkcsNI6BnUbUftrKDjVFj4lW2/J2aNBMMA==", "requires": { "accepts": "^1.3.5", "cache-content-type": "^1.0.0", "content-disposition": "~0.5.2", "content-type": "^1.0.4", - "cookies": "~0.7.1", + "cookies": "~0.8.0", "debug": "~3.1.0", "delegates": "^1.0.0", "depd": "^1.1.2", "destroy": "^1.0.4", + "encodeurl": "^1.0.2", "error-inject": "^1.0.0", "escape-html": "^1.0.3", "fresh": "~0.5.2", @@ -3629,7 +3645,6 @@ "is-generator-function": "^1.0.7", "koa-compose": "^4.1.0", "koa-convert": "^1.2.0", - "koa-is-json": "^1.0.0", "on-finished": "^2.3.0", "only": "~0.0.2", "parseurl": "^1.3.2", @@ -3681,11 +3696,6 @@ } } }, - "koa-is-json": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/koa-is-json/-/koa-is-json-1.0.0.tgz", - "integrity": "sha1-JzwH7c3Ljfaiwat9We52SRRR7BQ=" - }, "koa-router": { "version": "7.4.0", "resolved": "https://registry.npmjs.org/koa-router/-/koa-router-7.4.0.tgz", @@ -4042,18 +4052,18 @@ } }, "nodemon": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.19.1.tgz", - "integrity": "sha512-/DXLzd/GhiaDXXbGId5BzxP1GlsqtMGM9zTmkWrgXtSqjKmGSbLicM/oAy4FR0YWm14jCHRwnR31AHS2dYFHrg==", + "version": "1.19.4", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.19.4.tgz", + "integrity": "sha512-VGPaqQBNk193lrJFotBU8nvWZPqEZY2eIzymy2jjY0fJ9qIsxA0sxQ8ATPl0gZC645gijYEc1jtZvpS8QWzJGQ==", "dev": true, "requires": { - "chokidar": "^2.1.5", - "debug": "^3.1.0", + "chokidar": "^2.1.8", + "debug": "^3.2.6", "ignore-by-default": "^1.0.1", "minimatch": "^3.0.4", - "pstree.remy": "^1.1.6", - "semver": "^5.5.0", - "supports-color": "^5.2.0", + "pstree.remy": "^1.1.7", + "semver": "^5.7.1", + "supports-color": "^5.5.0", "touch": "^3.1.0", "undefsafe": "^2.0.2", "update-notifier": "^2.5.0" @@ -4073,6 +4083,12 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true } } }, @@ -5480,6 +5496,11 @@ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", "dev": true }, + "tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==" + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -5627,9 +5648,9 @@ "dev": true }, "upath": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", - "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", "dev": true }, "update-notifier": { diff --git a/scheduler/integration-test/package.json b/scheduler/integration-test/package.json index 623cc0ff0..6e484b5c1 100644 --- a/scheduler/integration-test/package.json +++ b/scheduler/integration-test/package.json @@ -14,7 +14,7 @@ }, "devDependencies": { "jest": "^24.9.0", - "nodemon": "^1.19.1", + "nodemon": "^1.19.4", "supertest": "^4.0.2" }, "jest": { From 91c91bb328853993181364b7e0deec34009816bb Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Fri, 13 Dec 2019 13:49:17 +0100 Subject: [PATCH 0259/1168] UI: update dependencies minor versions --- ui/package-lock.json | 3025 ++++++++++++++++++++++++++---------------- ui/package.json | 42 +- 2 files changed, 1877 insertions(+), 1190 deletions(-) diff --git a/ui/package-lock.json b/ui/package-lock.json index a6c5e6874..480d4318f 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -1,5 +1,5 @@ { - "name": "ods-webclient", + "name": "webclient", "version": "0.1.0", "lockfileVersion": 1, "requires": true, @@ -14,19 +14,19 @@ } }, "@babel/core": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.5.5.tgz", - "integrity": "sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg==", + "version": "7.7.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.7.5.tgz", + "integrity": "sha512-M42+ScN4+1S9iB6f+TL7QBpoQETxbclx+KNoKJABghnKYE+fMzSGqst0BZJc8CpI625bwPwYgUyRvxZ+0mZzpw==", "dev": true, "requires": { "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.5.5", - "@babel/helpers": "^7.5.5", - "@babel/parser": "^7.5.5", - "@babel/template": "^7.4.4", - "@babel/traverse": "^7.5.5", - "@babel/types": "^7.5.5", - "convert-source-map": "^1.1.0", + "@babel/generator": "^7.7.4", + "@babel/helpers": "^7.7.4", + "@babel/parser": "^7.7.5", + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4", + "convert-source-map": "^1.7.0", "debug": "^4.1.0", "json5": "^2.1.0", "lodash": "^4.17.13", @@ -44,16 +44,15 @@ } }, "@babel/generator": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", - "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.4.tgz", + "integrity": "sha512-m5qo2WgdOJeyYngKImbkyQrnUN1mPceaG5BV+G0E3gWsa4l/jCSryWJdM2x8OuGAOyh+3d5pVYfZWCiNFtynxg==", "dev": true, "requires": { - "@babel/types": "^7.5.5", + "@babel/types": "^7.7.4", "jsesc": "^2.5.1", "lodash": "^4.17.13", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" + "source-map": "^0.5.0" }, "dependencies": { "lodash": { @@ -65,57 +64,67 @@ } }, "@babel/helper-annotate-as-pure": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz", - "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.4.tgz", + "integrity": "sha512-2BQmQgECKzYKFPpiycoF9tlb5HA4lrVyAmLLVK177EcQAqjVLciUb2/R+n1boQ9y5ENV3uz2ZqiNw7QMBBw1Og==", "dev": true, "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.7.4" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz", - "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.7.4.tgz", + "integrity": "sha512-Biq/d/WtvfftWZ9Uf39hbPBYDUo986m5Bb4zhkeYDGUllF43D+nUe5M6Vuo6/8JDK/0YX/uBdeoQpyaNhNugZQ==", "dev": true, "requires": { - "@babel/helper-explode-assignable-expression": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/helper-explode-assignable-expression": "^7.7.4", + "@babel/types": "^7.7.4" } }, "@babel/helper-call-delegate": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz", - "integrity": "sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.7.4.tgz", + "integrity": "sha512-8JH9/B7J7tCYJ2PpWVpw9JhPuEVHztagNVuQAFBVFYluRMlpG7F1CgKEgGeL6KFqcsIa92ZYVj6DSc0XwmN1ZA==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.4.4", - "@babel/traverse": "^7.4.4", - "@babel/types": "^7.4.4" + "@babel/helper-hoist-variables": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4" } }, "@babel/helper-create-class-features-plugin": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.5.5.tgz", - "integrity": "sha512-ZsxkyYiRA7Bg+ZTRpPvB6AbOFKTFFK4LrvTet8lInm0V468MWCaSYJE+I7v2z2r8KNLtYiV+K5kTCnR7dvyZjg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.7.4.tgz", + "integrity": "sha512-l+OnKACG4uiDHQ/aJT8dwpR+LhCJALxL0mJ6nzjB25e5IPwqV1VOsY7ah6UB1DG+VOXAIMtuC54rFJGiHkxjgA==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-member-expression-to-functions": "^7.5.5", - "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-function-name": "^7.7.4", + "@babel/helper-member-expression-to-functions": "^7.7.4", + "@babel/helper-optimise-call-expression": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.5.5", - "@babel/helper-split-export-declaration": "^7.4.4" + "@babel/helper-replace-supers": "^7.7.4", + "@babel/helper-split-export-declaration": "^7.7.4" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.7.4.tgz", + "integrity": "sha512-Mt+jBKaxL0zfOIWrfQpnfYCN7/rS6GKx6CCCfuoqVVd+17R8zNDlzVYmIi9qyb2wOk002NsmSTDymkIygDUH7A==", + "dev": true, + "requires": { + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.6.0" } }, "@babel/helper-define-map": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz", - "integrity": "sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.7.4.tgz", + "integrity": "sha512-v5LorqOa0nVQUvAUTUF3KPastvUt/HzByXNamKQ6RdJRTV7j8rLL+WB5C/MzzWAwOomxDhYFb1wLLxHqox86lg==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/types": "^7.5.5", + "@babel/helper-function-name": "^7.7.4", + "@babel/types": "^7.7.4", "lodash": "^4.17.13" }, "dependencies": { @@ -128,73 +137,73 @@ } }, "@babel/helper-explode-assignable-expression": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz", - "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.7.4.tgz", + "integrity": "sha512-2/SicuFrNSXsZNBxe5UGdLr+HZg+raWBLE9vC98bdYOKX/U6PY0mdGlYUJdtTDPSU0Lw0PNbKKDpwYHJLn2jLg==", "dev": true, "requires": { - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4" } }, "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", + "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/helper-get-function-arity": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4" } }, "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", + "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", "dev": true, "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.7.4" } }, "@babel/helper-hoist-variables": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz", - "integrity": "sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.7.4.tgz", + "integrity": "sha512-wQC4xyvc1Jo/FnLirL6CEgPgPCa8M74tOdjWpRhQYapz5JC7u3NYU1zCVoVAGCE3EaIP9T1A3iW0WLJ+reZlpQ==", "dev": true, "requires": { - "@babel/types": "^7.4.4" + "@babel/types": "^7.7.4" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz", - "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.4.tgz", + "integrity": "sha512-9KcA1X2E3OjXl/ykfMMInBK+uVdfIVakVe7W7Lg3wfXUNyS3Q1HWLFRwZIjhqiCGbslummPDnmb7vIekS0C1vw==", "dev": true, "requires": { - "@babel/types": "^7.5.5" + "@babel/types": "^7.7.4" } }, "@babel/helper-module-imports": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", - "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.7.4.tgz", + "integrity": "sha512-dGcrX6K9l8258WFjyDLJwuVKxR4XZfU0/vTUgOQYWEnRD8mgr+p4d6fCUMq/ys0h4CCt/S5JhbvtyErjWouAUQ==", "dev": true, "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.7.4" } }, "@babel/helper-module-transforms": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz", - "integrity": "sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw==", + "version": "7.7.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.7.5.tgz", + "integrity": "sha512-A7pSxyJf1gN5qXVcidwLWydjftUN878VkalhXX5iQDuGyiGK3sOrrKKHF4/A4fwHtnsotv/NipwAeLzY4KQPvw==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-simple-access": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/template": "^7.4.4", - "@babel/types": "^7.5.5", + "@babel/helper-module-imports": "^7.7.4", + "@babel/helper-simple-access": "^7.7.4", + "@babel/helper-split-export-declaration": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4", "lodash": "^4.17.13" }, "dependencies": { @@ -207,12 +216,12 @@ } }, "@babel/helper-optimise-call-expression": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz", - "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.4.tgz", + "integrity": "sha512-VB7gWZ2fDkSuqW6b1AKXkJWO5NyNI3bFL/kK79/30moK57blr6NbH8xcl2XcKCwOmJosftWunZqfO84IGq3ZZg==", "dev": true, "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.7.4" } }, "@babel/helper-plugin-utils": { @@ -239,70 +248,70 @@ } }, "@babel/helper-remap-async-to-generator": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz", - "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.7.4.tgz", + "integrity": "sha512-Sk4xmtVdM9sA/jCI80f+KS+Md+ZHIpjuqmYPk1M7F/upHou5e4ReYmExAiu6PVe65BhJPZA2CY9x9k4BqE5klw==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-wrap-function": "^7.1.0", - "@babel/template": "^7.1.0", - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/helper-annotate-as-pure": "^7.7.4", + "@babel/helper-wrap-function": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4" } }, "@babel/helper-replace-supers": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz", - "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.7.4.tgz", + "integrity": "sha512-pP0tfgg9hsZWo5ZboYGuBn/bbYT/hdLPVSS4NMmiRJdwWhP0IznPwN9AE1JwyGsjSPLC364I0Qh5p+EPkGPNpg==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.5.5", - "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/traverse": "^7.5.5", - "@babel/types": "^7.5.5" + "@babel/helper-member-expression-to-functions": "^7.7.4", + "@babel/helper-optimise-call-expression": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4" } }, "@babel/helper-simple-access": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz", - "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.7.4.tgz", + "integrity": "sha512-zK7THeEXfan7UlWsG2A6CI/L9jVnI5+xxKZOdej39Y0YtDYKx9raHk5F2EtK9K8DHRTihYwg20ADt9S36GR78A==", "dev": true, "requires": { - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4" } }, "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", + "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", "dev": true, "requires": { - "@babel/types": "^7.4.4" + "@babel/types": "^7.7.4" } }, "@babel/helper-wrap-function": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz", - "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.7.4.tgz", + "integrity": "sha512-VsfzZt6wmsocOaVU0OokwrIytHND55yvyT4BPB9AIIgwr8+x7617hetdJTsuGwygN5RC6mxA9EJztTjuwm2ofg==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/template": "^7.1.0", - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.2.0" + "@babel/helper-function-name": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4" } }, "@babel/helpers": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.5.5.tgz", - "integrity": "sha512-nRq2BUhxZFnfEn/ciJuhklHvFOqjJUD5wpx+1bxUF2axL9C+v4DE/dmp5sT2dKnpOs4orZWzpAZqlCy8QqE/7g==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.7.4.tgz", + "integrity": "sha512-ak5NGZGJ6LV85Q1Zc9gn2n+ayXOizryhjSUBTdu5ih1tlVCJeuQENzc4ItyCVhINVXvIT/ZQ4mheGIsfBkpskg==", "dev": true, "requires": { - "@babel/template": "^7.4.4", - "@babel/traverse": "^7.5.5", - "@babel/types": "^7.5.5" + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4" } }, "@babel/highlight": { @@ -317,180 +326,179 @@ } }, "@babel/parser": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", - "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==", + "version": "7.7.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.5.tgz", + "integrity": "sha512-KNlOe9+/nk4i29g0VXgl8PEXIRms5xKLJeuZ6UptN0fHv+jDiriG+y94X6qAgWTR0h3KaoM1wK5G5h7MHFRSig==", "dev": true }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz", - "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.7.4.tgz", + "integrity": "sha512-1ypyZvGRXriY/QP668+s8sFr2mqinhkRDMPSQLNghCQE+GAkFtp+wkHVvg2+Hdki8gwP+NFzJBJ/N1BfzCCDEw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-remap-async-to-generator": "^7.1.0", - "@babel/plugin-syntax-async-generators": "^7.2.0" + "@babel/helper-remap-async-to-generator": "^7.7.4", + "@babel/plugin-syntax-async-generators": "^7.7.4" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.5.5.tgz", - "integrity": "sha512-AF79FsnWFxjlaosgdi421vmYG6/jg79bVD0dpD44QdgobzHKuLZ6S3vl8la9qIeSwGi8i1fS0O1mfuDAAdo1/A==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.7.4.tgz", + "integrity": "sha512-EcuXeV4Hv1X3+Q1TsuOmyyxeTRiSqurGJ26+I/FW1WbymmRRapVORm6x1Zl3iDIHyRxEs+VXWp6qnlcfcJSbbw==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.5.5", + "@babel/helper-create-class-features-plugin": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-proposal-decorators": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.4.4.tgz", - "integrity": "sha512-z7MpQz3XC/iQJWXH9y+MaWcLPNSMY9RQSthrLzak8R8hCj0fuyNk+Dzi9kfNe/JxxlWQ2g7wkABbgWjW36MTcw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.7.4.tgz", + "integrity": "sha512-GftcVDcLCwVdzKmwOBDjATd548+IE+mBo7ttgatqNDR7VG7GqIuZPtRWlMLHbhTXhcnFZiGER8iIYl1n/imtsg==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.4.4", + "@babel/helper-create-class-features-plugin": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-decorators": "^7.2.0" + "@babel/plugin-syntax-decorators": "^7.7.4" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", - "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.7.4.tgz", + "integrity": "sha512-wQvt3akcBTfLU/wYoqm/ws7YOAQKu8EVJEvHip/mzkNtjaclQoCCIqKXFP5/eyfnfbQCDV3OLRIK3mIVyXuZlw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-json-strings": "^7.2.0" + "@babel/plugin-syntax-json-strings": "^7.7.4" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz", - "integrity": "sha512-F2DxJJSQ7f64FyTVl5cw/9MWn6naXGdk3Q3UhDbFEEHv+EilCPoeRD3Zh/Utx1CJz4uyKlQ4uH+bJPbEhMV7Zw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.7.4.tgz", + "integrity": "sha512-rnpnZR3/iWKmiQyJ3LKJpSwLDcX/nSXhdLk4Aq/tXOApIvyu7qoabrige0ylsAJffaUC51WiBu209Q0U+86OWQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + "@babel/plugin-syntax-object-rest-spread": "^7.7.4" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz", - "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.7.4.tgz", + "integrity": "sha512-DyM7U2bnsQerCQ+sejcTNZh8KQEUuC3ufzdnVnSiUv/qoGJp2Z3hanKL18KDhsBT5Wj6a7CMT5mdyCNJsEaA9w==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" + "@babel/plugin-syntax-optional-catch-binding": "^7.7.4" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz", - "integrity": "sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.4.tgz", + "integrity": "sha512-cHgqHgYvffluZk85dJ02vloErm3Y6xtH+2noOBOJ2kXOJH3aVCDnj5eR/lVNlTnYu4hndAPJD3rTFjW3qee0PA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.5.4" + "@babel/helper-create-regexp-features-plugin": "^7.7.4", + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-syntax-async-generators": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz", - "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.7.4.tgz", + "integrity": "sha512-Li4+EjSpBgxcsmeEF8IFcfV/+yJGxHXDirDkEoyFjumuwbmfCVHUt0HuowD/iGM7OhIRyXJH9YXxqiH6N815+g==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-syntax-decorators": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.2.0.tgz", - "integrity": "sha512-38QdqVoXdHUQfTpZo3rQwqQdWtCn5tMv4uV6r2RMfTqNBuv4ZBhz79SfaQWKTVmxHjeFv/DnXVC/+agHCklYWA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.7.4.tgz", + "integrity": "sha512-0oNLWNH4k5ZbBVfAwiTU53rKFWIeTh6ZlaWOXWJc4ywxs0tjz5fc3uZ6jKAnZSxN98eXVgg7bJIuzjX+3SXY+A==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-syntax-dynamic-import": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz", - "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.7.4.tgz", + "integrity": "sha512-jHQW0vbRGvwQNgyVxwDh4yuXu4bH1f5/EICJLAhl1SblLs2CDhrsmCk+v5XLdE9wxtAFRyxx+P//Iw+a5L/tTg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-syntax-json-strings": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz", - "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.7.4.tgz", + "integrity": "sha512-QpGupahTQW1mHRXddMG5srgpHWqRLwJnJZKXTigB9RPFCCGbDGCgBeM/iC82ICXp414WeYx/tD54w7M2qRqTMg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-syntax-jsx": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz", - "integrity": "sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.7.4.tgz", + "integrity": "sha512-wuy6fiMe9y7HeZBWXYCGt2RGxZOj0BImZ9EyXJVnVGBKO/Br592rbR3rtIQn0eQhAk9vqaKP5n8tVqEFBQMfLg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-syntax-object-rest-spread": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", - "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.7.4.tgz", + "integrity": "sha512-mObR+r+KZq0XhRVS2BrBKBpr5jqrqzlPvS9C9vuOf5ilSwzloAl7RPWLrgKdWS6IreaVrjHxTjtyqFiOisaCwg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz", - "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.7.4.tgz", + "integrity": "sha512-4ZSuzWgFxqHRE31Glu+fEr/MirNZOMYmD/0BhBWyLyOOQz/gTAl7QmWm2hX1QxEIXsr2vkdlwxIzTyiYRC4xcQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz", - "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.7.4.tgz", + "integrity": "sha512-zUXy3e8jBNPiffmqkHRNDdZM2r8DWhCB7HhcoyZjiK1TxYEluLHAvQuYnTT+ARqRpabWqy/NHkO6e3MsYB5YfA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz", - "integrity": "sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.7.4.tgz", + "integrity": "sha512-zpUTZphp5nHokuy8yLlyafxCJ0rSlFoSHypTUWgpdwoDXWQcseaect7cJ8Ppk6nunOM6+5rPMkod4OYKPR5MUg==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-module-imports": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-remap-async-to-generator": "^7.1.0" + "@babel/helper-remap-async-to-generator": "^7.7.4" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz", - "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.7.4.tgz", + "integrity": "sha512-kqtQzwtKcpPclHYjLK//3lH8OFsCDuDJBaFhVwf8kqdnF6MN4l618UDlcA7TfRs3FayrHj+svYnSX8MC9zmUyQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.5.5.tgz", - "integrity": "sha512-82A3CLRRdYubkG85lKwhZB0WZoHxLGsJdux/cOVaJCJpvYFl1LVzAIFyRsa7CvXqW8rBM4Zf3Bfn8PHt5DP0Sg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.7.4.tgz", + "integrity": "sha512-2VBe9u0G+fDt9B5OV5DQH4KBf5DoiNkwFKOz0TCvBWvdAN2rOykCTkrL+jTLxfCAm76l9Qo5OqL7HBOx2dWggg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", @@ -506,196 +514,195 @@ } }, "@babel/plugin-transform-classes": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz", - "integrity": "sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.7.4.tgz", + "integrity": "sha512-sK1mjWat7K+buWRuImEzjNf68qrKcrddtpQo3swi9j7dUcG6y6R6+Di039QN2bD1dykeswlagupEmpOatFHHUg==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-define-map": "^7.5.5", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-annotate-as-pure": "^7.7.4", + "@babel/helper-define-map": "^7.7.4", + "@babel/helper-function-name": "^7.7.4", + "@babel/helper-optimise-call-expression": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.5.5", - "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/helper-replace-supers": "^7.7.4", + "@babel/helper-split-export-declaration": "^7.7.4", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz", - "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.7.4.tgz", + "integrity": "sha512-bSNsOsZnlpLLyQew35rl4Fma3yKWqK3ImWMSC/Nc+6nGjC9s5NFWAer1YQ899/6s9HxO2zQC1WoFNfkOqRkqRQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-destructuring": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.5.0.tgz", - "integrity": "sha512-YbYgbd3TryYYLGyC7ZR+Tq8H/+bCmwoaxHfJHupom5ECstzbRLTch6gOQbhEY9Z4hiCNHEURgq06ykFv9JZ/QQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.7.4.tgz", + "integrity": "sha512-4jFMXI1Cu2aXbcXXl8Lr6YubCn6Oc7k9lLsu8v61TZh+1jny2BWmdtvY9zSUlLdGUvcy9DMAWyZEOqjsbeg/wA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz", - "integrity": "sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.4.tgz", + "integrity": "sha512-mk0cH1zyMa/XHeb6LOTXTbG7uIJ8Rrjlzu91pUx/KS3JpcgaTDwMS8kM+ar8SLOvlL2Lofi4CGBAjCo3a2x+lw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.5.4" + "@babel/helper-create-regexp-features-plugin": "^7.7.4", + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz", - "integrity": "sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.7.4.tgz", + "integrity": "sha512-g1y4/G6xGWMD85Tlft5XedGaZBCIVN+/P0bs6eabmcPP9egFleMAo65OOjlhcz1njpwagyY3t0nsQC9oTFegJA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz", - "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.7.4.tgz", + "integrity": "sha512-MCqiLfCKm6KEA1dglf6Uqq1ElDIZwFuzz1WH5mTf8k2uQSxEJMbOIEh7IZv7uichr7PMfi5YVSrr1vz+ipp7AQ==", "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-for-of": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz", - "integrity": "sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.7.4.tgz", + "integrity": "sha512-zZ1fD1B8keYtEcKF+M1TROfeHTKnijcVQm0yO/Yu1f7qoDoxEIc/+GX6Go430Bg84eM/xwPFp0+h4EbZg7epAA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-function-name": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz", - "integrity": "sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.7.4.tgz", + "integrity": "sha512-E/x09TvjHNhsULs2IusN+aJNRV5zKwxu1cpirZyRPw+FyyIKEHPXTsadj48bVpc1R5Qq1B5ZkzumuFLytnbT6g==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.1.0", + "@babel/helper-function-name": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz", - "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.7.4.tgz", + "integrity": "sha512-X2MSV7LfJFm4aZfxd0yLVFrEXAgPqYoDG53Br/tCKiKYfX0MjVjQeWPIhPHHsCqzwQANq+FLN786fF5rgLS+gw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz", - "integrity": "sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg==", + "version": "7.7.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.7.5.tgz", + "integrity": "sha512-CT57FG4A2ZUNU1v+HdvDSDrjNWBrtCmSH6YbbgN3Lrf0Di/q/lWRxZrE72p3+HCCz9UjfZOEBdphgC0nzOS6DQ==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-module-transforms": "^7.7.5", "@babel/helper-plugin-utils": "^7.0.0", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.5.0.tgz", - "integrity": "sha512-xmHq0B+ytyrWJvQTc5OWAC4ii6Dhr0s22STOoydokG51JjWhyYo5mRPXoi+ZmtHQhZZwuXNN+GG5jy5UZZJxIQ==", + "version": "7.7.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.5.tgz", + "integrity": "sha512-9Cq4zTFExwFhQI6MT1aFxgqhIsMWQWDVwOgLzl7PTWJHsNaqFvklAU+Oz6AQLAS0dJKTwZSOCo20INwktxpi3Q==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.4.4", + "@babel/helper-module-transforms": "^7.7.5", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-simple-access": "^7.1.0", + "@babel/helper-simple-access": "^7.7.4", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz", - "integrity": "sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.7.4.tgz", + "integrity": "sha512-y2c96hmcsUi6LrMqvmNDPBBiGCiQu0aYqpHatVVu6kD4mFEXKjyNxd/drc18XXAf9dv7UXjrZwBVmTTGaGP8iw==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.4.4", + "@babel/helper-hoist-variables": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz", - "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.7.4.tgz", + "integrity": "sha512-u2B8TIi0qZI4j8q4C51ktfO7E3cQ0qnaXFI1/OXITordD40tt17g/sXqgNNCcMTcBFKrUPcGDx+TBJuZxLx7tw==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-module-transforms": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz", - "integrity": "sha512-z7+2IsWafTBbjNsOxU/Iv5CvTJlr5w4+HGu1HovKYTtgJ362f7kBcQglkfmlspKKZ3bgrbSGvLfNx++ZJgCWsg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.7.4.tgz", + "integrity": "sha512-jBUkiqLKvUWpv9GLSuHUFYdmHg0ujC1JEYoZUfeOOfNydZXp1sXObgyPatpcwjWgsdBGsagWW0cdJpX/DO2jMw==", "dev": true, "requires": { - "regexp-tree": "^0.1.6" + "@babel/helper-create-regexp-features-plugin": "^7.7.4" } }, "@babel/plugin-transform-new-target": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz", - "integrity": "sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.7.4.tgz", + "integrity": "sha512-CnPRiNtOG1vRodnsyGX37bHQleHE14B9dnnlgSeEs3ek3fHN1A1SScglTCg1sfbe7sRQ2BUcpgpTpWSfMKz3gg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-object-super": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz", - "integrity": "sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.7.4.tgz", + "integrity": "sha512-ho+dAEhC2aRnff2JCA0SAK7V2R62zJd/7dmtoe7MHcso4C2mS+vZjn1Pb1pCVZvJs1mgsvv5+7sT+m3Bysb6eg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.5.5" + "@babel/helper-replace-supers": "^7.7.4" } }, "@babel/plugin-transform-parameters": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz", - "integrity": "sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.7.4.tgz", + "integrity": "sha512-VJwhVePWPa0DqE9vcfptaJSzNDKrWU/4FbYCjZERtmqEs05g3UMXnYMZoXja7JAJ7Y7sPZipwm/pGApZt7wHlw==", "dev": true, "requires": { - "@babel/helper-call-delegate": "^7.4.4", - "@babel/helper-get-function-arity": "^7.0.0", + "@babel/helper-call-delegate": "^7.7.4", + "@babel/helper-get-function-arity": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-regenerator": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz", - "integrity": "sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==", + "version": "7.7.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.5.tgz", + "integrity": "sha512-/8I8tPvX2FkuEyWbjRCt4qTAgZK0DVy8QRguhA524UH48RfGJy94On2ri+dCuwOpcerPRl9O4ebQkRcVzIaGBw==", "dev": true, "requires": { "regenerator-transform": "^0.14.0" } }, "@babel/plugin-transform-runtime": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.5.5.tgz", - "integrity": "sha512-6Xmeidsun5rkwnGfMOp6/z9nSzWpHFNVr2Jx7kwoq4mVatQfQx5S56drBgEHF+XQbKOdIaOiMIINvp/kAwMN+w==", + "version": "7.7.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.7.6.tgz", + "integrity": "sha512-tajQY+YmXR7JjTwRvwL4HePqoL3DYxpYXIHKVvrOIvJmeHe2y1w4tz5qz9ObUDC9m76rCzIMPyn4eERuwA4a4A==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-module-imports": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0", "resolve": "^1.8.1", "semver": "^5.5.1" @@ -710,27 +717,27 @@ } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz", - "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.7.4.tgz", + "integrity": "sha512-q+suddWRfIcnyG5YiDP58sT65AJDZSUhXQDZE3r04AuqD6d/XLaQPPXSBzP2zGerkgBivqtQm9XKGLuHqBID6Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-spread": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz", - "integrity": "sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.7.4.tgz", + "integrity": "sha512-8OSs0FLe5/80cndziPlg4R0K6HcWSM0zyNhHhLsmw/Nc5MaA49cAsnoJ/t/YZf8qkG7fD+UjTRaApVDB526d7Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz", - "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.7.4.tgz", + "integrity": "sha512-Ls2NASyL6qtVe1H1hXts9yuEeONV2TJZmplLONkMPUG158CtmnrzW5Q5teibM5UVOFjG0D3IC5mzXR6pPpUY7A==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", @@ -738,33 +745,32 @@ } }, "@babel/plugin-transform-template-literals": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz", - "integrity": "sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.7.4.tgz", + "integrity": "sha512-sA+KxLwF3QwGj5abMHkHgshp9+rRz+oY9uoRil4CyLtgEuE/88dpkeWgNk5qKVsJE9iSfly3nvHapdRiIS2wnQ==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-annotate-as-pure": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz", - "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.7.4.tgz", + "integrity": "sha512-KQPUQ/7mqe2m0B8VecdyaW5XcQYaePyl9R7IsKd+irzj6jvbhoGnRE+M0aNkyAzI07VfUQ9266L5xMARitV3wg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz", - "integrity": "sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.7.4.tgz", + "integrity": "sha512-N77UUIV+WCvE+5yHw+oks3m18/umd7y392Zv7mYTpFqHtkpcc+QUz+gLJNTWVlWROIWeLqY0f3OjZxV5TcXnRw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.5.4" + "@babel/helper-create-regexp-features-plugin": "^7.7.4", + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/preset-env": { @@ -819,18 +825,18 @@ } }, "@babel/runtime": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.5.tgz", - "integrity": "sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ==", + "version": "7.7.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.6.tgz", + "integrity": "sha512-BWAJxpNVa0QlE5gZdWjSxXtemZyZ9RmrmVozxt3NUXeZhVIJ5ANyqmMc0JDrivBZyxUuQvFxlvH4OWWOogGfUw==", "dev": true, "requires": { "regenerator-runtime": "^0.13.2" } }, "@babel/runtime-corejs2": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.5.5.tgz", - "integrity": "sha512-FYATQVR00NSNi7mUfpPDp7E8RYMXDuO8gaix7u/w3GekfUinKgX1AcTxs7SoiEmoEW9mbpjrwqWSW6zCmw5h8A==", + "version": "7.7.6", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.7.6.tgz", + "integrity": "sha512-QYp/8xdH8iMin3pH5gtT/rUuttVfIcOhWBC3wh9Eh/qs4jEe39+3DpCDLgWXhMQgiCTOH8mrLSvQ0OHOCcox9g==", "dev": true, "requires": { "core-js": "^2.6.5", @@ -838,28 +844,28 @@ } }, "@babel/template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", - "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", + "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4" + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4" } }, "@babel/traverse": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", - "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz", + "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==", "dev": true, "requires": { "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.5.5", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.5.5", - "@babel/types": "^7.5.5", + "@babel/generator": "^7.7.4", + "@babel/helper-function-name": "^7.7.4", + "@babel/helper-split-export-declaration": "^7.7.4", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" @@ -874,9 +880,9 @@ } }, "@babel/types": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", - "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -893,9 +899,9 @@ } }, "@hapi/address": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.0.0.tgz", - "integrity": "sha512-mV6T0IYqb0xL1UALPFplXYQmR0twnXG0M6jUswpquqT2sD12BOiCiLy3EvMp/Fy7s3DZElC4/aPjEjo2jeZpvw==", + "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": { @@ -905,9 +911,9 @@ "dev": true }, "@hapi/hoek": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.2.1.tgz", - "integrity": "sha512-JPiBy+oSmsq3St7XlipfN5pNA6bDJ1kpa73PrK/zR29CVClDVqy04AanM/M/qx5bSF+I61DdCfAvRrujau+zRg==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.0.tgz", + "integrity": "sha512-7XYT10CZfPsH7j9F1Jmg1+d0ezOux2oM2GfArAzLwWe4mE2Dr3hVjsAL6+TFY49RRJlCdJDMw3nJsLFroTc8Kw==", "dev": true }, "@hapi/joi": { @@ -923,12 +929,12 @@ } }, "@hapi/topo": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.3.tgz", - "integrity": "sha512-JmS9/vQK6dcUYn7wc2YZTqzIKubAQcJKu2KCKAru6es482U5RT5fP1EXCPtlXpiK7PR0On/kpQKI4fRKkzpZBQ==", + "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": { - "@hapi/hoek": "8.x.x" + "@hapi/hoek": "^8.3.0" } }, "@intervolga/optimize-cssnano-plugin": { @@ -942,10 +948,21 @@ "postcss": "^7.0.0" } }, + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, "@mdi/font": { - "version": "4.2.95", - "resolved": "https://registry.npmjs.org/@mdi/font/-/font-4.2.95.tgz", - "integrity": "sha512-pCJ9hR8yQH1tMk6KTZYfJsZkI/XQ1rR9Fe/q50ATDDVUoDk7Wl7n9WqT6dYWn0mnCLgrTQl/WNjyrnTo5rKu+A==", + "version": "4.7.95", + "resolved": "https://registry.npmjs.org/@mdi/font/-/font-4.7.95.tgz", + "integrity": "sha512-/SWooHIFz2dXkQJk3VhEXSbBplOU1lIkGSELAmw0peFEgR8KPqyM//M3vD8WDZETuEOSRVhVqLevP3okrsM5dw==", "dev": true }, "@mrmlnc/readdir-enhanced": { @@ -1023,6 +1040,12 @@ "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==", "dev": true }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, "@types/eslint-visitor-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", @@ -1046,20 +1069,39 @@ "@types/node": "*" } }, - "@types/jest": { - "version": "24.0.18", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.0.18.tgz", - "integrity": "sha512-jcDDXdjTcrQzdN06+TSVsPPqxvsZA/5QkYfIZlq1JMw7FdP5AZylbOc+6B/cuDurctRe+MziUMtQ3xQdrbjqyQ==", + "@types/istanbul-lib-coverage": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", + "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", + "integrity": "sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg==", "dev": true, "requires": { - "@types/jest-diff": "*" + "@types/istanbul-lib-coverage": "*" } }, - "@types/jest-diff": { - "version": "20.0.1", - "resolved": "https://registry.npmjs.org/@types/jest-diff/-/jest-diff-20.0.1.tgz", - "integrity": "sha512-yALhelO3i0hqZwhjtcr6dYyaLoCHbAMshwtj6cGxTvHZAKXHsYGdff6E8EPw3xLKY0ELUTQ69Q1rQiJENnccMA==", - "dev": true + "@types/istanbul-reports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", + "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "24.0.23", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.0.23.tgz", + "integrity": "sha512-L7MBvwfNpe7yVPTXLn32df/EK+AMBFAFvZrRuArGs7npEWnlziUXK+5GMIUTI4NIuwok3XibsjXCs5HxviYXjg==", + "dev": true, + "requires": { + "jest-diff": "^24.3.0" + } }, "@types/json-schema": { "version": "7.0.3", @@ -1074,9 +1116,9 @@ "dev": true }, "@types/node": { - "version": "12.7.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.2.tgz", - "integrity": "sha512-dyYO+f6ihZEtNPDcWNR1fkoTDf3zAK3lAABDze3mz6POyIercH0lEUawUFXlG8xaQZmm1yEBON/4TsYv/laDYg==" + "version": "12.12.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.17.tgz", + "integrity": "sha512-Is+l3mcHvs47sKy+afn2O1rV4ldZFU7W8101cNlOd+MRbjM4Onida8jSZnJdTe/0Pcf25g9BNIUsuugmE6puHA==" }, "@types/normalize-package-data": { "version": "2.4.0", @@ -1154,9 +1196,9 @@ } }, "@types/webpack-env": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.14.0.tgz", - "integrity": "sha512-Fv+0gYJzE/czLoRKq+gnXWr4yBpPM3tO3C8pDLFwqVKlMICQUq5OsxwwFZYDaVr7+L6mgNDp16iOcJHEz3J5RQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.14.1.tgz", + "integrity": "sha512-0Ki9jAAhKDSuLDXOIMADg54Hu60SuBTEsWaJGGy5cV+SSUQ63J2a+RrYYGrErzz39fXzTibhKrAQJAb8M7PNcA==", "dev": true }, "@types/webpack-sources": { @@ -1178,63 +1220,121 @@ } } }, + "@types/yargs": { + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.3.tgz", + "integrity": "sha512-K8/LfZq2duW33XW/tFwEAfnZlqIfVsoyRB3kfXdPXYhl0nfM8mmh7GS0jg7WrX2Dgq/0Ha/pR1PaR+BvmWwjiQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-13.1.0.tgz", + "integrity": "sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg==", + "dev": true + }, "@typescript-eslint/eslint-plugin": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.0.0.tgz", - "integrity": "sha512-Mo45nxTTELODdl7CgpZKJISvLb+Fu64OOO2ZFc2x8sYSnUpFrBUW3H+H/ZGYmEkfnL6VkdtOSxgdt+Av79j0sA==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.11.0.tgz", + "integrity": "sha512-G2HHA1vpMN0EEbUuWubiCCfd0R3a30BB+UdvnFkxwZIxYEGOrWEXDv8tBFO9f44CWc47Xv9lLM3VSn4ORLI2bA==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "2.0.0", - "eslint-utils": "^1.4.0", + "@typescript-eslint/experimental-utils": "2.11.0", + "eslint-utils": "^1.4.3", "functional-red-black-tree": "^1.0.1", - "regexpp": "^2.0.1", - "tsutils": "^3.14.0" + "regexpp": "^3.0.0", + "tsutils": "^3.17.1" }, "dependencies": { "eslint-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.2.tgz", - "integrity": "sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", "dev": true, "requires": { - "eslint-visitor-keys": "^1.0.0" + "eslint-visitor-keys": "^1.1.0" } + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true + }, + "regexpp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.0.0.tgz", + "integrity": "sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g==", + "dev": true } } }, "@typescript-eslint/experimental-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.0.0.tgz", - "integrity": "sha512-XGJG6GNBXIEx/mN4eTRypN/EUmsd0VhVGQ1AG+WTgdvjHl0G8vHhVBHrd/5oI6RRYBRnedNymSYWW1HAdivtmg==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.11.0.tgz", + "integrity": "sha512-YxcA/y0ZJaCc/fB/MClhcDxHI0nOBB7v2/WxBju2cOTanX7jO9ttQq6Fy4yW9UaY5bPd9xL3cun3lDVqk67sPQ==", "dev": true, "requires": { "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.0.0", - "eslint-scope": "^4.0.0" + "@typescript-eslint/typescript-estree": "2.11.0", + "eslint-scope": "^5.0.0" + }, + "dependencies": { + "eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + } } }, "@typescript-eslint/parser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.0.0.tgz", - "integrity": "sha512-ibyMBMr0383ZKserIsp67+WnNVoM402HKkxqXGlxEZsXtnGGurbnY90pBO3e0nBUM7chEEOcxUhgw9aPq7fEBA==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.11.0.tgz", + "integrity": "sha512-DyGXeqhb3moMioEFZIHIp7oXBBh7dEfPTzGrlyP0Mi9ScCra4SWEGs3kPd18mG7Sy9Wy8z88zmrw5tSGL6r/6A==", "dev": true, "requires": { "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.0.0", - "@typescript-eslint/typescript-estree": "2.0.0", - "eslint-visitor-keys": "^1.0.0" + "@typescript-eslint/experimental-utils": "2.11.0", + "@typescript-eslint/typescript-estree": "2.11.0", + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true + } } }, "@typescript-eslint/typescript-estree": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.0.0.tgz", - "integrity": "sha512-NXbmzA3vWrSgavymlzMWNecgNOuiMMp62MO3kI7awZRLRcsA1QrYWo6q08m++uuAGVbXH/prZi2y1AWuhSu63w==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.11.0.tgz", + "integrity": "sha512-HGY4+d4MagO6cKMcKfIKaTMxcAv7dEVnji2Zi+vi5VV8uWAM631KjAB5GxFcexMYrwKT0EekRiiGK1/Sd7VFGA==", "dev": true, "requires": { + "debug": "^4.1.1", + "eslint-visitor-keys": "^1.1.0", + "glob": "^7.1.6", + "is-glob": "^4.0.1", "lodash.unescape": "4.0.1", - "semver": "^6.2.0" + "semver": "^6.3.0", + "tsutils": "^3.17.1" }, "dependencies": { + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -1250,9 +1350,9 @@ "dev": true }, "@vue/babel-plugin-transform-vue-jsx": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.0.0.tgz", - "integrity": "sha512-U+JNwVQSmaLKjO3lzCUC3cNXxprgezV1N+jOdqbP4xWNaqtWUCJnkjTVcgECM18A/AinDKPcUUeoyhU7yxUxXQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.1.2.tgz", + "integrity": "sha512-YfdaoSMvD1nj7+DsrwfTvTnhDXI7bsuh+Y5qWwvQXlD24uLgnsoww3qbiZvWf/EoviZMrvqkqN4CBw0W3BWUTQ==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.0.0", @@ -1264,9 +1364,9 @@ } }, "@vue/babel-preset-app": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-3.11.0.tgz", - "integrity": "sha512-fcCq9nuGGx1WGnyaKHvIC8RnWjISXGf1rJH4mN9+bymDfosgDbwnfV4TYvTZlyK1/aTHEEpIoO3XimTXBo7QBw==", + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-3.12.1.tgz", + "integrity": "sha512-Zjy5jQaikV1Pz+ri0YgXFS7q4/5wCxB5tRkDOEIt5+4105u0Feb/pvH20nVL6nx9GyXrECFfcm7Yxr/z++OaPQ==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.0.0", @@ -1285,89 +1385,89 @@ } }, "@vue/babel-preset-jsx": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.1.0.tgz", - "integrity": "sha512-EeZ9gwEmu79B4A6LMLAw5cPCVYIcbKWgJgJafWtLzh1S+SgERUmTkVQ9Vx4k8zYBiCuxHK3XziZ3VJIMau7THA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.1.2.tgz", + "integrity": "sha512-zDpVnFpeC9YXmvGIDSsKNdL7qCG2rA3gjywLYHPCKDT10erjxF4U+6ay9X6TW5fl4GsDlJp9bVfAVQAAVzxxvQ==", "dev": true, "requires": { "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0", - "@vue/babel-plugin-transform-vue-jsx": "^1.0.0", - "@vue/babel-sugar-functional-vue": "^1.0.0", - "@vue/babel-sugar-inject-h": "^1.0.0", - "@vue/babel-sugar-v-model": "^1.0.0", - "@vue/babel-sugar-v-on": "^1.1.0" + "@vue/babel-plugin-transform-vue-jsx": "^1.1.2", + "@vue/babel-sugar-functional-vue": "^1.1.2", + "@vue/babel-sugar-inject-h": "^1.1.2", + "@vue/babel-sugar-v-model": "^1.1.2", + "@vue/babel-sugar-v-on": "^1.1.2" } }, "@vue/babel-sugar-functional-vue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.0.0.tgz", - "integrity": "sha512-XE/jNaaorTuhWayCz+QClk5AB9OV5HzrwbzEC6sIUY0J60A28ONQKeTwxfidW42egOkqNH/UU6eE3KLfmiDj0Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.1.2.tgz", + "integrity": "sha512-YhmdJQSVEFF5ETJXzrMpj0nkCXEa39TvVxJTuVjzvP2rgKhdMmQzlJuMv/HpadhZaRVMCCF3AEjjJcK5q/cYzQ==", "dev": true, "requires": { "@babel/plugin-syntax-jsx": "^7.2.0" } }, "@vue/babel-sugar-inject-h": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.0.0.tgz", - "integrity": "sha512-NxWU+DqtbZgfGvd25GPoFMj+rvyQ8ZA1pHj8vIeqRij+vx3sXoKkObjA9ulZunvWw5F6uG9xYy4ytpxab/X+Hg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.1.2.tgz", + "integrity": "sha512-VRSENdTvD5htpnVp7i7DNuChR5rVMcORdXjvv5HVvpdKHzDZAYiLSD+GhnhxLm3/dMuk8pSzV+k28ECkiN5m8w==", "dev": true, "requires": { "@babel/plugin-syntax-jsx": "^7.2.0" } }, "@vue/babel-sugar-v-model": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.0.0.tgz", - "integrity": "sha512-Pfg2Al0io66P1eO6zUbRIgpyKCU2qTnumiE0lao/wA/uNdb7Dx5Tfd1W6tO5SsByETPnEs8i8+gawRIXX40rFw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.1.2.tgz", + "integrity": "sha512-vLXPvNq8vDtt0u9LqFdpGM9W9IWDmCmCyJXuozlq4F4UYVleXJ2Fa+3JsnTZNJcG+pLjjfnEGHci2339Kj5sGg==", "dev": true, "requires": { "@babel/plugin-syntax-jsx": "^7.2.0", "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0", - "@vue/babel-plugin-transform-vue-jsx": "^1.0.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.1.2", "camelcase": "^5.0.0", "html-tags": "^2.0.0", "svg-tags": "^1.0.0" } }, "@vue/babel-sugar-v-on": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.1.0.tgz", - "integrity": "sha512-8DwAj/RLpmrDP4eZ3erJcKcyuLArLUYagNODTsSQrMdG5zmLJoFFtEjODfYRh/XxM2wXv9Wxe+HAB41FQxxwQA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.1.2.tgz", + "integrity": "sha512-T8ZCwC8Jp2uRtcZ88YwZtZXe7eQrJcfRq0uTFy6ShbwYJyz5qWskRFoVsdTi9o0WEhmQXxhQUewodOSCUPVmsQ==", "dev": true, "requires": { "@babel/plugin-syntax-jsx": "^7.2.0", - "@vue/babel-plugin-transform-vue-jsx": "^1.0.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.1.2", "camelcase": "^5.0.0" } }, "@vue/cli-overlay": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@vue/cli-overlay/-/cli-overlay-3.11.0.tgz", - "integrity": "sha512-yYZP27vjioWmohwXQ9mTPHHxktfAaTM6RDehyG83yvY07wcdxhwrNNCMm8eE9My/K2F8oAPf8uoDZZmkr/EXBw==", + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/@vue/cli-overlay/-/cli-overlay-3.12.1.tgz", + "integrity": "sha512-Bym92EN+lj+cNRN2ozbYyH+V8DMXWGbCDUk+hiJ4EYDBZfBkZKvalk1/mOBFwyxiopnnbOEBAAhL/UuMQ1xARg==", "dev": true }, "@vue/cli-plugin-babel": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@vue/cli-plugin-babel/-/cli-plugin-babel-3.11.0.tgz", - "integrity": "sha512-RSq9goefilvUMYxbeQS8cZxt6zZnvBIb1xK4NWX0NBtqKzJmIjtJzDAQvKgjnZ/USRu6p6X2IRj4Wum8UCUqow==", + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-babel/-/cli-plugin-babel-3.12.1.tgz", + "integrity": "sha512-Zetvz8PikLCGomeKOKu8pC9YQ7cfxs7pGpvEOzaxGdhMnebhjAYR6i6dOB57A6N5lhxQksXCtYTv26QgfiIpdg==", "dev": true, "requires": { "@babel/core": "^7.0.0", - "@vue/babel-preset-app": "^3.11.0", - "@vue/cli-shared-utils": "^3.11.0", + "@vue/babel-preset-app": "^3.12.1", + "@vue/cli-shared-utils": "^3.12.1", "babel-loader": "^8.0.5", "webpack": "^4.0.0" } }, "@vue/cli-plugin-typescript": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@vue/cli-plugin-typescript/-/cli-plugin-typescript-3.11.0.tgz", - "integrity": "sha512-oL0ctNVvbD7gZr3DDv6gxxWjw0lUrh4sGMk7InCakEooo/790DqZRX6lx9stXEv/+zELkgddcY3hjNEopbJg+w==", + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-typescript/-/cli-plugin-typescript-3.12.1.tgz", + "integrity": "sha512-sh+WKbpsDw6wOrpM4FSD1xKXpyp8mVcl+yyEk+WvJuuSdfwueRubAM7uYbrOGtNSOegpZqBwbNxEO4FIUBeLKQ==", "dev": true, "requires": { "@types/webpack-env": "^1.13.9", - "@vue/cli-shared-utils": "^3.11.0", + "@vue/cli-shared-utils": "^3.12.1", "fork-ts-checker-webpack-plugin": "^0.5.2", "globby": "^9.2.0", "ts-loader": "^5.3.3", @@ -1377,12 +1477,12 @@ } }, "@vue/cli-plugin-unit-jest": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@vue/cli-plugin-unit-jest/-/cli-plugin-unit-jest-3.11.0.tgz", - "integrity": "sha512-UwdySXhSar9npsYmLJ45Rk4kljOwNQDHRMvmWtGIUqmES0wBYsWLed3dpcumTXTsumXrVdrY6o74L9yqCNT/xw==", + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-unit-jest/-/cli-plugin-unit-jest-3.12.1.tgz", + "integrity": "sha512-Cc9Kq4+RaUN1yfNVb7c9hVDNXo2tFTWHgwooCL3XWMu2iL+pDawQt8ZeSqauDY95JoMeEAVy2xBimjL+7jo/jw==", "dev": true, "requires": { - "@vue/cli-shared-utils": "^3.11.0", + "@vue/cli-shared-utils": "^3.12.1", "babel-jest": "^23.6.0", "babel-plugin-transform-es2015-modules-commonjs": "^6.26.2", "jest": "^23.6.0", @@ -1393,15 +1493,15 @@ } }, "@vue/cli-service": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@vue/cli-service/-/cli-service-3.11.0.tgz", - "integrity": "sha512-HSU4wHlYKQt8O968JUz/AeYvFSokxJjMkr7dgVNVb6rpBn859Emkr960plWGr1z1hc3qNOwLuSUGk5OSfq1inA==", + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/@vue/cli-service/-/cli-service-3.12.1.tgz", + "integrity": "sha512-PDxNrTGnSKzeV1ruFlsRIAO8JcPizwT0EJXq9GeyooU+p+sOkv7aKkCBJQVYNjZapD1NOGWx6CvAAC/wAW+gew==", "dev": true, "requires": { "@intervolga/optimize-cssnano-plugin": "^1.0.5", "@soda/friendly-errors-webpack-plugin": "^1.7.1", - "@vue/cli-overlay": "^3.11.0", - "@vue/cli-shared-utils": "^3.11.0", + "@vue/cli-overlay": "^3.12.1", + "@vue/cli-shared-utils": "^3.12.1", "@vue/component-compiler-utils": "^3.0.0", "@vue/preload-webpack-plugin": "^1.1.0", "@vue/web-component-wrapper": "^1.2.0", @@ -1434,7 +1534,7 @@ "lodash.defaultsdeep": "^4.6.1", "lodash.mapvalues": "^4.6.0", "lodash.transform": "^4.6.0", - "mini-css-extract-plugin": "^0.6.0", + "mini-css-extract-plugin": "^0.8.0", "minimist": "^1.2.0", "ora": "^3.4.0", "portfinder": "^1.0.20", @@ -1467,6 +1567,12 @@ "wrap-ansi": "^5.1.0" } }, + "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 + }, "parse-json": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", @@ -1522,9 +1628,9 @@ } }, "@vue/cli-shared-utils": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-3.11.0.tgz", - "integrity": "sha512-D7pst/4v9H1DD66fLxlZOwRR09R03MV0ROdKxBHmh3FmnApCA/RiaolFA/8w+B3CnevYMlV3SJ5fOAgedbswbA==", + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-3.12.1.tgz", + "integrity": "sha512-jFblzRFjutGwu5utOKdVlPlsbA1lBUNNQlAThzNqej+JtTKJjnvjlhjKX0Gq0oOny5FjKWhoyfQ74p9h1qE6JQ==", "dev": true, "requires": { "@hapi/joi": "^15.0.1", @@ -1550,9 +1656,9 @@ } }, "@vue/component-compiler-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.0.0.tgz", - "integrity": "sha512-am+04/0UX7ektcmvhYmrf84BDVAD8afFOf4asZjN84q8xzxFclbk5x0MtxuKGfp+zjN5WWPJn3fjFAWtDdIGSw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.1.0.tgz", + "integrity": "sha512-OJ7swvl8LtKtX5aYP8jHhO6fQBIRIGkU6rvWzK+CGJiNOnvg16nzcBkd9qMZzW8trI2AsqAKx263nv7kb5rhZw==", "dev": true, "requires": { "consolidate": "^0.15.1", @@ -1561,7 +1667,7 @@ "merge-source-map": "^1.1.0", "postcss": "^7.0.14", "postcss-selector-parser": "^5.0.0", - "prettier": "1.16.3", + "prettier": "^1.18.2", "source-map": "~0.6.1", "vue-template-es2015-compiler": "^1.9.0" }, @@ -1859,9 +1965,9 @@ "dev": true }, "abab": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.1.tgz", - "integrity": "sha512-1zSbbCuoIjafKZ3mblY5ikvAb0ODUbqBnFuUb7f6uLeQhhGJ0vEV4ntmtxKLT2WgXCO94E07BjunsIw1jOMPZw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", + "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", "dev": true }, "abbrev": { @@ -1881,15 +1987,15 @@ } }, "acorn": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", - "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", + "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==", "dev": true }, "acorn-globals": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.3.tgz", - "integrity": "sha512-vkR40VwS2SYO98AIeFvzWWh+xyc2qi9s7OoXSFEGIP/rOJKzjnhykaZJNnHdoq4BL2gGxI5EZOU16z896EYnOQ==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", "dev": true, "requires": { "acorn": "^6.0.1", @@ -2065,13 +2171,34 @@ "dev": true }, "array-includes": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", - "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.0.tgz", + "integrity": "sha512-ONOEQoKrvXPKk7Su92Co0YMqYO32FfqJTzkKU9u2UpIXyYZIzLSvpdg4AwvSw4mSUW0czu6inK+zby6Oj6gDjQ==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.7.0" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.0" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0-next.1.tgz", + "integrity": "sha512-7MmGr03N7Rnuid6+wyhD9sHNE2n4tFSwExnU2lQl3lIo2ShXWGePY80zYaoMOmILWv57H0amMjZGHNzzGG70Rw==", + "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.1.4", + "is-regex": "^1.0.4", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.0", + "string.prototype.trimright": "^2.1.0" + } + } } }, "array-union": { @@ -2095,6 +2222,37 @@ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, + "array.prototype.flat": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", + "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0-next.1.tgz", + "integrity": "sha512-7MmGr03N7Rnuid6+wyhD9sHNE2n4tFSwExnU2lQl3lIo2ShXWGePY80zYaoMOmILWv57H0amMjZGHNzzGG70Rw==", + "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.1.4", + "is-regex": "^1.0.4", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.0", + "string.prototype.trimright": "^2.1.0" + } + } + } + }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", @@ -2208,18 +2366,18 @@ "dev": true }, "autoprefixer": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.1.tgz", - "integrity": "sha512-aVo5WxR3VyvyJxcJC3h4FKfwCQvQWb1tSI5VHNibddCVWrcD1NvlxEweg3TSgiPztMnWfjpy2FURKA2kvDE+Tw==", + "version": "9.7.3", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.3.tgz", + "integrity": "sha512-8T5Y1C5Iyj6PgkPSFd0ODvK9DIleuPKUPYniNxybS47g2k2wFgLZ46lGQHlBuGKIAEV8fbCDfKCCRS1tvOgc3Q==", "dev": true, "requires": { - "browserslist": "^4.6.3", - "caniuse-lite": "^1.0.30000980", + "browserslist": "^4.8.0", + "caniuse-lite": "^1.0.30001012", "chalk": "^2.4.2", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", - "postcss": "^7.0.17", - "postcss-value-parser": "^4.0.0" + "postcss": "^7.0.23", + "postcss-value-parser": "^4.0.2" }, "dependencies": { "postcss-value-parser": { @@ -2237,9 +2395,9 @@ "dev": true }, "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.0.tgz", + "integrity": "sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A==", "dev": true }, "axios": { @@ -2771,9 +2929,9 @@ "dev": true }, "bluebird": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", - "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", + "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": { @@ -2991,14 +3149,14 @@ } }, "browserslist": { - "version": "4.6.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.6.tgz", - "integrity": "sha512-D2Nk3W9JL9Fp/gIcWei8LrERCS+eXu9AM5cfXA8WEZ84lFks+ARnZ0q/R69m2SV3Wjma83QDDPxsNKXUwdIsyA==", + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.2.tgz", + "integrity": "sha512-+M4oeaTplPm/f1pXDw84YohEv7B1i/2Aisei8s4s6k3QsoSHa7i5sz8u/cGQkkatCPxMASKxPualR4wwYgVboA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000984", - "electron-to-chromium": "^1.3.191", - "node-releases": "^1.1.25" + "caniuse-lite": "^1.0.30001015", + "electron-to-chromium": "^1.3.322", + "node-releases": "^1.1.42" } }, "bs-logger": { @@ -3011,18 +3169,18 @@ } }, "bser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.0.tgz", - "integrity": "sha512-8zsjWrQkkBoLK6uxASk1nJ2SKv97ltiGDo6A3wA0/yRPz+CwmEyDo0hUrhIuukG2JHpAl3bvFIixw2/3Hi0DOg==", + "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": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "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.0.2", @@ -3178,9 +3336,9 @@ } }, "caniuse-lite": { - "version": "1.0.30000989", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000989.tgz", - "integrity": "sha512-vrMcvSuMz16YY6GSVZ0dWDTJP8jqk3iFQ/Aq5iqblPwxSVVZI+zxDyTX0VPqtQsDnfdrBDcsmhgTEOh5R8Lbpw==", + "version": "1.0.30001015", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001015.tgz", + "integrity": "sha512-/xL2AbW/XWHNu1gnIrO8UitBGoFthcsDgU9VLK1/dpsoxbaD5LscHozKze05R6WLsBvLhqv78dAPozMFQBYLbQ==", "dev": true }, "capture-exit": { @@ -3248,9 +3406,9 @@ } }, "chownr": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz", - "integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", + "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==", "dev": true }, "chrome-trace-event": { @@ -3328,36 +3486,79 @@ } }, "cli-highlight": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.1.tgz", - "integrity": "sha512-0y0VlNmdD99GXZHYnvrQcmHxP8Bi6T00qucGgBgGv4kJ0RyDthNnnFPupHV7PYv/OXSVk+azFbOeaW6+vGmx9A==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.4.tgz", + "integrity": "sha512-s7Zofobm20qriqDoU9sXptQx0t2R9PEgac92mENNm7xaEe1hn71IIMsXMK+6encA6WRCWWxIGQbipr3q998tlQ==", "dev": true, "requires": { - "chalk": "^2.3.0", + "chalk": "^3.0.0", "highlight.js": "^9.6.0", "mz": "^2.4.0", - "parse5": "^4.0.0", - "yargs": "^13.0.0" + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^5.1.1", + "yargs": "^15.0.0" }, "dependencies": { - "cliui": { + "ansi-regex": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.0.tgz", + "integrity": "sha512-7kFQgnEaMdRtwf6uSfUnVr9gSGC7faurn+J/Mv90/W+iTtN0405/nLdopfMWwchyxhbGYl6TC4Sccn9TUkGAgg==", "dev": true, "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, - "find-up": { + "chalk": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "requires": { - "locate-path": "^3.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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" } }, "get-caller-file": { @@ -3366,14 +3567,25 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, - "locate-path": { + "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-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "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 + }, + "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": "^3.0.0", - "path-exists": "^3.0.0" + "p-locate": "^4.1.0" } }, "p-limit": { @@ -3386,12 +3598,12 @@ } }, "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==", + "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.0.0" + "p-limit": "^2.2.0" } }, "p-try": { @@ -3400,6 +3612,18 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "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 + }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", @@ -3407,49 +3631,68 @@ "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==", + "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": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "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.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.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==", + "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": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } }, "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.0.2.tgz", + "integrity": "sha512-GH/X/hYt+x5hOat4LMnCqMd8r5Cv78heOMIJn1hr7QPPBqfeC6p89Y78+WB9yGDvfpCvgasfmWLzNzEioOUD9Q==", "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.1" + "yargs-parser": "^16.1.0" } }, "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-16.1.0.tgz", + "integrity": "sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg==", "dev": true, "requires": { "camelcase": "^5.0.0", @@ -3597,9 +3840,9 @@ } }, "commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "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 }, "commondir": { @@ -3727,13 +3970,10 @@ "dev": true }, "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "^0.1.4" - } + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true }, "consolidate": { "version": "0.15.1", @@ -3772,9 +4012,9 @@ "dev": true }, "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "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" @@ -3942,6 +4182,12 @@ "once": "^1.3.1" } }, + "serialize-javascript": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", + "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==", + "dev": true + }, "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", @@ -3966,9 +4212,9 @@ } }, "core-js": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", - "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", "dev": true }, "core-util-is": { @@ -4146,13 +4392,13 @@ } }, "css-select": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.0.2.tgz", - "integrity": "sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", "dev": true, "requires": { "boolbase": "^1.0.0", - "css-what": "^2.1.2", + "css-what": "^3.2.1", "domutils": "^1.7.0", "nth-check": "^1.0.2" } @@ -4215,13 +4461,21 @@ } }, "css-tree": { - "version": "1.0.0-alpha.33", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.33.tgz", - "integrity": "sha512-SPt57bh5nQnpsTBsx/IXbO14sRc9xXu5MtMAVuo0BaQQmyf0NupNPPSoMaqiAF5tDFafYsTkfeH4Q/HCKXkg4w==", + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", "dev": true, "requires": { "mdn-data": "2.0.4", - "source-map": "^0.5.3" + "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-unit-converter": { @@ -4231,9 +4485,9 @@ "dev": true }, "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.2.1.tgz", + "integrity": "sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==", "dev": true }, "cssesc": { @@ -4320,30 +4574,12 @@ "dev": true }, "csso": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/csso/-/csso-3.5.1.tgz", - "integrity": "sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.2.tgz", + "integrity": "sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg==", "dev": true, "requires": { - "css-tree": "1.0.0-alpha.29" - }, - "dependencies": { - "css-tree": { - "version": "1.0.0-alpha.29", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.29.tgz", - "integrity": "sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg==", - "dev": true, - "requires": { - "mdn-data": "~1.1.0", - "source-map": "^0.5.3" - } - }, - "mdn-data": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz", - "integrity": "sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA==", - "dev": true - } + "css-tree": "1.0.0-alpha.37" } }, "cssom": { @@ -4368,9 +4604,9 @@ "dev": true }, "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 }, "dashdash": { @@ -4394,9 +4630,9 @@ }, "dependencies": { "whatwg-url": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", - "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", "dev": true, "requires": { "lodash.sortby": "^4.7.0", @@ -4406,12 +4642,6 @@ } } }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, "dateformat": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.2.tgz", @@ -4446,9 +4676,9 @@ "dev": true }, "deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.0.tgz", - "integrity": "sha512-ZbfWJq/wN1Z273o7mUSjILYqehAktR2NVoSrOukDkU9kg2v/Uv89yU4Cvz8seJeAmtN5oqiefKq8FPuXOboqLw==", + "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", @@ -4472,25 +4702,37 @@ "dev": true }, "default-gateway": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-5.0.3.tgz", - "integrity": "sha512-zW+ld9xtN0+q48wIwhitUzhfERJN7BPgvijPhuCKG6bfWqnoqtSNSnrXfvAME2ZJLpgYpz6UorpBddGfLzrJBw==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-5.0.5.tgz", + "integrity": "sha512-z2RnruVmj8hVMmAnEJMTIJNijhKCDiGjbLP+BHJFOT7ld3Bo5qcIBpVYDniqhbMIIf+jZDlkP2MkPXiQy/DBLA==", "dev": true, "requires": { - "execa": "^2.0.3" + "execa": "^3.3.0" }, "dependencies": { + "cross-spawn": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", + "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, "execa": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/execa/-/execa-2.0.4.tgz", - "integrity": "sha512-VcQfhuGD51vQUQtKIq2fjGDLDbL6N1DTQVpYzxZ7LPIXw3HqTuIz6uxRmpV1qf8i31LHf2kjiaGI+GdHwRgbnQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", + "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", "dev": true, "requires": { - "cross-spawn": "^6.0.5", + "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": "^3.0.0", + "npm-run-path": "^4.0.0", "onetime": "^5.1.0", "p-finally": "^2.0.0", "signal-exit": "^3.0.2", @@ -4525,9 +4767,9 @@ "dev": true }, "npm-run-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz", - "integrity": "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.0.tgz", + "integrity": "sha512-8eyAOAH+bYXFPSnNnKr3J+yoybe8O87Is5rtAQ8qRczJz1ajcsjg8l2oZqP+Ppx15Ii3S1vUTjQN2h4YO2tWWQ==", "dev": true, "requires": { "path-key": "^3.0.0" @@ -4549,10 +4791,34 @@ "dev": true }, "path-key": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.0.tgz", - "integrity": "sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg==", + "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 + }, + "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" + } } } }, @@ -4675,9 +4941,9 @@ "dev": true }, "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", "dev": true, "requires": { "inherits": "^2.0.1", @@ -4712,9 +4978,15 @@ "dev": true }, "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", + "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", + "dev": true + }, + "diff-sequences": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", + "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", "dev": true }, "diffie-hellman": { @@ -4787,9 +5059,9 @@ "dev": true }, "dom-serializer": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.1.tgz", - "integrity": "sha512-sK3ujri04WyjwQXVoK4PU3y8ula1stq10GJZpqHIUgoGZdsGzAGu65BnU3d08aTVSvO7mGPZUc0wTEDL+qGE0Q==", + "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", @@ -4942,21 +5214,21 @@ "dev": true }, "ejs": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.2.tgz", - "integrity": "sha512-PcW2a0tyTuPHz3tWyYqtK6r1fZ3gp+3Sop8Ph+ZYN81Ob5rwmbHEzaqs10N3BEsaGTkh/ooniXK+WwszGlc2+Q==", + "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.244", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.244.tgz", - "integrity": "sha512-nEfPd2EKnFeLuZ/+JsRG3KixRQwWf2SPpp09ftNt5ouGhg408N759+oXvdXy57+TcM34ykfJYj2JMkc1O3R0lQ==", + "version": "1.3.322", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.322.tgz", + "integrity": "sha512-Tc8JQEfGQ1MzfSzI/bTlSr7btJv/FFO7Yh6tanqVmIWOuNCu6/D1MilIEgLtmWqIrsv+o4IjpLAhgMBr/ncNAA==", "dev": true }, "elliptic": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.0.tgz", - "integrity": "sha512-eFOJTMyCYb7xtE/caJ6JJu+bhi67WCYNbkGSknu20pmM8Ke/bqOfdnZWxyoGN26JgfxTbXrsCkEw4KheCT/KGg==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", + "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", "dev": true, "requires": { "bn.js": "^4.4.0", @@ -4969,9 +5241,9 @@ } }, "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "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": { @@ -4987,23 +5259,35 @@ "dev": true }, "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==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, "requires": { "once": "^1.4.0" } }, "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", + "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", "dev": true, "requires": { "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", + "memory-fs": "^0.5.0", "tapable": "^1.0.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==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } } }, "entities": { @@ -5031,32 +5315,36 @@ } }, "error-stack-parser": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.3.tgz", - "integrity": "sha512-vRC4rKv87twMZy92X4+TmUdv3iYMsmePbpG/YguHsfzmZ8bYJZYYep7yrXH09yFUaCEPKgNK5X79+Yq7hwLVOA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.4.tgz", + "integrity": "sha512-fZ0KkoxSjLFmhW5lHbUT3tLwy3nX1qEzMYo8koY1vrsAco53CMT1djnBSeC/wUjTEZRhZl9iRw7PaMaxfJ4wzQ==", "dev": true, "requires": { - "stackframe": "^1.0.4" + "stackframe": "^1.1.0" } }, "es-abstract": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", - "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.3.tgz", + "integrity": "sha512-WtY7Fx5LiOnSYgF5eg/1T+GONaGmpvpPdCpSnYij+U2gDTL0UPfWrhDw7b2IYb+9NQJsYpCA0wOQvZfsd6YwRw==", "dev": true, "requires": { - "es-to-primitive": "^1.2.0", + "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", + "has-symbols": "^1.0.1", "is-callable": "^1.1.4", "is-regex": "^1.0.4", - "object-keys": "^1.0.12" + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "string.prototype.trimleft": "^2.1.0", + "string.prototype.trimright": "^2.1.0" } }, "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "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", @@ -5105,9 +5393,9 @@ } }, "eslint": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.2.2.tgz", - "integrity": "sha512-mf0elOkxHbdyGX1IJEUsNBzCDdyoUgljF3rRlgfyYh0pwGnreLc0jjD6ZuleOibjmnUWZLY2eXwSooeOgGJ2jw==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.7.2.tgz", + "integrity": "sha512-qMlSWJaCSxDFr8fBPvJM9kJwbazrhNcBU3+DszDW1OlEwKBBRWsJc7NJFelvwQpanHCR14cOLD41x8Eqvo3Nng==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -5117,19 +5405,19 @@ "debug": "^4.0.1", "doctrine": "^3.0.0", "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.2", + "eslint-utils": "^1.4.3", "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.1", + "espree": "^6.1.2", "esquery": "^1.0.1", "esutils": "^2.0.2", "file-entry-cache": "^5.0.1", "functional-red-black-tree": "^1.0.1", "glob-parent": "^5.0.0", - "globals": "^11.7.0", + "globals": "^12.1.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^6.4.1", + "inquirer": "^7.0.0", "is-glob": "^4.0.0", "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", @@ -5138,7 +5426,7 @@ "minimatch": "^3.0.4", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "optionator": "^0.8.2", + "optionator": "^0.8.3", "progress": "^2.0.0", "regexpp": "^2.0.1", "semver": "^6.1.2", @@ -5160,12 +5448,12 @@ } }, "eslint-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.2.tgz", - "integrity": "sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", "dev": true, "requires": { - "eslint-visitor-keys": "^1.0.0" + "eslint-visitor-keys": "^1.1.0" } }, "eslint-visitor-keys": { @@ -5175,18 +5463,27 @@ "dev": true }, "glob-parent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.0.0.tgz", - "integrity": "sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", "dev": true, "requires": { "is-glob": "^4.0.1" } }, + "globals": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", + "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, "import-fresh": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", - "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", "dev": true, "requires": { "parent-module": "^1.0.0", @@ -5216,6 +5513,12 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", "dev": true + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true } } }, @@ -5253,12 +5556,12 @@ } }, "eslint-module-utils": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.1.tgz", - "integrity": "sha512-H6DOj+ejw7Tesdgbfs4jeS4YMFrT8uI8xwd1gtQqXssaR0EQ26L+2O/w6wkYFy2MymON0fTwHmXBvvfLNZVZEw==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.5.0.tgz", + "integrity": "sha512-kCo8pZaNz2dsAW7nCUjuVoI11EBXXpIzfNxmaoLhXoRDOnqXLC4iSGVRdZPhOitfbdEfMEfKOiENaK6wDPZEGw==", "dev": true, "requires": { - "debug": "^2.6.8", + "debug": "^2.6.9", "pkg-dir": "^2.0.0" }, "dependencies": { @@ -5289,32 +5592,50 @@ } }, "eslint-plugin-es": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-1.4.0.tgz", - "integrity": "sha512-XfFmgFdIUDgvaRAlaXUkxrRg5JSADoRC8IkKLc/cISeR3yHVMefFHQZpcyXXEUUPHfy5DwviBcrfqlyqEwlQVw==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-1.4.1.tgz", + "integrity": "sha512-5fa/gR2yR3NxQf+UXkeLeP8FBBl6tSgdrAz1+cF84v1FMM4twGwQoqTnn+QxFLcPOrF4pdKEJKDB/q9GoyJrCA==", "dev": true, "requires": { - "eslint-utils": "^1.3.0", + "eslint-utils": "^1.4.2", "regexpp": "^2.0.1" + }, + "dependencies": { + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true + } } }, "eslint-plugin-import": { - "version": "2.18.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz", - "integrity": "sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ==", + "version": "2.19.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.19.1.tgz", + "integrity": "sha512-x68131aKoCZlCae7rDXKSAQmbT5DQuManyXo2sK6fJJ0aK5CWAkv6A6HJZGgqC8IhjQxYPgo6/IY4Oz8AFsbBw==", "dev": true, "requires": { "array-includes": "^3.0.3", + "array.prototype.flat": "^1.2.1", "contains-path": "^0.1.0", "debug": "^2.6.9", "doctrine": "1.5.0", "eslint-import-resolver-node": "^0.3.2", - "eslint-module-utils": "^2.4.0", + "eslint-module-utils": "^2.4.1", "has": "^1.0.3", "minimatch": "^3.0.4", "object.values": "^1.1.0", "read-pkg-up": "^2.0.0", - "resolve": "^1.11.0" + "resolve": "^1.12.0" }, "dependencies": { "debug": { @@ -5399,29 +5720,44 @@ } }, "eslint-plugin-node": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-9.1.0.tgz", - "integrity": "sha512-ZwQYGm6EoV2cfLpE1wxJWsfnKUIXfM/KM09/TlorkukgCAwmkgajEJnPCmyzoFPQQkmvo5DrW/nyKutNIw36Mw==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-9.2.0.tgz", + "integrity": "sha512-2abNmzAH/JpxI4gEOwd6K8wZIodK3BmHbTxz4s79OIYwwIt2gkpEXlAouJXu4H1c9ySTnRso0tsuthSOZbUMlA==", "dev": true, "requires": { - "eslint-plugin-es": "^1.4.0", - "eslint-utils": "^1.3.1", + "eslint-plugin-es": "^1.4.1", + "eslint-utils": "^1.4.2", "ignore": "^5.1.1", "minimatch": "^3.0.4", "resolve": "^1.10.1", "semver": "^6.1.0" }, "dependencies": { + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true + }, "ignore": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.2.tgz", - "integrity": "sha512-vdqWBp7MyzdmHkkRWV5nY+PfGRbYbahfuvsBCh277tq+w9zyNi7h5CYJCK0kmzti9kU+O/cB7sE8HvKv6aXAKQ==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", + "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", "dev": true }, "semver": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz", - "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } @@ -5470,26 +5806,26 @@ "dev": true }, "espree": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.1.tgz", - "integrity": "sha512-EYbr8XZUhWbYCqQRW0duU5LxzL5bETN6AjKBGy1302qqzPaCH10QbRg3Wvco79Z8x9WbiE8HYB4e75xl6qUYvQ==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", + "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", "dev": true, "requires": { - "acorn": "^7.0.0", - "acorn-jsx": "^5.0.2", + "acorn": "^7.1.0", + "acorn-jsx": "^5.1.0", "eslint-visitor-keys": "^1.1.0" }, "dependencies": { "acorn": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.0.0.tgz", - "integrity": "sha512-PaF/MduxijYYt7unVGRuds1vBC9bFxbNf+VWqhOClfdgy7RlVkQqt610ig1/yxTgsDIfW1cWDel5EBbOy3jdtQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", + "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", "dev": true }, "acorn-jsx": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.2.tgz", - "integrity": "sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", + "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", "dev": true }, "eslint-visitor-keys": { @@ -5549,9 +5885,9 @@ "dev": true }, "eventemitter3": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", + "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==", "dev": true }, "events": { @@ -5705,25 +6041,67 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "^1.1.5" + } + } + } + }, + "expect": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-23.6.0.tgz", + "integrity": "sha512-dgSoOHgmtn/aDGRVFWclQyPDKl2CQRq0hmIEoUAuQs/2rn2NcvCWcSCovm6BLeuB/7EZuLGu2QfnR+qRt5OM4w==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "jest-diff": "^23.6.0", + "jest-get-type": "^22.1.0", + "jest-matcher-utils": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-regex-util": "^23.3.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "jest-diff": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-23.6.0.tgz", + "integrity": "sha512-Gz9l5Ov+X3aL5L37IT+8hoCUsof1CVYBb2QEkOupK64XyRR3h+uRpYIm97K7sY8diFxowR8pIGEdyfMKTixo3g==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff": "^3.2.0", + "jest-get-type": "^22.1.0", + "pretty-format": "^23.6.0" + } + }, + "jest-get-type": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", + "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", + "dev": true + }, + "pretty-format": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", + "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" } } } }, - "expect": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-23.6.0.tgz", - "integrity": "sha512-dgSoOHgmtn/aDGRVFWclQyPDKl2CQRq0hmIEoUAuQs/2rn2NcvCWcSCovm6BLeuB/7EZuLGu2QfnR+qRt5OM4w==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "jest-diff": "^23.6.0", - "jest-get-type": "^22.1.0", - "jest-matcher-utils": "^23.6.0", - "jest-message-util": "^23.4.0", - "jest-regex-util": "^23.3.0" - } - }, "express": { "version": "4.17.1", "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", @@ -5951,12 +6329,12 @@ } }, "fb-watchman": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", - "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", + "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.0.0" + "bser": "2.1.1" } }, "figgy-pudding": { @@ -5966,9 +6344,9 @@ "dev": true }, "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", + "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", "dev": true, "requires": { "escape-string-regexp": "^1.0.5" @@ -6147,9 +6525,9 @@ } }, "follow-redirects": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.8.1.tgz", - "integrity": "sha512-micCIbldHioIegeKs41DoH0KS3AXfFzgS30qVkM6z/XOE/GJgvmsoc839NUqa1B9udYe9dQxgv7KFwng6+p/dw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.9.0.tgz", + "integrity": "sha512-CRcPzsSIbXyVDl0QI01muNDu69S8trU4jArW9LpOt2WtC6LyUJetcIrmfHsRBx7/Jb6GHJUiuqyYxPooFfNt6A==", "dev": true, "requires": { "debug": "^3.0.0" @@ -6273,9 +6651,9 @@ "dev": true }, "fsevents": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", - "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.10.tgz", + "integrity": "sha512-Dw5DScF/8AWhWzWRbnQrFJfeR/TOJZjRr9Du9kfmd8t234ICcVeDBlauFl/jVcE5ZewhlPoCFvIqp0SE3kAVxA==", "dev": true, "optional": true, "requires": { @@ -6328,7 +6706,7 @@ } }, "chownr": { - "version": "1.1.1", + "version": "1.1.3", "bundled": true, "dev": true, "optional": true @@ -6358,7 +6736,7 @@ "optional": true }, "debug": { - "version": "4.1.1", + "version": "3.2.6", "bundled": true, "dev": true, "optional": true, @@ -6385,12 +6763,12 @@ "optional": true }, "fs-minipass": { - "version": "1.2.5", + "version": "1.2.7", "bundled": true, "dev": true, "optional": true, "requires": { - "minipass": "^2.2.1" + "minipass": "^2.6.0" } }, "fs.realpath": { @@ -6416,7 +6794,7 @@ } }, "glob": { - "version": "7.1.3", + "version": "7.1.6", "bundled": true, "dev": true, "optional": true, @@ -6445,7 +6823,7 @@ } }, "ignore-walk": { - "version": "3.0.1", + "version": "3.0.3", "bundled": true, "dev": true, "optional": true, @@ -6464,7 +6842,7 @@ } }, "inherits": { - "version": "2.0.3", + "version": "2.0.4", "bundled": true, "dev": true, "optional": true @@ -6506,7 +6884,7 @@ "optional": true }, "minipass": { - "version": "2.3.5", + "version": "2.9.0", "bundled": true, "dev": true, "optional": true, @@ -6516,12 +6894,12 @@ } }, "minizlib": { - "version": "1.2.1", + "version": "1.3.3", "bundled": true, "dev": true, "optional": true, "requires": { - "minipass": "^2.2.1" + "minipass": "^2.9.0" } }, "mkdirp": { @@ -6534,18 +6912,18 @@ } }, "ms": { - "version": "2.1.1", + "version": "2.1.2", "bundled": true, "dev": true, "optional": true }, "needle": { - "version": "2.3.0", + "version": "2.4.0", "bundled": true, "dev": true, "optional": true, "requires": { - "debug": "^4.1.0", + "debug": "^3.2.6", "iconv-lite": "^0.4.4", "sax": "^1.2.4" } @@ -6579,13 +6957,22 @@ } }, "npm-bundled": { - "version": "1.0.6", + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", "bundled": true, "dev": true, "optional": true }, "npm-packlist": { - "version": "1.4.1", + "version": "1.4.7", "bundled": true, "dev": true, "optional": true, @@ -6656,7 +7043,7 @@ "optional": true }, "process-nextick-args": { - "version": "2.0.0", + "version": "2.0.1", "bundled": true, "dev": true, "optional": true @@ -6697,7 +7084,7 @@ } }, "rimraf": { - "version": "2.6.3", + "version": "2.7.1", "bundled": true, "dev": true, "optional": true, @@ -6724,7 +7111,7 @@ "optional": true }, "semver": { - "version": "5.7.0", + "version": "5.7.1", "bundled": true, "dev": true, "optional": true @@ -6777,18 +7164,18 @@ "optional": true }, "tar": { - "version": "4.4.8", + "version": "4.4.13", "bundled": true, "dev": true, "optional": true, "requires": { "chownr": "^1.1.1", "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", "mkdirp": "^0.5.0", "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" + "yallist": "^3.0.3" } }, "util-deprecate": { @@ -6813,7 +7200,7 @@ "optional": true }, "yallist": { - "version": "3.0.3", + "version": "3.1.1", "bundled": true, "dev": true, "optional": true @@ -6863,9 +7250,9 @@ } }, "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "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", @@ -6962,9 +7349,9 @@ } }, "graceful-fs": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", - "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", "dev": true }, "growly": { @@ -6990,9 +7377,9 @@ "dev": true }, "handlebars": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", - "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.3.tgz", + "integrity": "sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA==", "dev": true, "requires": { "neo-async": "^2.6.0", @@ -7058,9 +7445,9 @@ "dev": true }, "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "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 }, "has-value": { @@ -7134,10 +7521,13 @@ "dev": true }, "highlight.js": { - "version": "9.15.10", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.15.10.tgz", - "integrity": "sha512-RoV7OkQm0T3os3Dd2VHLNMoaoDVx77Wygln3n9l5YV172XonWG6rgQD3XnF/BuFFZw9A0TJgmMSO8FEWQgvcXw==", - "dev": true + "version": "9.17.1", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.17.1.tgz", + "integrity": "sha512-TA2/doAur5Ol8+iM3Ov7qy3jYcr/QiJ2eDTdRF4dfbjG7AaaB99J5G+zSl11ljbl6cIcahgPY6SKb3sC3EJ0fw==", + "dev": true, + "requires": { + "handlebars": "^4.5.3" + } }, "hmac-drbg": { "version": "1.0.1", @@ -7167,9 +7557,9 @@ "dev": true }, "hosted-git-info": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.4.tgz", - "integrity": "sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==", + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", + "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==", "dev": true }, "hpack.js": { @@ -7378,12 +7768,12 @@ "dev": true }, "http-proxy": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", - "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz", + "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==", "dev": true, "requires": { - "eventemitter3": "^3.0.0", + "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", "requires-port": "^1.0.0" } @@ -7417,6 +7807,12 @@ "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", @@ -7568,31 +7964,114 @@ "dev": true }, "inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.0.tgz", + "integrity": "sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ==", "dev": true, "requires": { - "ansi-escapes": "^3.2.0", + "ansi-escapes": "^4.2.1", "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", + "cli-cursor": "^3.1.0", "cli-width": "^2.0.0", "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", "run-async": "^2.2.0", "rxjs": "^6.4.0", - "string-width": "^2.1.0", + "string-width": "^4.1.0", "strip-ansi": "^5.1.0", "through": "^2.3.6" }, "dependencies": { + "ansi-escapes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", + "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "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 + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.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 + }, "lodash": { "version": "4.17.15", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true + }, + "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 + }, + "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" + } + }, + "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" + } + }, + "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" + }, + "dependencies": { + "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" + } + } + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true } } }, @@ -7628,9 +8107,9 @@ } }, "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", "dev": true }, "ip": { @@ -7955,12 +8434,12 @@ } }, "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "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": { - "has-symbols": "^1.0.0" + "has-symbols": "^1.0.1" } }, "is-typedarray": { @@ -8253,6 +8732,12 @@ "yargs": "^11.0.0" } }, + "jest-get-type": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", + "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", + "dev": true + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -8340,6 +8825,12 @@ "pretty-format": "^23.6.0" }, "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, "arr-diff": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", @@ -8435,6 +8926,12 @@ "is-extglob": "^1.0.0" } }, + "jest-get-type": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", + "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", + "dev": true + }, "json5": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", @@ -8486,6 +8983,16 @@ "remove-trailing-separator": "^1.0.1" } }, + "pretty-format": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", + "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + }, "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", @@ -8495,15 +9002,15 @@ } }, "jest-diff": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-23.6.0.tgz", - "integrity": "sha512-Gz9l5Ov+X3aL5L37IT+8hoCUsof1CVYBb2QEkOupK64XyRR3h+uRpYIm97K7sY8diFxowR8pIGEdyfMKTixo3g==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", + "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", "dev": true, "requires": { "chalk": "^2.0.1", - "diff": "^3.2.0", - "jest-get-type": "^22.1.0", - "pretty-format": "^23.6.0" + "diff-sequences": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" } }, "jest-docblock": { @@ -8523,6 +9030,24 @@ "requires": { "chalk": "^2.0.1", "pretty-format": "^23.6.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "pretty-format": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", + "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + } } }, "jest-environment-jsdom": { @@ -8547,9 +9072,9 @@ } }, "jest-get-type": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", - "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", "dev": true }, "jest-haste-map": { @@ -8669,15 +9194,15 @@ } }, "jest-html-reporter": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/jest-html-reporter/-/jest-html-reporter-2.5.0.tgz", - "integrity": "sha512-28zBX65d5zYq0tG/hRZGcSWGEB13e8ZWWwvBI6VTlERoOJzIWbwGcjZQcGLCXXBL8xTMUeat+5X5C7sHGI5nmQ==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jest-html-reporter/-/jest-html-reporter-2.8.0.tgz", + "integrity": "sha512-Lk6LxAdCfDlzE4AMVCvW+UqNpFxXwsoQZ5Y7/usuQ/2ikFvyb20BVzepMg/sUGGAjGsc+mssGNvW2zPHKDn6yw==", "dev": true, "requires": { "dateformat": "3.0.2", "mkdirp": "0.5.1", "strip-ansi": "3.0.1", - "xmlbuilder": "8.2.2" + "xmlbuilder": "13.0.2" }, "dependencies": { "ansi-regex": { @@ -8715,6 +9240,48 @@ "jest-snapshot": "^23.6.0", "jest-util": "^23.4.0", "pretty-format": "^23.6.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "jest-diff": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-23.6.0.tgz", + "integrity": "sha512-Gz9l5Ov+X3aL5L37IT+8hoCUsof1CVYBb2QEkOupK64XyRR3h+uRpYIm97K7sY8diFxowR8pIGEdyfMKTixo3g==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff": "^3.2.0", + "jest-get-type": "^22.1.0", + "pretty-format": "^23.6.0" + } + }, + "jest-get-type": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", + "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", + "dev": true + }, + "pretty-format": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", + "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + } } }, "jest-leak-detector": { @@ -8724,6 +9291,24 @@ "dev": true, "requires": { "pretty-format": "^23.6.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "pretty-format": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", + "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + } } }, "jest-matcher-utils": { @@ -8735,6 +9320,30 @@ "chalk": "^2.0.1", "jest-get-type": "^22.1.0", "pretty-format": "^23.6.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "jest-get-type": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", + "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", + "dev": true + }, + "pretty-format": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", + "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + } } }, "jest-message-util": { @@ -9130,6 +9739,48 @@ "natural-compare": "^1.4.0", "pretty-format": "^23.6.0", "semver": "^5.5.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "jest-diff": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-23.6.0.tgz", + "integrity": "sha512-Gz9l5Ov+X3aL5L37IT+8hoCUsof1CVYBb2QEkOupK64XyRR3h+uRpYIm97K7sY8diFxowR8pIGEdyfMKTixo3g==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff": "^3.2.0", + "jest-get-type": "^22.1.0", + "pretty-format": "^23.6.0" + } + }, + "jest-get-type": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", + "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", + "dev": true + }, + "pretty-format": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", + "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + } } }, "jest-transform-stub": { @@ -9178,6 +9829,30 @@ "jest-get-type": "^22.1.0", "leven": "^2.1.0", "pretty-format": "^23.6.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "jest-get-type": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", + "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", + "dev": true + }, + "pretty-format": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", + "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + } } }, "jest-watch-typeahead": { @@ -9355,9 +10030,9 @@ "dev": true }, "json5": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", - "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", + "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", "dev": true, "requires": { "minimist": "^1.2.0" @@ -9427,12 +10102,12 @@ } }, "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", "dev": true, "requires": { - "invert-kv": "^1.0.0" + "invert-kv": "^2.0.0" } }, "left-pad": { @@ -9586,9 +10261,9 @@ } }, "loglevel": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.3.tgz", - "integrity": "sha512-LoEDv5pgpvWgPF4kNYuIp0qqSJVWak/dML0RY74xlzMZiT9w77teNAwKYKWBTYjlokMirg+o3jBwp+vlLrcfAA==", + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.6.tgz", + "integrity": "sha512-Sgr5lbboAUBo3eXCSPL4/KoVz3ROKquOjcctxmHIt+vol2DrqTQe3SwkKKuYhEiWB5kYa13YyopJ69deJ1irzQ==", "dev": true }, "loose-envify": { @@ -9708,12 +10383,22 @@ "dev": true }, "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", "dev": true, "requires": { - "mimic-fn": "^1.0.0" + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + }, + "dependencies": { + "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 + } } }, "memory-fs": { @@ -9765,9 +10450,9 @@ } }, "merge2": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.4.tgz", - "integrity": "sha512-FYE8xI+6pjFOhokZu0We3S5NKCirLbCzSh2Usf3qEyr4X8U+0jNg9P8RZ4qz+V2UoECLVwSyzU3LxXBaLGtD3A==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", + "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==", "dev": true }, "methods": { @@ -9814,18 +10499,18 @@ "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==", + "version": "1.42.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz", + "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==", "dev": true }, "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "version": "2.1.25", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.25.tgz", + "integrity": "sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==", "dev": true, "requires": { - "mime-db": "1.40.0" + "mime-db": "1.42.0" } }, "mimic-fn": { @@ -9835,26 +10520,27 @@ "dev": true }, "mini-css-extract-plugin": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.6.0.tgz", - "integrity": "sha512-79q5P7YGI6rdnVyIAV4NXpBQJFWdkzJxCim3Kog4078fM0piAaFlwocqbejdWtLW1cEzCexPrh6EdyFsPgVdAw==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.0.tgz", + "integrity": "sha512-MNpRGbNA52q6U92i0qbVpQNsgk7LExy41MdAlG84FeytfDOtRIf/mCHdEgG8rpTKOaNKiqUnZdlptF469hxqOw==", "dev": true, "requires": { "loader-utils": "^1.1.0", - "normalize-url": "^2.0.1", + "normalize-url": "1.9.1", "schema-utils": "^1.0.0", "webpack-sources": "^1.1.0" }, "dependencies": { "normalize-url": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", - "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", "dev": true, "requires": { - "prepend-http": "^2.0.0", - "query-string": "^5.0.1", - "sort-keys": "^2.0.0" + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" } } } @@ -9993,9 +10679,9 @@ "dev": true }, "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, "mz": { @@ -10098,9 +10784,9 @@ } }, "node-forge": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", - "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", + "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", "dev": true }, "node-int64": { @@ -10173,12 +10859,20 @@ } }, "node-releases": { - "version": "1.1.28", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.28.tgz", - "integrity": "sha512-AQw4emh6iSXnCpDiFe0phYcThiccmkNWMZnFZ+lDJjAP8J0m2fVd59duvUUyuTirQOhIAajTFkzG6FHCLBO59g==", + "version": "1.1.42", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.42.tgz", + "integrity": "sha512-OQ/ESmUqGawI2PRX+XIRao44qWYBBfN54ImQYdWVTQqUckuejOg76ysSqDBK8NG3zwySRVnX36JwDQ6x+9GxzA==", "dev": true, "requires": { - "semver": "^5.3.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 + } } }, "nopt": { @@ -10252,9 +10946,9 @@ "dev": true }, "nwsapi": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz", - "integrity": "sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", "dev": true }, "oauth-sign": { @@ -10300,6 +10994,12 @@ } } }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, "object-is": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", @@ -10334,13 +11034,34 @@ } }, "object.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0-next.1.tgz", + "integrity": "sha512-7MmGr03N7Rnuid6+wyhD9sHNE2n4tFSwExnU2lQl3lIo2ShXWGePY80zYaoMOmILWv57H0amMjZGHNzzGG70Rw==", + "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.1.4", + "is-regex": "^1.0.4", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.0", + "string.prototype.trimright": "^2.1.0" + } + } } }, "object.omit": { @@ -10363,15 +11084,36 @@ } }, "object.values": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", - "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", "dev": true, "requires": { "define-properties": "^1.1.3", - "es-abstract": "^1.12.0", + "es-abstract": "^1.17.0-next.1", "function-bind": "^1.1.1", "has": "^1.0.3" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0-next.1.tgz", + "integrity": "sha512-7MmGr03N7Rnuid6+wyhD9sHNE2n4tFSwExnU2lQl3lIo2ShXWGePY80zYaoMOmILWv57H0amMjZGHNzzGG70Rw==", + "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.1.4", + "is-regex": "^1.0.4", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.0", + "string.prototype.trimright": "^2.1.0" + } + } } }, "obuf": { @@ -10456,25 +11198,17 @@ } }, "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, "requires": { "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", + "fast-levenshtein": "~2.0.6", "levn": "~0.3.0", "prelude-ls": "~1.1.2", "type-check": "~0.3.2", - "wordwrap": "~1.0.0" - }, - "dependencies": { - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - } + "word-wrap": "~1.2.3" } }, "ora": { @@ -10513,64 +11247,14 @@ "dev": true }, "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", "dev": true, "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" } }, "os-tmpdir": { @@ -10653,12 +11337,12 @@ "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=", + "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": "~0.2.2", + "cyclist": "^1.0.1", "inherits": "^2.0.3", "readable-stream": "^2.1.5" } @@ -10690,9 +11374,9 @@ } }, "parse-asn1": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", - "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", "dev": true, "requires": { "asn1.js": "^4.0.0", @@ -10747,6 +11431,23 @@ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", "dev": true }, + "parse5-htmlparser2-tree-adapter": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-5.1.1.tgz", + "integrity": "sha512-CF+TKjXqoqyDwHqBhFQ+3l5t83xYi6fVT1tQNg+Ye0JRLnTxWvIroCjEp1A0k4lneHNBGnICUf0cfYVYGEazqw==", + "dev": true, + "requires": { + "parse5": "^5.1.1" + }, + "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==", + "dev": true + } + } + }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -10934,36 +11635,24 @@ "dev": true }, "portfinder": { - "version": "1.0.23", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.23.tgz", - "integrity": "sha512-B729mL/uLklxtxuiJKfQ84WPxNw5a7Yhx3geQZdcA4GjNjZSTSSMMWyoennMVnTWSmAR0lMdzWYN0JLnHrg1KQ==", + "version": "1.0.25", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", + "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==", "dev": true, "requires": { - "async": "^1.5.2", - "debug": "^2.2.0", - "mkdirp": "0.5.x" + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.1" }, "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true } } }, @@ -10974,9 +11663,9 @@ "dev": true }, "postcss": { - "version": "7.0.17", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", - "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "version": "7.0.24", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.24.tgz", + "integrity": "sha512-Xl0XvdNWg+CblAXzNvbSOUvgJXwSjmbAKORqyw9V2AlHrm1js2gFw9y3jibBAhpKZi8b5JzJCVh/FyzPsTtgTA==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -11490,9 +12179,9 @@ "dev": true }, "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", "dev": true }, "preserve": { @@ -11502,9 +12191,9 @@ "dev": true }, "prettier": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.16.3.tgz", - "integrity": "sha512-kn/GU6SMRYPxUakNXhpP0EedT/KmaPzr0H5lIsDogrykbaxOpOfAFfk5XA7DZrJyMAv1wlMV3CPcZruGXVVUZw==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", "dev": true }, "pretty": { @@ -11540,21 +12229,15 @@ } }, "pretty-format": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", - "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", "dev": true, "requires": { - "ansi-regex": "^3.0.0", - "ansi-styles": "^3.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - } + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" } }, "private": { @@ -11626,9 +12309,9 @@ "dev": true }, "psl": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.3.0.tgz", - "integrity": "sha512-avHdspHO+9rQTLbv1RO+MPYeP/SzsCoxofjVnHanETfQhTJrmB0HlDoW+EiN/R+C0BZ+gERab9NY0lPN2TxNag==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.6.0.tgz", + "integrity": "sha512-SYKKmVel98NCOYXpkwUqZqh0ahZeeKfmisiLIcEZdsb+WbLv02g/dI5BUmZnIyOe7RzZtLax81nnb2HbvC2tzA==", "dev": true }, "public-encrypt": { @@ -11697,12 +12380,11 @@ "dev": true }, "query-string": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", "dev": true, "requires": { - "decode-uri-component": "^0.2.0", "object-assign": "^4.1.0", "strict-uri-encode": "^1.0.0" } @@ -11781,6 +12463,12 @@ "unpipe": "1.0.0" } }, + "react-is": { + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", + "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==", + "dev": true + }, "read-pkg": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", @@ -11926,12 +12614,6 @@ "safe-regex": "^1.1.0" } }, - "regexp-tree": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.12.tgz", - "integrity": "sha512-TsXZ8+cv2uxMEkLfgwO0E068gsNMLfuYwMMhiUxf0Kw2Vcgzq93vgl6wIlIYuPmfMqMjfQ9zAporiozqCnwLuQ==", - "dev": true - }, "regexp.prototype.flags": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz", @@ -11948,9 +12630,9 @@ "dev": true }, "regexpu-core": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.5.tgz", - "integrity": "sha512-FpI67+ky9J+cDizQUJlIlNZFKual/lUkFr1AG6zOCpwZ9cLrg8UUVakyUQJD7fCDIe9Z2nwTQJNPyonatNmDFQ==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz", + "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==", "dev": true, "requires": { "regenerate": "^1.4.0", @@ -11962,15 +12644,15 @@ } }, "regjsgen": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", - "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", + "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==", "dev": true }, "regjsparser": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", - "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.1.tgz", + "integrity": "sha512-7LutE94sz/NKSYegK+/4E77+8DipxF+Qn2Tmu362AcmsF2NYq/wx3+ObvU90TKEhjf7hQoFXo23ajjrXP7eUgg==", "dev": true, "requires": { "jsesc": "~0.5.0" @@ -12027,6 +12709,12 @@ "nth-check": "~1.0.1" } }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "dev": true + }, "domutils": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", @@ -12098,21 +12786,29 @@ } }, "request-promise-core": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", - "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", + "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", "dev": true, "requires": { - "lodash": "^4.17.11" + "lodash": "^4.17.15" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } } }, "request-promise-native": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", - "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", + "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", "dev": true, "requires": { - "request-promise-core": "1.1.2", + "request-promise-core": "1.1.3", "stealthy-require": "^1.1.1", "tough-cookie": "^2.3.3" } @@ -12142,9 +12838,9 @@ "dev": true }, "resolve": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", - "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.13.1.tgz", + "integrity": "sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -12249,9 +12945,9 @@ } }, "rxjs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", - "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", + "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -12296,9 +12992,9 @@ } }, "sass": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.22.10.tgz", - "integrity": "sha512-DUpS1tVMGCH6gr/N9cXCoemrjoNdOLhAHfQ37fJw2A5ZM4gSI9ej/8Xi95Xwus03RqZ2zdSnKZGULL7oS+jfMA==", + "version": "1.23.7", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.23.7.tgz", + "integrity": "sha512-cYgc0fanwIpi0rXisGxl+/wadVQ/HX3RhpdRcjLdj2o2ye/sxUTpAxIhbmJy3PLQgRFbf6Pn8Jsrta2vdXcoOQ==", "dev": true, "requires": { "chokidar": ">=2.0.0 <4.0.0" @@ -12328,12 +13024,12 @@ "dev": true }, "selfsigned": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz", - "integrity": "sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==", + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", + "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", "dev": true, "requires": { - "node-forge": "0.7.5" + "node-forge": "0.9.0" } }, "semver": { @@ -12395,9 +13091,9 @@ } }, "serialize-javascript": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.8.0.tgz", - "integrity": "sha512-3tHgtF4OzDmeKYj6V9nSyceRS0UJ3C7VqyD2Yj28vC/z2j6jG5FmFGahOKMD9CrglxTm3tETr87jEypaYV8DUg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", + "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", "dev": true }, "serve-index": { @@ -12535,9 +13231,9 @@ "dev": true }, "shell-quote": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.1.tgz", - "integrity": "sha512-2kUqeAGnMAu6YrTPX4E3LfxacH9gKljzVjlkUeSqY0soGwK4KLl7TURXCem712tkhBCeeaFP9QK4dKn88s3Icg==", + "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": { @@ -12731,9 +13427,9 @@ } }, "sockjs-client": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", - "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", + "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", "dev": true, "requires": { "debug": "^3.2.5", @@ -12765,9 +13461,9 @@ } }, "sort-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", - "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", "dev": true, "requires": { "is-plain-obj": "^1.0.0" @@ -12799,9 +13495,9 @@ } }, "source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -12948,9 +13644,9 @@ "dev": true }, "stackframe": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.0.4.tgz", - "integrity": "sha512-to7oADIniaYwS3MhtCa/sQhrxidCCQiF/qp4/m5iN3ipf0Y7Xlri0f6eG29r08aL7JYl8n32AF3Q5GYBZ7K8vw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.1.0.tgz", + "integrity": "sha512-Vx6W1Yvy+AM1R/ckVwcHQHV147pTPBKWCRLrXMuPrFVfvBUc3os7PR1QLIWCMhPpRg5eX9ojzbQIMLGBwyLjqg==", "dev": true }, "static-extend": { @@ -13020,9 +13716,9 @@ } }, "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 }, "strict-uri-encode": { @@ -13107,6 +13803,26 @@ "function-bind": "^1.0.2" } }, + "string.prototype.trimleft": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", + "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", + "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -13198,17 +13914,17 @@ "dev": true }, "svgo": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.0.tgz", - "integrity": "sha512-MLfUA6O+qauLDbym+mMZgtXCGRfIxyQoeH6IKVcFslyODEe/ElJNwr0FohQ3xG4C6HK6bk3KYPPXwHVJk3V5NQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", "dev": true, "requires": { "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.33", - "csso": "^3.5.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", @@ -13236,6 +13952,12 @@ "string-width": "^3.0.0" }, "dependencies": { + "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 + }, "lodash": { "version": "4.17.15", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", @@ -13262,9 +13984,9 @@ "dev": true }, "terser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.2.1.tgz", - "integrity": "sha512-cGbc5utAcX4a9+2GGVX4DsenG6v0x3glnDi5hx8816X1McEAwPlPgRtXPJzSBsbpILxZ8MQMT0KvArLuE0HP5A==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.4.2.tgz", + "integrity": "sha512-Uufrsvhj9O1ikwgITGsZ5EZS6qPokUOkCegS7fYOdGTv+OA90vndUbU6PEjr5ePqHfNUbGyMO7xyIZv2MhsALQ==", "dev": true, "requires": { "commander": "^2.20.0", @@ -13281,16 +14003,16 @@ } }, "terser-webpack-plugin": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz", - "integrity": "sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", + "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", "dev": true, "requires": { "cacache": "^12.0.2", "find-cache-dir": "^2.1.0", "is-wsl": "^1.1.0", "schema-utils": "^1.0.0", - "serialize-javascript": "^1.7.0", + "serialize-javascript": "^2.1.2", "source-map": "^0.6.1", "terser": "^4.1.2", "webpack-sources": "^1.4.0", @@ -13476,9 +14198,9 @@ } }, "thunky": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", - "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, "timers-browserify": { @@ -13617,15 +14339,16 @@ "dev": true }, "ts-jest": { - "version": "24.0.2", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-24.0.2.tgz", - "integrity": "sha512-h6ZCZiA1EQgjczxq+uGLXQlNgeg02WWJBbeT8j6nyIBRQdglqbvzDoHahTEIiS6Eor6x8mK6PfZ7brQ9Q6tzHw==", + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-24.2.0.tgz", + "integrity": "sha512-Yc+HLyldlIC9iIK8xEN7tV960Or56N49MDP7hubCZUeI7EbIOTsas6rXCMB4kQjLACJ7eDOF4xWEO5qumpKsag==", "dev": true, "requires": { "bs-logger": "0.x", "buffer-from": "1.x", "fast-json-stable-stringify": "2.x", "json5": "2.x", + "lodash.memoize": "4.x", "make-error": "1.x", "mkdirp": "0.x", "resolve": "1.x", @@ -13690,16 +14413,16 @@ "dev": true }, "tslint": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.19.0.tgz", - "integrity": "sha512-1LwwtBxfRJZnUvoS9c0uj8XQtAnyhWr9KlNvDIdB+oXyT+VpsOAaEhEgKi1HrZ8rq0ki/AAnbGSv4KM6/AfVZw==", + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", + "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "builtin-modules": "^1.1.1", "chalk": "^2.3.0", "commander": "^2.12.1", - "diff": "^3.2.0", + "diff": "^4.0.1", "glob": "^7.1.1", "js-yaml": "^3.13.1", "minimatch": "^3.0.4", @@ -13783,19 +14506,19 @@ "dev": true }, "typescript": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.6.2.tgz", - "integrity": "sha512-lmQ4L+J6mnu3xweP8+rOrUwzmN+MRAj7TgtJtDaXE5PMyX2kCrklhg3rvOsOIfNeAWMQWO2F1GPc1kMD2vLAfw==", + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.3.tgz", + "integrity": "sha512-Mcr/Qk7hXqFBXMN7p7Lusj1ktCBydylfQM/FZCk5glCNQJrCUKPkMHdo9R0MTFWsC/4kPFvDS0fDPvukfCkFsw==", "dev": true }, "uglify-js": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", - "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.7.2.tgz", + "integrity": "sha512-uhRwZcANNWVLrxLfNFEdltoPNhECUR3lc+UdJoG9CBpMcSnKyWA94tc3eAujB1GcMY5Uwq8ZMp4qWpxWYDQmaA==", "dev": true, "optional": true, "requires": { - "commander": "~2.20.0", + "commander": "~2.20.3", "source-map": "~0.6.1" }, "dependencies": { @@ -13937,9 +14660,9 @@ } }, "upath": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", - "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", "dev": true }, "upper-case": { @@ -14099,9 +14822,9 @@ } }, "vm-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", - "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", "dev": true }, "vue": { @@ -14148,15 +14871,15 @@ } }, "vue-hot-reload-api": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.3.tgz", - "integrity": "sha512-KmvZVtmM26BQOMK1rwUZsrqxEGeKiYSZGA7SNWE6uExx8UX/cj9hq2MRV/wWC3Cq6AoeDGk57rL9YMFRel/q+g==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz", + "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==", "dev": true }, "vue-jest": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/vue-jest/-/vue-jest-3.0.4.tgz", - "integrity": "sha512-PY9Rwt4OyaVlA+KDJJ0614CbEvNOkffDI9g9moLQC/2DDoo0YrqZm7dHi13Q10uoK5Nt5WCYFdeAheOExPah0w==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/vue-jest/-/vue-jest-3.0.5.tgz", + "integrity": "sha512-xWDxde91pDqYBGDlODENZ3ezPgw+IQFoVDtf+5Awlg466w3KvMSqWzs8PxcTeTr+wmAHi0j+a+Lm3R7aUJa1jA==", "dev": true, "requires": { "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0", @@ -14172,9 +14895,9 @@ } }, "vue-loader": { - "version": "15.7.1", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.7.1.tgz", - "integrity": "sha512-fwIKtA23Pl/rqfYP5TSGK7gkEuLhoTvRYW+TU7ER3q9GpNLt/PjG5NLv3XHRDiTg7OPM1JcckBgds+VnAc+HbA==", + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.7.2.tgz", + "integrity": "sha512-H/P9xt/nkocyu4hZKg5TzPqyCT1oKOaCSk9zs0JCbJuy0Q8KtR0bjJpnT/5R5x/Ckd1GFkkLQnQ1C4x6xXeLZg==", "dev": true, "requires": { "@vue/component-compiler-utils": "^3.0.0", @@ -14194,17 +14917,17 @@ } }, "vue-property-decorator": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/vue-property-decorator/-/vue-property-decorator-8.2.2.tgz", - "integrity": "sha512-3gRrIeoUtjXvkoMX2stJsVs7805Pa9MXEndnk21ej+sWO7AIc5HF1TKqK0Pox5TEjpO02UbadIF0QWNrx6ZwXQ==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/vue-property-decorator/-/vue-property-decorator-8.3.0.tgz", + "integrity": "sha512-77YtTbZHd5CNiPzbqv51kEgL48yvD2dUDfF28vEyw3MbQ9bBAb/tDyFzskcqjNRbWyXk1vq4oM2CK/LfhxuIBg==", "requires": { - "vue-class-component": "^7.0.1" + "vue-class-component": "^7.1.0" } }, "vue-router": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.1.2.tgz", - "integrity": "sha512-WssQEHSEvIS1/CI4CO2T8LJdoK4Q9Ngox28K7FDNMTfzNTk2WS5D0dDlqYCaPG+AG4Z8wJkn1KrBc7AhspZJUQ==" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.1.3.tgz", + "integrity": "sha512-8iSa4mGNXBjyuSZFCCO4fiKfvzqk+mhL0lnKuGcQtO1eoj8nq3CmbEG8FwK5QqoqwDgsjsf1GDuisDX4cdb/aQ==" }, "vue-style-loader": { "version": "4.1.2", @@ -14233,14 +14956,14 @@ "dev": true }, "vuetify": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-2.0.11.tgz", - "integrity": "sha512-H5g0Wf/KHS1t29X+kh5hkj25dZNITCDtOb3UGl1YXx5Ua3xXUfXBRjKP50BJ7uZtQ3Jk9CiwoA6k3Lstv6zFow==" + "version": "2.1.14", + "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-2.1.14.tgz", + "integrity": "sha512-DZ1Jq2+PPEXYeh08FGJktB6St0ClZlcwzveCvJmkW16pYkUnimFlW6E3AQxSqxRpcGfZDsE53XkvZ2BGhy+m8Q==" }, "vuex": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/vuex/-/vuex-3.1.1.tgz", - "integrity": "sha512-ER5moSbLZuNSMBFnEBVGhQ1uCBNJslH9W/Dw2W7GZN23UQA69uapP5GTT9Vm8Trc0PzBSVt6LzF3hGjmv41xcg==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/vuex/-/vuex-3.1.2.tgz", + "integrity": "sha512-ha3jNLJqNhhrAemDXcmMJMKf1Zu4sybMPr9KxJIuOpVcsDQlTBYLLladav2U+g1AvdYDG5Gs0xBTb0M5pXXYFQ==" }, "vuex-class": { "version": "0.3.2", @@ -14317,9 +15040,9 @@ "dev": true }, "webpack": { - "version": "4.39.3", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.39.3.tgz", - "integrity": "sha512-BXSI9M211JyCVc3JxHWDpze85CvjC842EvpRsVTc/d15YJGlox7GIDd38kJgWrb3ZluyvIjgenbLDMBQPDcxYQ==", + "version": "4.41.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.2.tgz", + "integrity": "sha512-Zhw69edTGfbz9/8JJoyRQ/pq8FYUoY0diOXqW0T6yhgdhCv6wr0hra5DwwWexNRns2Z2+gsnrNcbe9hbGBgk/A==", "dev": true, "requires": { "@webassemblyjs/ast": "1.8.5", @@ -14348,9 +15071,9 @@ } }, "webpack-bundle-analyzer": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.4.1.tgz", - "integrity": "sha512-Bs8D/1zF+17lhqj2OYmzi7HEVYqEVxu7lCO9Ff8BwajenOU0vAwEoV8e4ICCPNZAcqR1PCR/7o2SkW+cnCmF0A==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.6.0.tgz", + "integrity": "sha512-orUfvVYEfBMDXgEKAKVvab5iQ2wXneIEorGNsyuOyVYpjYrI7CUOhhXNDd3huMwQ3vNNWWlGP+hzflMFYNzi2g==", "dev": true, "requires": { "acorn": "^6.0.7", @@ -14396,53 +15119,54 @@ } }, "webpack-dev-middleware": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.0.tgz", - "integrity": "sha512-qvDesR1QZRIAZHOE3iQ4CXLZZSQ1lAUsSpnQmlB1PBfoN/xdRjmge3Dok0W4IdaVLJOGJy3sGI4sZHwjRU0PCA==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", + "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", "dev": true, "requires": { "memory-fs": "^0.4.1", - "mime": "^2.4.2", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", "range-parser": "^1.2.1", "webpack-log": "^2.0.0" } }, "webpack-dev-server": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.8.0.tgz", - "integrity": "sha512-Hs8K9yI6pyMvGkaPTeTonhD6JXVsigXDApYk9JLW4M7viVBspQvb1WdAcWxqtmttxNW4zf2UFLsLNe0y87pIGQ==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.9.0.tgz", + "integrity": "sha512-E6uQ4kRrTX9URN9s/lIbqTAztwEPdvzVrcmHE8EQ9YnuT9J8Es5Wrd8n9BKg1a0oZ5EgEke/EQFgUsp18dSTBw==", "dev": true, "requires": { "ansi-html": "0.0.7", "bonjour": "^3.5.0", - "chokidar": "^2.1.6", + "chokidar": "^2.1.8", "compression": "^1.7.4", "connect-history-api-fallback": "^1.6.0", "debug": "^4.1.1", "del": "^4.1.1", "express": "^4.17.1", "html-entities": "^1.2.1", - "http-proxy-middleware": "^0.19.1", + "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.0", + "is-absolute-url": "^3.0.3", "killable": "^1.0.1", - "loglevel": "^1.6.3", + "loglevel": "^1.6.4", "opn": "^5.5.0", "p-retry": "^3.0.1", - "portfinder": "^1.0.21", + "portfinder": "^1.0.25", "schema-utils": "^1.0.0", - "selfsigned": "^1.10.4", + "selfsigned": "^1.10.7", "semver": "^6.3.0", "serve-index": "^1.9.1", "sockjs": "0.3.19", - "sockjs-client": "1.3.0", + "sockjs-client": "1.4.0", "spdy": "^4.0.1", "strip-ansi": "^3.0.1", "supports-color": "^6.1.0", "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.0", + "webpack-dev-middleware": "^3.7.2", "webpack-log": "^2.0.0", "ws": "^6.2.1", "yargs": "12.0.5" @@ -14473,27 +15197,12 @@ "resolve-cwd": "^2.0.0" } }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, "is-absolute-url": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.1.tgz", - "integrity": "sha512-c2QjUwuMxLsld90sj3xYzpFYWJtuxkIn1f5ua9RTEYJt/vV2IsM+Py00/6qjV7qExgifUvt7qfyBGBBKm+2iBg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", "dev": true }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -14504,34 +15213,6 @@ "path-exists": "^3.0.0" } }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.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 - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, "p-limit": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", @@ -14724,6 +15405,12 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, "wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", @@ -14828,9 +15515,9 @@ "dev": true }, "xmlbuilder": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz", - "integrity": "sha1-aSSGc0ELS6QuGmE2VR0pIjNap3M=", + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-13.0.2.tgz", + "integrity": "sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ==", "dev": true }, "xtend": { @@ -14846,22 +15533,22 @@ "dev": true }, "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, "yargs": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", - "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.1.tgz", + "integrity": "sha512-PRU7gJrJaXv3q3yQZ/+/X6KBswZiaQ+zOmdprZcouPYtQgvNU35i+68M4b1ZHLZtYFT5QObFLV+ZkmJYcwKdiw==", "dev": true, "requires": { "cliui": "^4.0.0", "decamelize": "^1.1.1", "find-up": "^2.1.0", "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", + "os-locale": "^3.1.0", "require-directory": "^2.1.1", "require-main-filename": "^1.0.1", "set-blocking": "^2.0.0", diff --git a/ui/package.json b/ui/package.json index 5db193943..c9d6bde09 100644 --- a/ui/package.json +++ b/ui/package.json @@ -1,5 +1,5 @@ { - "name": "ods-webclient", + "name": "webclient", "version": "0.1.0", "scripts": { "serve": "vue-cli-service serve", @@ -8,43 +8,43 @@ "test:unit": "vue-cli-service test:unit" }, "dependencies": { - "@types/node": "^12.7.2", + "@types/node": "^12.12.17", "axios": "^0.19.0", "clipboard-copy": "^3.1.0", "keycloak-js": "6.0.1", "vue": "^2.6.10", "vue-class-component": "^7.1.0", "vue-monaco": "^1.1.0", - "vue-property-decorator": "^8.2.2", - "vue-router": "^3.1.2", - "vuetify": "^2.0.11", - "vuex": "^3.1.1", + "vue-property-decorator": "^8.3.0", + "vue-router": "^3.1.3", + "vuetify": "^2.1.14", + "vuex": "^3.1.2", "vuex-class": "^0.3.2" }, "devDependencies": { - "@mdi/font": "^4.2.95", - "@types/jest": "^24.0.18", - "@typescript-eslint/eslint-plugin": "^2.0.0", - "@typescript-eslint/parser": "^2.0.0", - "@vue/cli-plugin-babel": "^3.11.0", - "@vue/cli-plugin-typescript": "^3.11.0", - "@vue/cli-plugin-unit-jest": "^3.11.0", - "@vue/cli-service": "^3.11.0", + "@mdi/font": "^4.7.95", + "@types/jest": "^24.0.23", + "@typescript-eslint/eslint-plugin": "^2.11.0", + "@typescript-eslint/parser": "^2.11.0", + "@vue/cli-plugin-babel": "^3.12.1", + "@vue/cli-plugin-typescript": "^3.12.1", + "@vue/cli-plugin-unit-jest": "^3.12.1", + "@vue/cli-service": "^3.12.1", "@vue/eslint-config-typescript": "^4.0.0", "@vue/test-utils": "1.0.0-beta.29", "babel-core": "7.0.0-bridge.0", - "eslint": "^6.2.2", + "eslint": "^6.7.2", "eslint-config-standard": "^14.1.0", - "eslint-plugin-import": "^2.18.2", - "eslint-plugin-node": "^9.1.0", + "eslint-plugin-import": "^2.19.1", + "eslint-plugin-node": "^9.2.0", "eslint-plugin-promise": "^4.2.1", "eslint-plugin-standard": "^4.0.1", "eslint-plugin-vue": "^5.2.3", - "jest-html-reporter": "^2.5.0", + "jest-html-reporter": "^2.8.0", "monaco-editor-webpack-plugin": "^1.7.0", - "sass": "^1.22.10", - "ts-jest": "^24.0.2", - "typescript": "^3.6.2", + "sass": "^1.23.7", + "ts-jest": "^24.2.0", + "typescript": "^3.7.3", "vue-template-compiler": "^2.6.10", "vuex-module-decorators": "^0.10.1" }, From 1de4160d65da38ac670d708590b7f1194a7038aa Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Fri, 13 Dec 2019 13:55:34 +0100 Subject: [PATCH 0260/1168] UI: libraries major upgrade --- ui/package-lock.json | 4884 +++++++++++++++++++----------------------- ui/package.json | 20 +- 2 files changed, 2181 insertions(+), 2723 deletions(-) diff --git a/ui/package-lock.json b/ui/package-lock.json index 480d4318f..58a27c535 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -363,6 +363,16 @@ "@babel/plugin-syntax-decorators": "^7.7.4" } }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.7.4.tgz", + "integrity": "sha512-StH+nGAdO6qDB1l8sZ5UBV8AC3F2VW2I8Vfld73TMKyptMU9DY5YsJAS8U81+vEtxcH3Y/La0wG0btDrhpnhjQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.7.4" + } + }, "@babel/plugin-proposal-json-strings": { "version": "7.7.4", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.7.4.tgz", @@ -466,6 +476,15 @@ "@babel/helper-plugin-utils": "^7.0.0" } }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.7.4.tgz", + "integrity": "sha512-wdsOw0MvkL1UIgiQ/IFr3ETcfv1xb8RMM0H9wbiDyLaJFyiDg5oZvDLCXosIXmFeIlweML5iOBXAkqddkYNizg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, "@babel/plugin-transform-arrow-functions": { "version": "7.7.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.7.4.tgz", @@ -604,6 +623,15 @@ "@babel/helper-plugin-utils": "^7.0.0" } }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.7.4.tgz", + "integrity": "sha512-9VMwMO7i69LHTesL0RdGy93JU6a+qOPuvB4F4d0kR0zyVjJRVJRaoaGjhtki6SzQUu8yen/vxPKN6CWnCUw6bA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, "@babel/plugin-transform-modules-amd": { "version": "7.7.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.7.5.tgz", @@ -687,6 +715,15 @@ "@babel/helper-plugin-utils": "^7.0.0" } }, + "@babel/plugin-transform-property-literals": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.7.4.tgz", + "integrity": "sha512-MatJhlC4iHsIskWYyawl53KuHrt+kALSADLQQ/HkhTjX954fkxIEh4q5slL4oRAnsm/eDoZ4q0CIZpcqBuxhJQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, "@babel/plugin-transform-regenerator": { "version": "7.7.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.5.tgz", @@ -696,6 +733,15 @@ "regenerator-transform": "^0.14.0" } }, + "@babel/plugin-transform-reserved-words": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.7.4.tgz", + "integrity": "sha512-OrPiUB5s5XvkCO1lS7D8ZtHcswIC57j62acAnJZKqGGnHP+TIc/ljQSrgdX/QyOTdEK5COAhuc820Hi1q2UgLQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, "@babel/plugin-transform-runtime": { "version": "7.7.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.7.6.tgz", @@ -774,54 +820,62 @@ } }, "@babel/preset-env": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.3.4.tgz", - "integrity": "sha512-2mwqfYMK8weA0g0uBKOt4FE3iEodiHy9/CW0b+nWXcbL+pGzLx8ESYc+j9IIxr6LTDHWKgPm71i9smo02bw+gA==", + "version": "7.7.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.7.6.tgz", + "integrity": "sha512-k5hO17iF/Q7tR9Jv8PdNBZWYW6RofxhnxKjBMc0nG4JTaWvOTiPoO/RLFwAKcA4FpmuBFm6jkoqaRJLGi0zdaQ==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-module-imports": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-async-generator-functions": "^7.2.0", - "@babel/plugin-proposal-json-strings": "^7.2.0", - "@babel/plugin-proposal-object-rest-spread": "^7.3.4", - "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.2.0", - "@babel/plugin-syntax-async-generators": "^7.2.0", - "@babel/plugin-syntax-json-strings": "^7.2.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", - "@babel/plugin-transform-arrow-functions": "^7.2.0", - "@babel/plugin-transform-async-to-generator": "^7.3.4", - "@babel/plugin-transform-block-scoped-functions": "^7.2.0", - "@babel/plugin-transform-block-scoping": "^7.3.4", - "@babel/plugin-transform-classes": "^7.3.4", - "@babel/plugin-transform-computed-properties": "^7.2.0", - "@babel/plugin-transform-destructuring": "^7.2.0", - "@babel/plugin-transform-dotall-regex": "^7.2.0", - "@babel/plugin-transform-duplicate-keys": "^7.2.0", - "@babel/plugin-transform-exponentiation-operator": "^7.2.0", - "@babel/plugin-transform-for-of": "^7.2.0", - "@babel/plugin-transform-function-name": "^7.2.0", - "@babel/plugin-transform-literals": "^7.2.0", - "@babel/plugin-transform-modules-amd": "^7.2.0", - "@babel/plugin-transform-modules-commonjs": "^7.2.0", - "@babel/plugin-transform-modules-systemjs": "^7.3.4", - "@babel/plugin-transform-modules-umd": "^7.2.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.3.0", - "@babel/plugin-transform-new-target": "^7.0.0", - "@babel/plugin-transform-object-super": "^7.2.0", - "@babel/plugin-transform-parameters": "^7.2.0", - "@babel/plugin-transform-regenerator": "^7.3.4", - "@babel/plugin-transform-shorthand-properties": "^7.2.0", - "@babel/plugin-transform-spread": "^7.2.0", - "@babel/plugin-transform-sticky-regex": "^7.2.0", - "@babel/plugin-transform-template-literals": "^7.2.0", - "@babel/plugin-transform-typeof-symbol": "^7.2.0", - "@babel/plugin-transform-unicode-regex": "^7.2.0", - "browserslist": "^4.3.4", + "@babel/plugin-proposal-async-generator-functions": "^7.7.4", + "@babel/plugin-proposal-dynamic-import": "^7.7.4", + "@babel/plugin-proposal-json-strings": "^7.7.4", + "@babel/plugin-proposal-object-rest-spread": "^7.7.4", + "@babel/plugin-proposal-optional-catch-binding": "^7.7.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.7.4", + "@babel/plugin-syntax-async-generators": "^7.7.4", + "@babel/plugin-syntax-dynamic-import": "^7.7.4", + "@babel/plugin-syntax-json-strings": "^7.7.4", + "@babel/plugin-syntax-object-rest-spread": "^7.7.4", + "@babel/plugin-syntax-optional-catch-binding": "^7.7.4", + "@babel/plugin-syntax-top-level-await": "^7.7.4", + "@babel/plugin-transform-arrow-functions": "^7.7.4", + "@babel/plugin-transform-async-to-generator": "^7.7.4", + "@babel/plugin-transform-block-scoped-functions": "^7.7.4", + "@babel/plugin-transform-block-scoping": "^7.7.4", + "@babel/plugin-transform-classes": "^7.7.4", + "@babel/plugin-transform-computed-properties": "^7.7.4", + "@babel/plugin-transform-destructuring": "^7.7.4", + "@babel/plugin-transform-dotall-regex": "^7.7.4", + "@babel/plugin-transform-duplicate-keys": "^7.7.4", + "@babel/plugin-transform-exponentiation-operator": "^7.7.4", + "@babel/plugin-transform-for-of": "^7.7.4", + "@babel/plugin-transform-function-name": "^7.7.4", + "@babel/plugin-transform-literals": "^7.7.4", + "@babel/plugin-transform-member-expression-literals": "^7.7.4", + "@babel/plugin-transform-modules-amd": "^7.7.5", + "@babel/plugin-transform-modules-commonjs": "^7.7.5", + "@babel/plugin-transform-modules-systemjs": "^7.7.4", + "@babel/plugin-transform-modules-umd": "^7.7.4", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.7.4", + "@babel/plugin-transform-new-target": "^7.7.4", + "@babel/plugin-transform-object-super": "^7.7.4", + "@babel/plugin-transform-parameters": "^7.7.4", + "@babel/plugin-transform-property-literals": "^7.7.4", + "@babel/plugin-transform-regenerator": "^7.7.5", + "@babel/plugin-transform-reserved-words": "^7.7.4", + "@babel/plugin-transform-shorthand-properties": "^7.7.4", + "@babel/plugin-transform-spread": "^7.7.4", + "@babel/plugin-transform-sticky-regex": "^7.7.4", + "@babel/plugin-transform-template-literals": "^7.7.4", + "@babel/plugin-transform-typeof-symbol": "^7.7.4", + "@babel/plugin-transform-unicode-regex": "^7.7.4", + "@babel/types": "^7.7.4", + "browserslist": "^4.6.0", + "core-js-compat": "^3.4.7", "invariant": "^2.2.2", "js-levenshtein": "^1.1.3", - "semver": "^5.3.0" + "semver": "^5.5.0" } }, "@babel/runtime": { @@ -833,16 +887,6 @@ "regenerator-runtime": "^0.13.2" } }, - "@babel/runtime-corejs2": { - "version": "7.7.6", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.7.6.tgz", - "integrity": "sha512-QYp/8xdH8iMin3pH5gtT/rUuttVfIcOhWBC3wh9Eh/qs4jEe39+3DpCDLgWXhMQgiCTOH8mrLSvQ0OHOCcox9g==", - "dev": true, - "requires": { - "core-js": "^2.6.5", - "regenerator-runtime": "^0.13.2" - } - }, "@babel/template": { "version": "7.7.4", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", @@ -898,6 +942,16 @@ } } }, + "@cnakazawa/watch": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.3.tgz", + "integrity": "sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA==", + "dev": true, + "requires": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + } + }, "@hapi/address": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", @@ -948,6 +1002,187 @@ "postcss": "^7.0.0" } }, + "@jest/console": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "dev": true, + "requires": { + "@jest/source-map": "^24.9.0", + "chalk": "^2.0.1", + "slash": "^2.0.0" + } + }, + "@jest/core": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", + "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/reporters": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "graceful-fs": "^4.1.15", + "jest-changed-files": "^24.9.0", + "jest-config": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.9.0", + "jest-resolve-dependencies": "^24.9.0", + "jest-runner": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "jest-watcher": "^24.9.0", + "micromatch": "^3.1.10", + "p-each-series": "^1.0.0", + "realpath-native": "^1.1.0", + "rimraf": "^2.5.4", + "slash": "^2.0.0", + "strip-ansi": "^5.0.0" + } + }, + "@jest/environment": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", + "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", + "dev": true, + "requires": { + "@jest/fake-timers": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0" + } + }, + "@jest/fake-timers": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", + "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0" + } + }, + "@jest/reporters": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", + "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", + "dev": true, + "requires": { + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.2", + "istanbul-lib-coverage": "^2.0.2", + "istanbul-lib-instrument": "^3.0.1", + "istanbul-lib-report": "^2.0.4", + "istanbul-lib-source-maps": "^3.0.1", + "istanbul-reports": "^2.2.6", + "jest-haste-map": "^24.9.0", + "jest-resolve": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.6.0", + "node-notifier": "^5.4.2", + "slash": "^2.0.0", + "source-map": "^0.6.0", + "string-length": "^2.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 + } + } + }, + "@jest/source-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "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 + } + } + }, + "@jest/test-result": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", + "dev": true, + "requires": { + "@jest/console": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/istanbul-lib-coverage": "^2.0.0" + } + }, + "@jest/test-sequencer": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", + "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", + "dev": true, + "requires": { + "@jest/test-result": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-runner": "^24.9.0", + "jest-runtime": "^24.9.0" + } + }, + "@jest/transform": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", + "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^24.9.0", + "babel-plugin-istanbul": "^5.1.0", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.1.15", + "jest-haste-map": "^24.9.0", + "jest-regex-util": "^24.9.0", + "jest-util": "^24.9.0", + "micromatch": "^3.1.10", + "pirates": "^4.0.1", + "realpath-native": "^1.1.0", + "slash": "^2.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "2.4.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 + } + } + }, "@jest/types": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", @@ -1017,6 +1252,33 @@ "supports-color": "^2.0.0" } }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -1040,6 +1302,47 @@ "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==", "dev": true }, + "@types/babel__core": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.3.tgz", + "integrity": "sha512-8fBo0UR2CcwWxeX7WIIgJ7lXjasFxoYgRnFHUj+hRvKkpiBJbxhdAPTCY6/ZKM0uxANFVzt4yObSLuTiTnazDA==", + "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.1", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", + "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", + "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.8.tgz", + "integrity": "sha512-yGeB2dHEdvxjP0y4UbRtQaSkXJ9649fYCmIdRoul5kfAoGCwxuCbMhag0k3RPfnuh9kPGm8x89btcfDEXdVWGw==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, "@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", @@ -1138,6 +1441,12 @@ "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", "dev": true }, + "@types/stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", + "dev": true + }, "@types/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", @@ -1364,24 +1673,24 @@ } }, "@vue/babel-preset-app": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-3.12.1.tgz", - "integrity": "sha512-Zjy5jQaikV1Pz+ri0YgXFS7q4/5wCxB5tRkDOEIt5+4105u0Feb/pvH20nVL6nx9GyXrECFfcm7Yxr/z++OaPQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-4.1.1.tgz", + "integrity": "sha512-nmt+7q0/e1CmoSWmrP3tgAXDbKdLfWh7O7VeMYk0i1bMHBYqjACmk13AxRwlby+fet/9JOicl0ubZq/bEs81Hg==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/plugin-proposal-class-properties": "^7.0.0", - "@babel/plugin-proposal-decorators": "^7.1.0", - "@babel/plugin-syntax-dynamic-import": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.0.0", - "@babel/plugin-transform-runtime": "^7.4.0", - "@babel/preset-env": "^7.0.0 < 7.4.0", - "@babel/runtime": "^7.0.0", - "@babel/runtime-corejs2": "^7.2.0", - "@vue/babel-preset-jsx": "^1.0.0", + "@babel/core": "^7.7.4", + "@babel/helper-module-imports": "^7.7.4", + "@babel/plugin-proposal-class-properties": "^7.7.4", + "@babel/plugin-proposal-decorators": "^7.7.4", + "@babel/plugin-syntax-dynamic-import": "^7.7.4", + "@babel/plugin-syntax-jsx": "^7.7.4", + "@babel/plugin-transform-runtime": "^7.7.4", + "@babel/preset-env": "^7.7.4", + "@babel/runtime": "^7.7.4", + "@vue/babel-preset-jsx": "^1.1.2", "babel-plugin-dynamic-import-node": "^2.2.0", - "babel-plugin-module-resolver": "3.2.0", - "core-js": "^2.6.5" + "core-js": "^3.4.3", + "core-js-compat": "^3.4.3" } }, "@vue/babel-preset-jsx": { @@ -1442,90 +1751,117 @@ } }, "@vue/cli-overlay": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/@vue/cli-overlay/-/cli-overlay-3.12.1.tgz", - "integrity": "sha512-Bym92EN+lj+cNRN2ozbYyH+V8DMXWGbCDUk+hiJ4EYDBZfBkZKvalk1/mOBFwyxiopnnbOEBAAhL/UuMQ1xARg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vue/cli-overlay/-/cli-overlay-4.1.1.tgz", + "integrity": "sha512-y5fBtw/aXUem3B/xVb37xB71gq2hNAZsbhW0t4DIGuNConS+Tps41MKWb7dbxq4TLyH7MWX3aJbDzuUGanBMqQ==", "dev": true }, "@vue/cli-plugin-babel": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/@vue/cli-plugin-babel/-/cli-plugin-babel-3.12.1.tgz", - "integrity": "sha512-Zetvz8PikLCGomeKOKu8pC9YQ7cfxs7pGpvEOzaxGdhMnebhjAYR6i6dOB57A6N5lhxQksXCtYTv26QgfiIpdg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-babel/-/cli-plugin-babel-4.1.1.tgz", + "integrity": "sha512-1TyuKEFFlEQwXvVohhUTJEa85o29Z4F62p1nzR+EIMOudo9tHaO1WWPqShZ2Trehrl7cpIjul9dhRUuyhwKiaQ==", "dev": true, "requires": { - "@babel/core": "^7.0.0", - "@vue/babel-preset-app": "^3.12.1", - "@vue/cli-shared-utils": "^3.12.1", - "babel-loader": "^8.0.5", + "@babel/core": "^7.7.4", + "@vue/babel-preset-app": "^4.1.1", + "@vue/cli-shared-utils": "^4.1.1", + "babel-loader": "^8.0.6", + "cache-loader": "^4.1.0", + "thread-loader": "^2.1.3", "webpack": "^4.0.0" } }, + "@vue/cli-plugin-router": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-router/-/cli-plugin-router-4.1.1.tgz", + "integrity": "sha512-n2L2LPLnNcCeeVwJUrbRexi/coBnexIZorRTihinIkUzv3J+Qiw0KPsGjg1RF6UrieFlRhqcY3a5GloC+L0SBQ==", + "dev": true, + "requires": { + "@vue/cli-shared-utils": "^4.1.1" + } + }, "@vue/cli-plugin-typescript": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/@vue/cli-plugin-typescript/-/cli-plugin-typescript-3.12.1.tgz", - "integrity": "sha512-sh+WKbpsDw6wOrpM4FSD1xKXpyp8mVcl+yyEk+WvJuuSdfwueRubAM7uYbrOGtNSOegpZqBwbNxEO4FIUBeLKQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-typescript/-/cli-plugin-typescript-4.1.1.tgz", + "integrity": "sha512-HsRughkv/BJ3Q6VytnmOUkJGHGTNJduLRVnBdMC7CkHFn1S72Vxn2fOecWxPkJpFqhujf6butisd/ErT354zuw==", "dev": true, "requires": { "@types/webpack-env": "^1.13.9", - "@vue/cli-shared-utils": "^3.12.1", - "fork-ts-checker-webpack-plugin": "^0.5.2", + "@vue/cli-shared-utils": "^4.1.1", + "cache-loader": "^4.1.0", + "fork-ts-checker-webpack-plugin": "^1.5.1", "globby": "^9.2.0", - "ts-loader": "^5.3.3", - "tslint": "^5.15.0", + "thread-loader": "^2.1.3", + "ts-loader": "^6.2.1", + "tslint": "^5.20.1", "webpack": "^4.0.0", "yorkie": "^2.0.0" } }, "@vue/cli-plugin-unit-jest": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/@vue/cli-plugin-unit-jest/-/cli-plugin-unit-jest-3.12.1.tgz", - "integrity": "sha512-Cc9Kq4+RaUN1yfNVb7c9hVDNXo2tFTWHgwooCL3XWMu2iL+pDawQt8ZeSqauDY95JoMeEAVy2xBimjL+7jo/jw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-unit-jest/-/cli-plugin-unit-jest-4.1.1.tgz", + "integrity": "sha512-JLTLdQ2IRUe3iIpHHpp9LHm4/8HiD0QQ9AG136J8exXbZ6TCaLdE5X2W6fZ19wV/eCaQfje3eRAOySN24MReqw==", "dev": true, "requires": { - "@vue/cli-shared-utils": "^3.12.1", - "babel-jest": "^23.6.0", + "@babel/core": "^7.7.4", + "@babel/plugin-transform-modules-commonjs": "^7.6.0", + "@types/jest": "^24.0.19", + "@vue/cli-shared-utils": "^4.1.1", + "babel-core": "^7.0.0-bridge.0", + "babel-jest": "^24.9.0", "babel-plugin-transform-es2015-modules-commonjs": "^6.26.2", - "jest": "^23.6.0", + "deepmerge": "^4.0.0", + "jest": "^24.9.0", + "jest-environment-jsdom-fifteen": "^1.0.0", "jest-serializer-vue": "^2.0.2", "jest-transform-stub": "^2.0.0", - "jest-watch-typeahead": "0.2.1", - "vue-jest": "^3.0.4" + "jest-watch-typeahead": "^0.4.2", + "ts-jest": "^24.2.0", + "vue-jest": "^3.0.5" } }, + "@vue/cli-plugin-vuex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-vuex/-/cli-plugin-vuex-4.1.1.tgz", + "integrity": "sha512-AkK+FCrghjcyxUgfJyxpSuyJ0w9FSlwQEZv7+aRhs9j+YguROdjKA8DDTp8Ve1yboALeNMRv8eXApQEVC3xFQA==", + "dev": true + }, "@vue/cli-service": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/@vue/cli-service/-/cli-service-3.12.1.tgz", - "integrity": "sha512-PDxNrTGnSKzeV1ruFlsRIAO8JcPizwT0EJXq9GeyooU+p+sOkv7aKkCBJQVYNjZapD1NOGWx6CvAAC/wAW+gew==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vue/cli-service/-/cli-service-4.1.1.tgz", + "integrity": "sha512-woEIXXc22DXKrSO+FAFnrzhnysJcAB1UTF2t0NIPrxnngm0O2YSO0idmy01a2H/q3auMCVNQdzggQ4JWUeV7Gg==", "dev": true, "requires": { "@intervolga/optimize-cssnano-plugin": "^1.0.5", "@soda/friendly-errors-webpack-plugin": "^1.7.1", - "@vue/cli-overlay": "^3.12.1", - "@vue/cli-shared-utils": "^3.12.1", - "@vue/component-compiler-utils": "^3.0.0", + "@vue/cli-overlay": "^4.1.1", + "@vue/cli-plugin-router": "^4.1.1", + "@vue/cli-plugin-vuex": "^4.1.1", + "@vue/cli-shared-utils": "^4.1.1", + "@vue/component-compiler-utils": "^3.0.2", "@vue/preload-webpack-plugin": "^1.1.0", "@vue/web-component-wrapper": "^1.2.0", "acorn": "^6.1.1", "acorn-walk": "^6.1.1", - "address": "^1.0.3", - "autoprefixer": "^9.5.1", - "browserslist": "^4.5.4", - "cache-loader": "^2.0.1", + "address": "^1.1.2", + "autoprefixer": "^9.7.2", + "browserslist": "^4.7.3", + "cache-loader": "^4.1.0", "case-sensitive-paths-webpack-plugin": "^2.2.0", "chalk": "^2.4.2", - "cli-highlight": "^2.1.0", + "cli-highlight": "^2.1.4", "clipboardy": "^2.0.0", "cliui": "^5.0.0", - "copy-webpack-plugin": "^4.6.0", - "css-loader": "^1.0.1", + "copy-webpack-plugin": "^5.0.5", + "css-loader": "^3.1.0", "cssnano": "^4.1.10", "current-script-polyfill": "^1.0.0", "debug": "^4.1.1", - "default-gateway": "^5.0.2", - "dotenv": "^7.0.0", + "default-gateway": "^5.0.5", + "dotenv": "^8.2.0", "dotenv-expand": "^5.1.0", - "escape-string-regexp": "^1.0.5", - "file-loader": "^3.0.1", + "file-loader": "^4.2.0", "fs-extra": "^7.0.1", "globby": "^9.2.0", "hash-sum": "^1.0.2", @@ -1537,100 +1873,212 @@ "mini-css-extract-plugin": "^0.8.0", "minimist": "^1.2.0", "ora": "^3.4.0", - "portfinder": "^1.0.20", + "portfinder": "^1.0.25", "postcss-loader": "^3.0.0", - "read-pkg": "^5.0.0", - "semver": "^6.0.0", - "slash": "^2.0.0", + "read-pkg": "^5.1.1", + "semver": "^6.1.0", + "slash": "^3.0.0", "source-map-url": "^0.4.0", "ssri": "^6.0.1", "string.prototype.padend": "^3.0.0", - "terser-webpack-plugin": "^1.2.3", - "thread-loader": "^2.1.2", - "url-loader": "^1.1.2", - "vue-loader": "^15.7.0", + "terser-webpack-plugin": "^2.2.1", + "thread-loader": "^2.1.3", + "url-loader": "^2.2.0", + "vue-loader": "^15.7.2", + "vue-style-loader": "^4.1.0", "webpack": "^4.0.0", - "webpack-bundle-analyzer": "^3.3.0", - "webpack-chain": "^4.11.0", - "webpack-dev-server": "^3.4.1", - "webpack-merge": "^4.2.1" + "webpack-bundle-analyzer": "^3.6.0", + "webpack-chain": "^6.0.0", + "webpack-dev-server": "^3.9.0", + "webpack-merge": "^4.2.2" }, "dependencies": { - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "cacache": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz", + "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==", + "dev": true, + "requires": { + "chownr": "^1.1.2", + "figgy-pudding": "^3.5.1", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.2", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "minipass": "^3.0.0", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "p-map": "^3.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^2.7.1", + "ssri": "^7.0.0", + "unique-filename": "^1.1.1" + }, + "dependencies": { + "ssri": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz", + "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "minipass": "^3.1.1" + } + } + } + }, + "find-cache-dir": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.2.0.tgz", + "integrity": "sha512-1JKclkYYsf1q9WIJKLZa9S9muC+08RIjzAlLrK4QcYLJMS6mk9yombQ9qf+zJ7H9LS800k0s44L4sDq9VYzqyg==", "dev": true, "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "commondir": "^1.0.1", + "make-dir": "^3.0.0", + "pkg-dir": "^4.1.0" } }, - "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 + "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" + } }, - "parse-json": { + "locate-path": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", - "lines-and-columns": "^1.1.6" + "p-locate": "^4.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==", + "make-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", + "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", "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" + "semver": "^6.0.0" } }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "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": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, - "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==", + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" } }, - "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==", + "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 + }, + "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": { + "find-up": "^4.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" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "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 + }, + "terser-webpack-plugin": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.0.tgz", + "integrity": "sha512-yez0HdpDf/iQVYGf+e/o8ZYWLb1g9d1nRRi5FIOZ4KfXbfSPT259UoqxPiSLhCnr0mlDoh+bucpYQSFbU0cEsQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "cacache": "^13.0.1", + "find-cache-dir": "^3.1.0", + "jest-worker": "^24.9.0", + "schema-utils": "^2.6.1", + "serialize-javascript": "^2.1.2", + "source-map": "^0.6.1", + "terser": "^4.4.2", + "webpack-sources": "^1.4.3" } + }, + "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 } } }, "@vue/cli-shared-utils": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-3.12.1.tgz", - "integrity": "sha512-jFblzRFjutGwu5utOKdVlPlsbA1lBUNNQlAThzNqej+JtTKJjnvjlhjKX0Gq0oOny5FjKWhoyfQ74p9h1qE6JQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-4.1.1.tgz", + "integrity": "sha512-nsxNW8Sy9y2yx/r9DqgZoYg/DoygvASIQl0XXG+imQUDWEXKmD6UZA6y5ANfStCljzZ/wd7WgWP+txmjy6exOw==", "dev": true, "requires": { "@hapi/joi": "^15.0.1", @@ -1642,16 +2090,32 @@ "open": "^6.3.0", "ora": "^3.4.0", "request": "^2.87.0", - "request-promise-native": "^1.0.7", - "semver": "^6.0.0", - "string.prototype.padstart": "^3.0.0" + "request-promise-native": "^1.0.8", + "semver": "^6.1.0", + "string.prototype.padstart": "^3.0.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 + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "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" + } } } }, @@ -1697,62 +2161,10 @@ } }, "@vue/eslint-config-typescript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-4.0.0.tgz", - "integrity": "sha512-uSMAMgw4xDgVdZQhpbtJRo8nMV4oOy3Ht8olfOo7xvYFYLMF2JZ1tDRKd9/NSusxA72O2Vma+HzmyzDHg9evcQ==", - "dev": true, - "requires": { - "@typescript-eslint/eslint-plugin": "^1.1.0", - "@typescript-eslint/parser": "^1.1.0" - }, - "dependencies": { - "@typescript-eslint/eslint-plugin": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.13.0.tgz", - "integrity": "sha512-WQHCozMnuNADiqMtsNzp96FNox5sOVpU8Xt4meaT4em8lOG1SrOv92/mUbEHQVh90sldKSfcOc/I0FOb/14G1g==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "1.13.0", - "eslint-utils": "^1.3.1", - "functional-red-black-tree": "^1.0.1", - "regexpp": "^2.0.1", - "tsutils": "^3.7.0" - } - }, - "@typescript-eslint/experimental-utils": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-1.13.0.tgz", - "integrity": "sha512-zmpS6SyqG4ZF64ffaJ6uah6tWWWgZ8m+c54XXgwFtUv0jNz8aJAVx8chMCvnk7yl6xwn8d+d96+tWp7fXzTuDg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "1.13.0", - "eslint-scope": "^4.0.0" - } - }, - "@typescript-eslint/parser": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-1.13.0.tgz", - "integrity": "sha512-ITMBs52PCPgLb2nGPoeT4iU3HdQZHcPaZVw+7CsFagRJHUhyeTgorEwHXhFf3e7Evzi8oujKNpHc8TONth8AdQ==", - "dev": true, - "requires": { - "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "1.13.0", - "@typescript-eslint/typescript-estree": "1.13.0", - "eslint-visitor-keys": "^1.0.0" - } - }, - "@typescript-eslint/typescript-estree": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-1.13.0.tgz", - "integrity": "sha512-b5rCmd2e6DCC6tCTN9GSUAuxdYwCM/k/2wdjHGrIRGPSJotWMCe/dGpi66u42bhuh8q3QBzqM4TMA1GUUCJvdw==", - "dev": true, - "requires": { - "lodash.unescape": "4.0.1", - "semver": "5.5.0" - } - } - } + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-5.0.1.tgz", + "integrity": "sha512-gpP8zQA0rJ93ROkAW5fbOJB3EG7p6U70Jb0/CVOjhs5zuEXf1WgLk4gP+zUZGwiRpLoXBa5oIRH4hLQDbS1/eg==", + "dev": true }, "@vue/preload-webpack-plugin": { "version": "1.1.1", @@ -1761,13 +2173,22 @@ "dev": true }, "@vue/test-utils": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-1.0.0-beta.29.tgz", - "integrity": "sha512-yX4sxEIHh4M9yAbLA/ikpEnGKMNBCnoX98xE1RwxfhQVcn0MaXNSj1Qmac+ZydTj6VBSEVukchBogXBTwc+9iA==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-1.0.0-beta.30.tgz", + "integrity": "sha512-Wyvcha9fNk8+kzTDwb3xWGjPkCPzHSYSwKP6MplrPTG/auhqoad7JqUEceZLc6u7AU4km2pPQ8/m9s0RgCZ0NA==", "dev": true, "requires": { "dom-event-types": "^1.0.0", - "lodash": "^4.17.4" + "lodash": "^4.17.15", + "pretty": "^2.0.0" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } } }, "@vue/web-component-wrapper": { @@ -2003,9 +2424,9 @@ } }, "acorn-jsx": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", - "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", + "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", "dev": true }, "acorn-walk": { @@ -2020,6 +2441,16 @@ "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", "dev": true }, + "aggregate-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", + "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, "ajv": { "version": "6.10.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", @@ -2110,15 +2541,6 @@ } } }, - "append-transform": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", - "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", - "dev": true, - "requires": { - "default-require-extensions": "^1.0.0" - } - }, "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", @@ -2253,12 +2675,6 @@ } } }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -2502,48 +2918,19 @@ "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", "dev": true }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "dev": true, - "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" - }, - "dependencies": { - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - } - } - }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, "babel-jest": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-23.6.0.tgz", - "integrity": "sha512-lqKGG6LYXYu+DQh/slrQ8nxXQkEkhugdXsU6St7GmhVS7Ilc/22ArwqXNJrf0QaOBjZB0360qZMwXqDYQHXaew==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", + "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", "dev": true, "requires": { - "babel-plugin-istanbul": "^4.1.6", - "babel-preset-jest": "^23.2.0" + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/babel__core": "^7.1.0", + "babel-plugin-istanbul": "^5.1.0", + "babel-preset-jest": "^24.9.0", + "chalk": "^2.4.2", + "slash": "^2.0.0" } }, "babel-loader": { @@ -2577,42 +2964,71 @@ } }, "babel-plugin-istanbul": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", - "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", + "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", "dev": true, "requires": { - "babel-plugin-syntax-object-rest-spread": "^6.13.0", - "find-up": "^2.1.0", - "istanbul-lib-instrument": "^1.10.1", - "test-exclude": "^4.2.1" + "@babel/helper-plugin-utils": "^7.0.0", + "find-up": "^3.0.0", + "istanbul-lib-instrument": "^3.3.0", + "test-exclude": "^5.2.3" + }, + "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": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.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-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 + } } }, "babel-plugin-jest-hoist": { - "version": "23.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz", - "integrity": "sha1-5h+uBaHKiAGq3uV6bWa4zvr0QWc=", - "dev": true - }, - "babel-plugin-module-resolver": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-module-resolver/-/babel-plugin-module-resolver-3.2.0.tgz", - "integrity": "sha512-tjR0GvSndzPew/Iayf4uICWZqjBwnlMWjSx6brryfQ81F9rxBVqwDJtFCV8oOs0+vJeefK9TmdZtkIFdFe1UnA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", + "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", "dev": true, "requires": { - "find-babel-config": "^1.1.0", - "glob": "^7.1.2", - "pkg-up": "^2.0.0", - "reselect": "^3.0.1", - "resolve": "^1.4.0" + "@types/babel__traverse": "^7.0.6" } }, - "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-es2015-modules-commonjs": { "version": "6.26.2", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", @@ -2636,105 +3052,31 @@ } }, "babel-preset-jest": { - "version": "23.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz", - "integrity": "sha1-jsegOhOPABoaj7HoETZSvxpV2kY=", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", + "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", "dev": true, "requires": { - "babel-plugin-jest-hoist": "^23.2.0", - "babel-plugin-syntax-object-rest-spread": "^6.13.0" + "@babel/plugin-syntax-object-rest-spread": "^7.0.0", + "babel-plugin-jest-hoist": "^24.9.0" } }, - "babel-register": { + "babel-runtime": { "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" - }, - "dependencies": { - "babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" - } - }, - "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" - } - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", "dev": true }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "^0.5.6" - } - } - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - }, - "dependencies": { "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", @@ -2886,8 +3228,7 @@ "base64-js": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", - "dev": true + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" }, "batch": { "version": "0.6.1", @@ -3200,6 +3541,12 @@ "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", "dev": true }, + "buffer-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-json/-/buffer-json-2.0.0.tgz", + "integrity": "sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==", + "dev": true + }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", @@ -3265,16 +3612,103 @@ } }, "cache-loader": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-2.0.1.tgz", - "integrity": "sha512-V99T3FOynmGx26Zom+JrVBytLBsmUCzVG2/4NnUKgvXN4bEV42R1ERl1IyiH/cvFIDA1Ytq2lPZ9tXDSahcQpQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-4.1.0.tgz", + "integrity": "sha512-ftOayxve0PwKzBF/GLsZNC9fJBXl8lkZE3TOsjkboHfVHVkL39iUEs1FO07A33mizmci5Dudt38UZrrYXDtbhw==", "dev": true, "requires": { - "loader-utils": "^1.1.0", + "buffer-json": "^2.0.0", + "find-cache-dir": "^3.0.0", + "loader-utils": "^1.2.3", "mkdirp": "^0.5.1", - "neo-async": "^2.6.0", - "normalize-path": "^3.0.0", - "schema-utils": "^1.0.0" + "neo-async": "^2.6.1", + "schema-utils": "^2.0.0" + }, + "dependencies": { + "find-cache-dir": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.2.0.tgz", + "integrity": "sha512-1JKclkYYsf1q9WIJKLZa9S9muC+08RIjzAlLrK4QcYLJMS6mk9yombQ9qf+zJ7H9LS800k0s44L4sDq9VYzqyg==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.0", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "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" + } + }, + "make-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", + "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "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": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "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 + }, + "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": { + "find-up": "^4.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "call-me-maybe": { @@ -3290,6 +3724,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": { @@ -3302,9 +3744,9 @@ } }, "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": { @@ -3342,12 +3784,12 @@ "dev": true }, "capture-exit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz", - "integrity": "sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28=", + "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": "^3.3.3" + "rsvp": "^4.8.4" } }, "case-sensitive-paths-webpack-plugin": { @@ -3476,6 +3918,12 @@ } } }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", @@ -3561,12 +4009,6 @@ "path-exists": "^4.0.0" } }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -3624,12 +4066,6 @@ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", @@ -3729,31 +4165,14 @@ } }, "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" } }, "clone": { @@ -4053,53 +4472,25 @@ "dev": true }, "copy-webpack-plugin": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.6.0.tgz", - "integrity": "sha512-Y+SQCF+0NoWQryez2zXn5J5knmr9z/9qSQt7fbL78u83rxmigOy8X5+BFn8CFSuX+nKT8gpYwJX68ekqtQt6ZA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz", + "integrity": "sha512-P15M5ZC8dyCjQHWwd4Ia/dm0SgVvZJMYeykVIVYXbGyqO4dWB5oyPHp9i7wjwo5LhtlhKbiBCdS2NvM07Wlybg==", "dev": true, "requires": { - "cacache": "^10.0.4", - "find-cache-dir": "^1.0.0", + "cacache": "^12.0.3", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", "globby": "^7.1.1", - "is-glob": "^4.0.0", - "loader-utils": "^1.1.0", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", "minimatch": "^3.0.4", - "p-limit": "^1.0.0", - "serialize-javascript": "^1.4.0" + "normalize-path": "^3.0.0", + "p-limit": "^2.2.1", + "schema-utils": "^1.0.0", + "serialize-javascript": "^2.1.2", + "webpack-log": "^2.0.0" }, "dependencies": { - "cacache": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", - "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", - "dev": true, - "requires": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.1", - "mississippi": "^2.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", - "ssri": "^5.2.4", - "unique-filename": "^1.1.0", - "y18n": "^4.0.0" - } - }, - "find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^2.0.0" - } - }, "globby": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", @@ -4120,42 +4511,20 @@ "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", "dev": true }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "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": { - "pify": "^3.0.0" + "p-try": "^2.0.0" } }, - "mississippi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", - "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", - "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": "^2.0.1", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true }, "pify": { "version": "3.0.0", @@ -4163,60 +4532,49 @@ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "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" - } - }, - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "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": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" } }, - "serialize-javascript": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", - "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==", - "dev": true - }, "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", "dev": true - }, - "ssri": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", - "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.1" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true } } }, "core-js": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.5.0.tgz", + "integrity": "sha512-Ifh3kj78gzQ7NAoJXeTu+XwzDld0QRIwjBLRqAMhuLhP3d2Av5wmgE9ycfnvK6NAEjTkQ1sDPeoEZAWO3Hx1Uw==", "dev": true }, + "core-js-compat": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.5.0.tgz", + "integrity": "sha512-E7iJB72svRjJTnm9HDvujzNVMCm3ZcDYEedkJ/sDTNsy/0yooCd9Cg7GSzE7b4e0LfIkjijdB1tqg0pGwxWeWg==", + "dev": true, + "requires": { + "browserslist": "^4.8.2", + "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 + } + } + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -4353,40 +4711,35 @@ } }, "css-loader": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.1.tgz", - "integrity": "sha512-+ZHAZm/yqvJ2kDtPne3uX0C+Vr3Zn5jFn2N4HywtS5ujwvsVkyg0VArEXpl3BgczDA8anieki1FIzhchX4yrDw==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.3.2.tgz", + "integrity": "sha512-4XSiURS+YEK2fQhmSaM1onnUm0VKWNf6WWBYjkp9YbSDGCBTVZ5XOM6Gkxo8tLgQlzkZOBJvk9trHlDk4gjEYg==", "dev": true, "requires": { - "babel-code-frame": "^6.26.0", - "css-selector-tokenizer": "^0.7.0", - "icss-utils": "^2.1.0", - "loader-utils": "^1.0.2", - "lodash": "^4.17.11", - "postcss": "^6.0.23", - "postcss-modules-extract-imports": "^1.2.0", - "postcss-modules-local-by-default": "^1.2.0", - "postcss-modules-scope": "^1.1.0", - "postcss-modules-values": "^1.3.0", - "postcss-value-parser": "^3.3.0", - "source-list-map": "^2.0.0" + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.23", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.1.1", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.0.2", + "schema-utils": "^2.6.0" }, "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } + "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 }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "postcss-value-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", + "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==", "dev": true } } @@ -4409,57 +4762,6 @@ "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", "dev": true }, - "css-selector-tokenizer": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", - "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", - "dev": true, - "requires": { - "cssesc": "^0.1.0", - "fastparse": "^1.1.1", - "regexpu-core": "^1.0.0" - }, - "dependencies": { - "cssesc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", - "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", - "dev": true - }, - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - }, - "regexpu-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", - "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", - "dev": true, - "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - } - } - } - }, "css-tree": { "version": "1.0.0-alpha.37", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", @@ -4696,9 +4998,9 @@ "dev": true }, "deepmerge": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", - "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==", + "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": { @@ -4754,12 +5056,6 @@ "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", "dev": true }, - "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 - }, "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", @@ -4822,15 +5118,6 @@ } } }, - "default-require-extensions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", - "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", - "dev": true, - "requires": { - "strip-bom": "^2.0.0" - } - }, "defaults": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", @@ -4925,6 +5212,12 @@ "dev": true } } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true } } }, @@ -4956,15 +5249,6 @@ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", "dev": true }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, "detect-newline": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", @@ -5126,9 +5410,9 @@ } }, "dotenv": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-7.0.0.tgz", - "integrity": "sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", "dev": true }, "dotenv-expand": { @@ -5592,28 +5876,19 @@ } }, "eslint-plugin-es": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-1.4.1.tgz", - "integrity": "sha512-5fa/gR2yR3NxQf+UXkeLeP8FBBl6tSgdrAz1+cF84v1FMM4twGwQoqTnn+QxFLcPOrF4pdKEJKDB/q9GoyJrCA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-2.0.0.tgz", + "integrity": "sha512-f6fceVtg27BR02EYnBhgWLFQfK6bN4Ll0nQFrBHOlCsAyxeZkn0NHns5O0YZOPrV1B3ramd6cgFwaoFLcSkwEQ==", "dev": true, "requires": { "eslint-utils": "^1.4.2", - "regexpp": "^2.0.1" + "regexpp": "^3.0.0" }, "dependencies": { - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "regexpp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.0.0.tgz", + "integrity": "sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g==", "dev": true } } @@ -5720,12 +5995,12 @@ } }, "eslint-plugin-node": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-9.2.0.tgz", - "integrity": "sha512-2abNmzAH/JpxI4gEOwd6K8wZIodK3BmHbTxz4s79OIYwwIt2gkpEXlAouJXu4H1c9ySTnRso0tsuthSOZbUMlA==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-10.0.0.tgz", + "integrity": "sha512-1CSyM/QCjs6PXaT18+zuAXsjXGIGo5Rw630rSKwokSs2jrYURQc4R5JZpoanNCqwNmepg+0eZ9L7YiRUJb8jiQ==", "dev": true, "requires": { - "eslint-plugin-es": "^1.4.1", + "eslint-plugin-es": "^2.0.0", "eslint-utils": "^1.4.2", "ignore": "^5.1.1", "minimatch": "^3.0.4", @@ -5733,21 +6008,6 @@ "semver": "^6.1.0" }, "dependencies": { - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", - "dev": true - }, "ignore": { "version": "5.1.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", @@ -5775,12 +6035,12 @@ "dev": true }, "eslint-plugin-vue": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-5.2.3.tgz", - "integrity": "sha512-mGwMqbbJf0+VvpGR5Lllq0PMxvTdrZ/ZPjmhkacrCHbubJeJOt+T6E3HUzAifa2Mxi7RSdJfC9HFpOeSYVMMIw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-6.0.1.tgz", + "integrity": "sha512-5tgFPcxGDKjfVB/6Yi56bKiWxygUibfZmzSh26Np3kuwAk/lfaGbVld+Yt+MPgD84ppvcachtiL4/winsXLjXA==", "dev": true, "requires": { - "vue-eslint-parser": "^5.0.0" + "vue-eslint-parser": "^6.0.5" } }, "eslint-scope": { @@ -5794,15 +6054,18 @@ } }, "eslint-utils": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz", - "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==", - "dev": true + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } }, "eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", "dev": true }, "espree": { @@ -5916,13 +6179,10 @@ } }, "exec-sh": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz", - "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==", - "dev": true, - "requires": { - "merge": "^1.2.0" - } + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", + "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", + "dev": true }, "execa": { "version": "1.0.0", @@ -5995,111 +6255,18 @@ } } }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "^2.1.0" - }, - "dependencies": { - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "expect": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-23.6.0.tgz", - "integrity": "sha512-dgSoOHgmtn/aDGRVFWclQyPDKl2CQRq0hmIEoUAuQs/2rn2NcvCWcSCovm6BLeuB/7EZuLGu2QfnR+qRt5OM4w==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", + "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", "dev": true, "requires": { + "@jest/types": "^24.9.0", "ansi-styles": "^3.2.0", - "jest-diff": "^23.6.0", - "jest-get-type": "^22.1.0", - "jest-matcher-utils": "^23.6.0", - "jest-message-util": "^23.4.0", - "jest-regex-util": "^23.3.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "jest-diff": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-23.6.0.tgz", - "integrity": "sha512-Gz9l5Ov+X3aL5L37IT+8hoCUsof1CVYBb2QEkOupK64XyRR3h+uRpYIm97K7sY8diFxowR8pIGEdyfMKTixo3g==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "diff": "^3.2.0", - "jest-get-type": "^22.1.0", - "pretty-format": "^23.6.0" - } - }, - "jest-get-type": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", - "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", - "dev": true - }, - "pretty-format": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", - "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0", - "ansi-styles": "^3.2.0" - } - } + "jest-get-type": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-regex-util": "^24.9.0" } }, "express": { @@ -6313,12 +6480,6 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, - "fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", - "dev": true - }, "faye-websocket": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", @@ -6362,29 +6523,13 @@ } }, "file-loader": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-3.0.1.tgz", - "integrity": "sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw==", - "dev": true, - "requires": { - "loader-utils": "^1.0.2", - "schema-utils": "^1.0.0" - } - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "fileset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", - "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.3.0.tgz", + "integrity": "sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==", "dev": true, "requires": { - "glob": "^7.0.3", - "minimatch": "^3.0.3" + "loader-utils": "^1.2.3", + "schema-utils": "^2.5.0" } }, "filesize": { @@ -6550,15 +6695,6 @@ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -6566,9 +6702,9 @@ "dev": true }, "fork-ts-checker-webpack-plugin": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-0.5.2.tgz", - "integrity": "sha512-a5IG+xXyKnpruI0CP/anyRLAoxWtp3lzdG6flxicANnoSzz64b12dJ7ASAVRrI2OaWwZR2JyBaMHFQqInhWhIw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-1.6.0.tgz", + "integrity": "sha512-vqOY5gakcoon2s12V7MMe01OPwfgqulUWFzm+geQaPPOBKjW1I7aqqoBVlU0ECn97liMB0ECs16pRdIGe9qdRw==", "dev": true, "requires": { "babel-code-frame": "^6.22.0", @@ -6576,7 +6712,17 @@ "chokidar": "^2.0.4", "micromatch": "^3.1.10", "minimatch": "^3.0.4", - "tapable": "^1.0.0" + "semver": "^5.6.0", + "tapable": "^1.0.0", + "worker-rpc": "^0.1.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "form-data": { @@ -6632,6 +6778,15 @@ "universalify": "^0.1.0" } }, + "fs-minipass": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.0.0.tgz", + "integrity": "sha512-40Qz+LFXmd9tzYVnnBmZvFfvAADfUA14TXPK1s7IfElJTIZ97rA8w4Kin7Wt5JBrC3ShnnFJO/5vPjPEeJIq9A==", + "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", @@ -7220,9 +7375,9 @@ "dev": true }, "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, "get-stream": { @@ -7263,42 +7418,6 @@ "path-is-absolute": "^1.0.0" } }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, "glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", @@ -7540,16 +7659,6 @@ "minimalistic-crypto-utils": "^1.0.1" } }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" - } - }, "hoopy": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", @@ -7822,38 +7931,13 @@ "safer-buffer": ">= 2.1.2 < 3" } }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", - "dev": true - }, "icss-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", - "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", + "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": "^6.0.1" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "postcss": "^7.0.14" } }, "ieee754": { @@ -7903,24 +7987,13 @@ } }, "import-local": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", - "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "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": "^2.0.0", + "pkg-dir": "^3.0.0", "resolve-cwd": "^2.0.0" - }, - "dependencies": { - "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" - } - } } }, "imurmurhash": { @@ -7929,6 +8002,12 @@ "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", @@ -8263,21 +8342,6 @@ "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", "dev": true }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "^2.0.0" - } - }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -8290,15 +8354,6 @@ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", @@ -8306,9 +8361,9 @@ "dev": true }, "is-generator-fn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz", - "integrity": "sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=", + "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": { @@ -8385,18 +8440,6 @@ "isobject": "^3.0.1" } }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, "is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", @@ -8448,12 +8491,6 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, "is-whitespace": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/is-whitespace/-/is-whitespace-0.3.0.tgz", @@ -8496,579 +8533,352 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, - "istanbul-api": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.7.tgz", - "integrity": "sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==", - "dev": true, - "requires": { - "async": "^2.1.4", - "fileset": "^2.0.2", - "istanbul-lib-coverage": "^1.2.1", - "istanbul-lib-hook": "^1.2.2", - "istanbul-lib-instrument": "^1.10.2", - "istanbul-lib-report": "^1.1.5", - "istanbul-lib-source-maps": "^1.2.6", - "istanbul-reports": "^1.5.1", - "js-yaml": "^3.7.0", - "mkdirp": "^0.5.1", - "once": "^1.4.0" - } - }, "istanbul-lib-coverage": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", - "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", + "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 }, - "istanbul-lib-hook": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz", - "integrity": "sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==", - "dev": true, - "requires": { - "append-transform": "^0.4.0" - } - }, "istanbul-lib-instrument": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", - "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", "dev": true, "requires": { - "babel-generator": "^6.18.0", - "babel-template": "^6.16.0", - "babel-traverse": "^6.18.0", - "babel-types": "^6.18.0", - "babylon": "^6.18.0", - "istanbul-lib-coverage": "^1.2.1", - "semver": "^5.3.0" + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.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==", + "dev": true + } } }, "istanbul-lib-report": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz", - "integrity": "sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", "dev": true, "requires": { - "istanbul-lib-coverage": "^1.2.1", - "mkdirp": "^0.5.1", - "path-parse": "^1.0.5", - "supports-color": "^3.1.2" + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" }, "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "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": "^1.0.0" + "has-flag": "^3.0.0" } } } }, "istanbul-lib-source-maps": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz", - "integrity": "sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==", + "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==", "dev": true, "requires": { - "debug": "^3.1.0", - "istanbul-lib-coverage": "^1.2.1", - "mkdirp": "^0.5.1", - "rimraf": "^2.6.1", - "source-map": "^0.5.3" + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" }, "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } + "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 } } }, "istanbul-reports": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.5.1.tgz", - "integrity": "sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", + "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", "dev": true, "requires": { - "handlebars": "^4.0.3" + "handlebars": "^4.1.2" } }, "javascript-stringify": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-1.6.0.tgz", - "integrity": "sha1-FC0RHzpuPa6PSpr9d9RYVbWpzOM=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.0.1.tgz", + "integrity": "sha512-yV+gqbd5vaOYjqlbk16EG89xB5udgjqQF3C5FAORDg4f/IS1Yc5ERCv5e/57yBcfJYw05V5JyIXabhwb75Xxow==", "dev": true }, "jest": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-23.6.0.tgz", - "integrity": "sha512-lWzcd+HSiqeuxyhG+EnZds6iO3Y3ZEnMrfZq/OTGvF/C+Z4fPMCdhWTGSAiO2Oym9rbEXfwddHhh6jqrTF3+Lw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", + "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", "dev": true, "requires": { - "import-local": "^1.0.0", - "jest-cli": "^23.6.0" + "import-local": "^2.0.0", + "jest-cli": "^24.9.0" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "arr-diff": { + "ci-info": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "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": { - "is-extglob": "^1.0.0" + "ci-info": "^2.0.0" } }, "jest-cli": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-23.6.0.tgz", - "integrity": "sha512-hgeD1zRUp1E1zsiyOXjEn4LzRLWdJBV//ukAHGlx6s5mfCNJTbhbHjgxnDUXA8fsKWN/HqFFF6X5XcCwC/IvYQ==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", + "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", "dev": true, "requires": { - "ansi-escapes": "^3.0.0", + "@jest/core": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "import-local": "^1.0.0", - "is-ci": "^1.0.10", - "istanbul-api": "^1.3.1", - "istanbul-lib-coverage": "^1.2.0", - "istanbul-lib-instrument": "^1.10.1", - "istanbul-lib-source-maps": "^1.2.4", - "jest-changed-files": "^23.4.2", - "jest-config": "^23.6.0", - "jest-environment-jsdom": "^23.4.0", - "jest-get-type": "^22.1.0", - "jest-haste-map": "^23.6.0", - "jest-message-util": "^23.4.0", - "jest-regex-util": "^23.3.0", - "jest-resolve-dependencies": "^23.6.0", - "jest-runner": "^23.6.0", - "jest-runtime": "^23.6.0", - "jest-snapshot": "^23.6.0", - "jest-util": "^23.4.0", - "jest-validate": "^23.6.0", - "jest-watcher": "^23.4.0", - "jest-worker": "^23.2.0", - "micromatch": "^2.3.11", - "node-notifier": "^5.2.1", - "prompts": "^0.1.9", - "realpath-native": "^1.0.0", - "rimraf": "^2.5.4", - "slash": "^1.0.0", - "string-length": "^2.0.0", - "strip-ansi": "^4.0.0", - "which": "^1.2.12", - "yargs": "^11.0.0" - } - }, - "jest-get-type": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", - "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", - "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" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" + "import-local": "^2.0.0", + "is-ci": "^2.0.0", + "jest-config": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "prompts": "^2.0.1", + "realpath-native": "^1.1.0", + "yargs": "^13.3.0" } } } }, "jest-changed-files": { - "version": "23.4.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-23.4.2.tgz", - "integrity": "sha512-EyNhTAUWEfwnK0Is/09LxoqNDOn7mU7S3EHskG52djOFS/z+IT0jT3h3Ql61+dklcG7bJJitIWEMB4Sp1piHmA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", + "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", "dev": true, "requires": { + "@jest/types": "^24.9.0", + "execa": "^1.0.0", "throat": "^4.0.0" } }, "jest-config": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-23.6.0.tgz", - "integrity": "sha512-i8V7z9BeDXab1+VNo78WM0AtWpBRXJLnkT+lyT+Slx/cbP5sZJ0+NDuLcmBE5hXAoK0aUp7vI+MOxR+R4d8SRQ==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", + "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", "dev": true, "requires": { - "babel-core": "^6.0.0", - "babel-jest": "^23.6.0", + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^24.9.0", + "@jest/types": "^24.9.0", + "babel-jest": "^24.9.0", "chalk": "^2.0.1", "glob": "^7.1.1", - "jest-environment-jsdom": "^23.4.0", - "jest-environment-node": "^23.4.0", - "jest-get-type": "^22.1.0", - "jest-jasmine2": "^23.6.0", - "jest-regex-util": "^23.3.0", - "jest-resolve": "^23.6.0", - "jest-util": "^23.4.0", - "jest-validate": "^23.6.0", - "micromatch": "^2.3.11", - "pretty-format": "^23.6.0" + "jest-environment-jsdom": "^24.9.0", + "jest-environment-node": "^24.9.0", + "jest-get-type": "^24.9.0", + "jest-jasmine2": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "micromatch": "^3.1.10", + "pretty-format": "^24.9.0", + "realpath-native": "^1.1.0" + } + }, + "jest-diff": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", + "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff-sequences": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + } + }, + "jest-docblock": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz", + "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==", + "dev": true, + "requires": { + "detect-newline": "^2.1.0" + } + }, + "jest-each": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", + "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "jest-get-type": "^24.9.0", + "jest-util": "^24.9.0", + "pretty-format": "^24.9.0" + } + }, + "jest-environment-jsdom": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", + "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", + "dev": true, + "requires": { + "@jest/environment": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-util": "^24.9.0", + "jsdom": "^11.5.1" + } + }, + "jest-environment-jsdom-fifteen": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom-fifteen/-/jest-environment-jsdom-fifteen-1.0.2.tgz", + "integrity": "sha512-nfrnAfwklE1872LIB31HcjM65cWTh1wzvMSp10IYtPJjLDUbTTvDpajZgIxUnhRmzGvogdHDayCIlerLK0OBBg==", + "dev": true, + "requires": { + "@jest/environment": "^24.3.0", + "@jest/fake-timers": "^24.3.0", + "@jest/types": "^24.3.0", + "jest-mock": "^24.0.0", + "jest-util": "^24.0.0", + "jsdom": "^15.2.1" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "acorn": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", + "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", + "dev": true + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", "dev": true }, - "arr-diff": { + "cssstyle": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.0.0.tgz", + "integrity": "sha512-QXSAu2WBsSRXCPjvI43Y40m6fMevvyRm8JVAuF9ksQz5jha4pWP1wpaK7Yu5oLFc6+XAY+hj8YhefyXcBB53gg==", "dev": true, "requires": { - "arr-flatten": "^1.0.1" + "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 + } + } + }, + "jsdom": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", + "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "acorn": "^7.1.0", + "acorn-globals": "^4.3.2", + "array-equal": "^1.0.0", + "cssom": "^0.4.1", + "cssstyle": "^2.0.0", + "data-urls": "^1.1.0", + "domexception": "^1.0.1", + "escodegen": "^1.11.1", + "html-encoding-sniffer": "^1.0.2", + "nwsapi": "^2.2.0", + "parse5": "5.1.0", + "pn": "^1.1.0", + "request": "^2.88.0", + "request-promise-native": "^1.0.7", + "saxes": "^3.1.9", + "symbol-tree": "^3.2.2", + "tough-cookie": "^3.0.1", + "w3c-hr-time": "^1.0.1", + "w3c-xmlserializer": "^1.1.2", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^7.0.0", + "ws": "^7.0.0", + "xml-name-validator": "^3.0.0" } }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "parse5": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", "dev": true }, - "babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", "dev": true, "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" } }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", "dev": true, "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" } }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "ws": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.0.tgz", + "integrity": "sha512-+SqNqFbwTm/0DC18KYzIsMTnEWpLwJsiasW/O17la4iDRRIO9uaHbvKiAS3AHgTiuuWerK/brj4O6MYZkei9xg==", "dev": true, "requires": { - "ms": "2.0.0" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "jest-get-type": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", - "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "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" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "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" - } - }, - "pretty-format": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", - "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0", - "ansi-styles": "^3.2.0" - } - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - } - } - }, - "jest-diff": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", - "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "diff-sequences": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" - } - }, - "jest-docblock": { - "version": "23.2.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-23.2.0.tgz", - "integrity": "sha1-8IXh8YVI2Z/dabICB+b9VdkTg6c=", - "dev": true, - "requires": { - "detect-newline": "^2.1.0" - } - }, - "jest-each": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-23.6.0.tgz", - "integrity": "sha512-x7V6M/WGJo6/kLoissORuvLIeAoyo2YqLOoCDkohgJ4XOXSqOtyvr8FbInlAWS77ojBsZrafbozWoKVRdtxFCg==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "pretty-format": "^23.6.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "pretty-format": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", - "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0", - "ansi-styles": "^3.2.0" + "async-limiter": "^1.0.0" } } } }, - "jest-environment-jsdom": { - "version": "23.4.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz", - "integrity": "sha1-BWp5UrP+pROsYqFAosNox52eYCM=", - "dev": true, - "requires": { - "jest-mock": "^23.2.0", - "jest-util": "^23.4.0", - "jsdom": "^11.5.1" - } - }, "jest-environment-node": { - "version": "23.4.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-23.4.0.tgz", - "integrity": "sha1-V+gO0IQd6jAxZ8zozXlSHeuv3hA=", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", + "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", "dev": true, "requires": { - "jest-mock": "^23.2.0", - "jest-util": "^23.4.0" + "@jest/environment": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-util": "^24.9.0" } }, "jest-get-type": { @@ -9078,119 +8888,23 @@ "dev": true }, "jest-haste-map": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-23.6.0.tgz", - "integrity": "sha512-uyNhMyl6dr6HaXGHp8VF7cK6KpC6G9z9LiMNsst+rJIZ8l7wY0tk8qwjPmEghczojZ2/ZhtEdIabZ0OQRJSGGg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", + "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", "dev": true, "requires": { + "@jest/types": "^24.9.0", + "anymatch": "^2.0.0", "fb-watchman": "^2.0.0", - "graceful-fs": "^4.1.11", + "fsevents": "^1.2.7", + "graceful-fs": "^4.1.15", "invariant": "^2.2.4", - "jest-docblock": "^23.2.0", - "jest-serializer": "^23.0.1", - "jest-worker": "^23.2.0", - "micromatch": "^2.3.11", - "sane": "^2.0.0" - }, - "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - }, - "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" - } - } + "jest-serializer": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.9.0", + "micromatch": "^3.1.10", + "sane": "^4.0.3", + "walker": "^1.0.7" } }, "jest-html-reporter": { @@ -9223,495 +8937,174 @@ } }, "jest-jasmine2": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-23.6.0.tgz", - "integrity": "sha512-pe2Ytgs1nyCs8IvsEJRiRTPC0eVYd8L/dXJGU08GFuBwZ4sYH/lmFDdOL3ZmvJR8QKqV9MFuwlsAi/EWkFUbsQ==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", + "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", "dev": true, "requires": { - "babel-traverse": "^6.0.0", + "@babel/traverse": "^7.1.0", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", "co": "^4.6.0", - "expect": "^23.6.0", - "is-generator-fn": "^1.0.0", - "jest-diff": "^23.6.0", - "jest-each": "^23.6.0", - "jest-matcher-utils": "^23.6.0", - "jest-message-util": "^23.4.0", - "jest-snapshot": "^23.6.0", - "jest-util": "^23.4.0", - "pretty-format": "^23.6.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "jest-diff": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-23.6.0.tgz", - "integrity": "sha512-Gz9l5Ov+X3aL5L37IT+8hoCUsof1CVYBb2QEkOupK64XyRR3h+uRpYIm97K7sY8diFxowR8pIGEdyfMKTixo3g==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "diff": "^3.2.0", - "jest-get-type": "^22.1.0", - "pretty-format": "^23.6.0" - } - }, - "jest-get-type": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", - "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", - "dev": true - }, - "pretty-format": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", - "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0", - "ansi-styles": "^3.2.0" - } - } + "expect": "^24.9.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "pretty-format": "^24.9.0", + "throat": "^4.0.0" } }, "jest-leak-detector": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-23.6.0.tgz", - "integrity": "sha512-f/8zA04rsl1Nzj10HIyEsXvYlMpMPcy0QkQilVZDFOaPbv2ur71X5u2+C4ZQJGyV/xvVXtCCZ3wQ99IgQxftCg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", + "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", "dev": true, "requires": { - "pretty-format": "^23.6.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "pretty-format": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", - "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0", - "ansi-styles": "^3.2.0" - } - } + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" } }, "jest-matcher-utils": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz", - "integrity": "sha512-rosyCHQfBcol4NsckTn01cdelzWLU9Cq7aaigDf8VwwpIRvWE/9zLgX2bON+FkEW69/0UuYslUe22SOdEf2nog==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", + "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", "dev": true, "requires": { "chalk": "^2.0.1", - "jest-get-type": "^22.1.0", - "pretty-format": "^23.6.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "jest-get-type": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", - "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", - "dev": true - }, - "pretty-format": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", - "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0", - "ansi-styles": "^3.2.0" - } - } + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" } }, "jest-message-util": { - "version": "23.4.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-23.4.0.tgz", - "integrity": "sha1-F2EMUJQjSVCNAaPR4L2iwHkIap8=", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0-beta.35", + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/stack-utils": "^1.0.1", "chalk": "^2.0.1", - "micromatch": "^2.3.11", - "slash": "^1.0.0", + "micromatch": "^3.1.10", + "slash": "^2.0.0", "stack-utils": "^1.0.1" - }, - "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - }, - "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" - } - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - } } }, "jest-mock": { - "version": "23.2.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-23.2.0.tgz", - "integrity": "sha1-rRxg8p6HGdR8JuETgJi20YsmETQ=", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", + "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0" + } + }, + "jest-pnp-resolver": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", + "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==", "dev": true }, "jest-regex-util": { - "version": "23.3.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-23.3.0.tgz", - "integrity": "sha1-X4ZylUfCeFxAAs6qj4Sf6MpHG8U=", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", + "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", "dev": true }, "jest-resolve": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-23.6.0.tgz", - "integrity": "sha512-XyoRxNtO7YGpQDmtQCmZjum1MljDqUCob7XlZ6jy9gsMugHdN2hY4+Acz9Qvjz2mSsOnPSH7skBmDYCHXVZqkA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", + "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", "dev": true, "requires": { + "@jest/types": "^24.9.0", "browser-resolve": "^1.11.3", "chalk": "^2.0.1", - "realpath-native": "^1.0.0" + "jest-pnp-resolver": "^1.2.1", + "realpath-native": "^1.1.0" } }, "jest-resolve-dependencies": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-23.6.0.tgz", - "integrity": "sha512-EkQWkFWjGKwRtRyIwRwI6rtPAEyPWlUC2MpzHissYnzJeHcyCn1Hc8j7Nn1xUVrS5C6W5+ZL37XTem4D4pLZdA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz", + "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", "dev": true, "requires": { - "jest-regex-util": "^23.3.0", - "jest-snapshot": "^23.6.0" + "@jest/types": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-snapshot": "^24.9.0" } }, "jest-runner": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-23.6.0.tgz", - "integrity": "sha512-kw0+uj710dzSJKU6ygri851CObtCD9cN8aNkg8jWJf4ewFyEa6kwmiH/r/M1Ec5IL/6VFa0wnAk6w+gzUtjJzA==", - "dev": true, - "requires": { - "exit": "^0.1.2", - "graceful-fs": "^4.1.11", - "jest-config": "^23.6.0", - "jest-docblock": "^23.2.0", - "jest-haste-map": "^23.6.0", - "jest-jasmine2": "^23.6.0", - "jest-leak-detector": "^23.6.0", - "jest-message-util": "^23.4.0", - "jest-runtime": "^23.6.0", - "jest-util": "^23.4.0", - "jest-worker": "^23.2.0", - "source-map-support": "^0.5.6", - "throat": "^4.0.0" - } - }, - "jest-runtime": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-23.6.0.tgz", - "integrity": "sha512-ycnLTNPT2Gv+TRhnAYAQ0B3SryEXhhRj1kA6hBPSeZaNQkJ7GbZsxOLUkwg6YmvWGdX3BB3PYKFLDQCAE1zNOw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", + "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", "dev": true, "requires": { - "babel-core": "^6.0.0", - "babel-plugin-istanbul": "^4.1.6", - "chalk": "^2.0.1", - "convert-source-map": "^1.4.0", + "@jest/console": "^24.7.1", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.4.2", "exit": "^0.1.2", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.1.11", - "jest-config": "^23.6.0", - "jest-haste-map": "^23.6.0", - "jest-message-util": "^23.4.0", - "jest-regex-util": "^23.3.0", - "jest-resolve": "^23.6.0", - "jest-snapshot": "^23.6.0", - "jest-util": "^23.4.0", - "jest-validate": "^23.6.0", - "micromatch": "^2.3.11", - "realpath-native": "^1.0.0", - "slash": "^1.0.0", - "strip-bom": "3.0.0", - "write-file-atomic": "^2.1.0", - "yargs": "^11.0.0" - }, - "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" - } - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "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" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "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" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "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" - } - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } + "graceful-fs": "^4.1.15", + "jest-config": "^24.9.0", + "jest-docblock": "^24.3.0", + "jest-haste-map": "^24.9.0", + "jest-jasmine2": "^24.9.0", + "jest-leak-detector": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-resolve": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.6.0", + "source-map-support": "^0.5.6", + "throat": "^4.0.0" + } + }, + "jest-runtime": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", + "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/environment": "^24.9.0", + "@jest/source-map": "^24.3.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/yargs": "^13.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "jest-config": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "realpath-native": "^1.1.0", + "slash": "^2.0.0", + "strip-bom": "^3.0.0", + "yargs": "^13.3.0" } }, "jest-serializer": { - "version": "23.0.1", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-23.0.1.tgz", - "integrity": "sha1-o3dq6zEekP6D+rnlM+hRAr0WQWU=", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", + "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", "dev": true }, "jest-serializer-vue": { @@ -9724,62 +9117,31 @@ } }, "jest-snapshot": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-23.6.0.tgz", - "integrity": "sha512-tM7/Bprftun6Cvj2Awh/ikS7zV3pVwjRYU2qNYS51VZHgaAMBs5l4o/69AiDHhQrj5+LA2Lq4VIvK7zYk/bswg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", + "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", "dev": true, "requires": { - "babel-types": "^6.0.0", + "@babel/types": "^7.0.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", - "jest-diff": "^23.6.0", - "jest-matcher-utils": "^23.6.0", - "jest-message-util": "^23.4.0", - "jest-resolve": "^23.6.0", + "expect": "^24.9.0", + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-resolve": "^24.9.0", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "pretty-format": "^23.6.0", - "semver": "^5.5.0" + "pretty-format": "^24.9.0", + "semver": "^6.2.0" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "jest-diff": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-23.6.0.tgz", - "integrity": "sha512-Gz9l5Ov+X3aL5L37IT+8hoCUsof1CVYBb2QEkOupK64XyRR3h+uRpYIm97K7sY8diFxowR8pIGEdyfMKTixo3g==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "diff": "^3.2.0", - "jest-get-type": "^22.1.0", - "pretty-format": "^23.6.0" - } - }, - "jest-get-type": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", - "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true - }, - "pretty-format": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", - "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0", - "ansi-styles": "^3.2.0" - } } } }, @@ -9790,27 +9152,40 @@ "dev": true }, "jest-util": { - "version": "23.4.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-23.4.0.tgz", - "integrity": "sha1-TQY8uSe68KI4Mf9hvsLLv0l5NWE=", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", + "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", "dev": true, "requires": { - "callsites": "^2.0.0", + "@jest/console": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/source-map": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "callsites": "^3.0.0", "chalk": "^2.0.1", - "graceful-fs": "^4.1.11", - "is-ci": "^1.0.10", - "jest-message-util": "^23.4.0", + "graceful-fs": "^4.1.15", + "is-ci": "^2.0.0", "mkdirp": "^0.5.1", - "slash": "^1.0.0", + "slash": "^2.0.0", "source-map": "^0.6.0" }, "dependencies": { - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "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 }, + "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": { + "ci-info": "^2.0.0" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -9820,73 +9195,95 @@ } }, "jest-validate": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-23.6.0.tgz", - "integrity": "sha512-OFKapYxe72yz7agrDAWi8v2WL8GIfVqcbKRCLbRG9PAxtzF9b1SEDdTpytNDN12z2fJynoBwpMpvj2R39plI2A==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", + "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", "dev": true, "requires": { + "@jest/types": "^24.9.0", + "camelcase": "^5.3.1", "chalk": "^2.0.1", - "jest-get-type": "^22.1.0", - "leven": "^2.1.0", - "pretty-format": "^23.6.0" + "jest-get-type": "^24.9.0", + "leven": "^3.1.0", + "pretty-format": "^24.9.0" + } + }, + "jest-watch-typeahead": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.4.2.tgz", + "integrity": "sha512-f7VpLebTdaXs81rg/oj4Vg/ObZy2QtGzAmGLNsqUS5G5KtSN68tFcIsbvNODfNyQxU78g7D8x77o3bgfBTR+2Q==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^2.4.1", + "jest-regex-util": "^24.9.0", + "jest-watcher": "^24.3.0", + "slash": "^3.0.0", + "string-length": "^3.1.0", + "strip-ansi": "^5.0.0" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "ansi-escapes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", + "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } }, - "jest-get-type": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", - "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, - "pretty-format": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", - "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", + "string-length": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", + "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", "dev": true, "requires": { - "ansi-regex": "^3.0.0", - "ansi-styles": "^3.2.0" + "astral-regex": "^1.0.0", + "strip-ansi": "^5.2.0" } } } }, - "jest-watch-typeahead": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.2.1.tgz", - "integrity": "sha512-xdhEtKSj0gmnkDQbPTIHvcMmXNUDzYpHLEJ5TFqlaI+schi2NI96xhWiZk9QoesAS7oBmKwWWsHazTrYl2ORgg==", - "dev": true, - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.4.1", - "jest-watcher": "^23.1.0", - "slash": "^2.0.0", - "string-length": "^2.0.0", - "strip-ansi": "^5.0.0" - } - }, "jest-watcher": { - "version": "23.4.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-23.4.0.tgz", - "integrity": "sha1-0uKM50+NrWxq/JIrksq+9u0FyRw=", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz", + "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", "dev": true, "requires": { + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/yargs": "^13.0.0", "ansi-escapes": "^3.0.0", "chalk": "^2.0.1", + "jest-util": "^24.9.0", "string-length": "^2.0.0" } }, "jest-worker": { - "version": "23.2.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-23.2.0.tgz", - "integrity": "sha1-+vcGqNo2+uYOsmlXJX+ntdjqArk=", + "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": "^1.0.1" + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "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" + } + } } }, "js-beautify": { @@ -9923,6 +9320,11 @@ "easy-stack": "^1.0.0" } }, + "js-sha256": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz", + "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==" + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -10060,9 +9462,13 @@ } }, "keycloak-js": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/keycloak-js/-/keycloak-js-6.0.1.tgz", - "integrity": "sha512-p02dBCA9pSH1xvTmRIEMdeMz00eCGKmZF+rjMeqrkiQD4xhXkzu50J9sQjaANolMlLhazOtfql70+N5QWm8Upg==" + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/keycloak-js/-/keycloak-js-8.0.1.tgz", + "integrity": "sha512-1ABx6ZCk1jrmn9wAX8oMw175M75JHhpKq2bKSmplkhQXErkp0r8Lf+e+91Gr8DixVtT4/IyH9mc/JQuwbkvRbA==", + "requires": { + "base64-js": "1.3.1", + "js-sha256": "0.9.0" + } }, "killable": { "version": "1.0.1", @@ -10077,9 +9483,9 @@ "dev": true }, "kleur": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-2.0.2.tgz", - "integrity": "sha512-77XF9iTllATmG9lSlIv0qdQ2BQ/h9t0bJllHlbvsQ0zUWfU7Yi0S8L5JXzPZgkefIiajLmBJJ4BsMJmqcf7oxQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, "launch-editor": { @@ -10117,9 +9523,9 @@ "dev": true }, "leven": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", - "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "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": { @@ -10139,22 +9545,31 @@ "dev": true }, "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "dev": true, "requires": { "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" }, "dependencies": { + "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": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true } } @@ -10353,12 +9768,6 @@ "object-visit": "^1.0.0" } }, - "math-random": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", - "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", - "dev": true - }, "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -10411,12 +9820,6 @@ "readable-stream": "^2.0.1" } }, - "merge": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", - "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", - "dev": true - }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -10441,13 +9844,10 @@ } }, "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } + "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.3.0", @@ -10461,6 +9861,12 @@ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", "dev": true }, + "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": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", @@ -10542,6 +9948,17 @@ "query-string": "^4.1.0", "sort-keys": "^1.0.0" } + }, + "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": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } } } }, @@ -10572,6 +9989,50 @@ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, + "minipass": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", + "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", + "dev": true, + "requires": { + "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 + } + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz", + "integrity": "sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, "mississippi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", @@ -10845,6 +10306,12 @@ } } }, + "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 + }, "node-notifier": { "version": "5.4.3", "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", @@ -11064,16 +10531,6 @@ } } }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" - } - }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -11279,6 +10736,15 @@ "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", "dev": true }, + "p-each-series": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", + "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", + "dev": true, + "requires": { + "p-reduce": "^1.0.0" + } + }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", @@ -11310,9 +10776,18 @@ } }, "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-reduce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", + "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", "dev": true }, "p-retry": { @@ -11387,35 +10862,6 @@ "safe-buffer": "^5.1.1" } }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", @@ -11544,6 +10990,12 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, + "picomatch": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.1.1.tgz", + "integrity": "sha512-OYMyqkKzK7blWO/+XZYP6w8hH0LDvkBvdvKukti+7kqYFCiEAk+gI3DWnryapc0Dau05ugGTy0foQ6mqn4AHYA==", + "dev": true + }, "pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", @@ -11565,6 +11017,15 @@ "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", @@ -11619,15 +11080,6 @@ } } }, - "pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - }, "pn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", @@ -11781,6 +11233,19 @@ "postcss": "^7.0.0", "postcss-load-config": "^2.0.0", "schema-utils": "^1.0.0" + }, + "dependencies": { + "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": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } } }, "postcss-merge-longhand": { @@ -11877,125 +11342,95 @@ "dev": true, "requires": { "dot-prop": "^4.1.1", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "postcss-modules-extract-imports": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz", - "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==", - "dev": true, - "requires": { - "postcss": "^6.0.1" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" + "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 } } }, + "postcss-modules-extract-imports": { + "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": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", - "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz", + "integrity": "sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ==", "dev": true, "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" + "icss-utils": "^4.1.1", + "postcss": "^7.0.16", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.0" }, "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "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-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", "dev": true, "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" + "cssesc": "^3.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-value-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", + "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==", "dev": true } } }, "postcss-modules-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", - "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.1.1.tgz", + "integrity": "sha512-OXRUPecnHCg8b9xWvldG/jUpRIGPNRka0r4D4j0ESUU2/5IOnpsjfPPmDprM3Ih8CgZ8FXjWqaniK5v4rWt3oQ==", "dev": true, "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" }, "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "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-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", "dev": true, "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" + "cssesc": "^3.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==", - "dev": true } } }, "postcss-modules-values": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", - "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", + "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-replace-symbols": "^1.1.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" } }, "postcss-normalize-charset": { @@ -12184,12 +11619,6 @@ "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", "dev": true }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, "prettier": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", @@ -12271,13 +11700,13 @@ "dev": true }, "prompts": { - "version": "0.1.14", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-0.1.14.tgz", - "integrity": "sha512-rxkyiE9YH6zAz/rZpywySLKkpaj0NMVyNw1qhsubdbjjSgcayjTShDreZGlFMcGSu5sab3bAKPfFk78PB90+8w==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.0.tgz", + "integrity": "sha512-NfbbPPg/74fT7wk2XYQ7hAIp9zJyZp5Fu19iRbORqqy1BhtrkZ0fPafBU+7bmn8ie69DpT0R6QpJIN2oisYjJg==", "dev": true, "requires": { - "kleur": "^2.0.1", - "sisteransi": "^0.1.1" + "kleur": "^3.0.3", + "sisteransi": "^1.0.3" } }, "proto-list": { @@ -12407,25 +11836,6 @@ "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", "dev": true }, - "randomatic": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", - "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", - "dev": true, - "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } - }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -12470,63 +11880,68 @@ "dev": true }, "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "dev": true, "requires": { - "load-json-file": "^1.0.0", + "load-json-file": "^4.0.0", "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "dependencies": { - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } + "path-type": "^3.0.0" } }, "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", "dev": true, "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" }, "dependencies": { "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "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": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "locate-path": "^3.0.0" } }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "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": { - "pinkie-promise": "^2.0.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "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-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 } } }, @@ -12595,15 +12010,6 @@ "private": "^0.1.6" } }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "requires": { - "is-equal-shallow": "^0.1.3" - } - }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", @@ -12748,15 +12154,6 @@ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, "request": { "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", @@ -12820,9 +12217,9 @@ "dev": true }, "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, "requires-port": { @@ -12831,12 +12228,6 @@ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", "dev": true }, - "reselect": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-3.0.1.tgz", - "integrity": "sha1-79qpjqdFEyTQkrKyFjpqHXqaIUc=", - "dev": true - }, "resolve": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.13.1.tgz", @@ -12921,9 +12312,9 @@ } }, "rsvp": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", - "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", "dev": true }, "run-async": { @@ -12975,20 +12366,20 @@ "dev": true }, "sane": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/sane/-/sane-2.5.2.tgz", - "integrity": "sha1-tNwYYcIbQn6SlQej51HiosuKs/o=", + "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": "^1.2.0", - "exec-sh": "^0.2.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", "fb-watchman": "^2.0.0", - "fsevents": "^1.2.3", "micromatch": "^3.1.4", "minimist": "^1.1.1", - "walker": "~1.0.5", - "watch": "~0.18.0" + "walker": "~1.0.5" } }, "sass": { @@ -13006,15 +12397,23 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true }, + "saxes": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", + "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", + "dev": true, + "requires": { + "xmlchars": "^2.1.1" + } + }, "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==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.1.tgz", + "integrity": "sha512-0WXHDs1VDJyo+Zqs9TKLKyD/h7yDpHUhEFsM2CzkICFdoX1av+GBq/J2xRTFfsQO5kBfhZzANf2VcIm84jqDbg==", "dev": true, "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" } }, "select-hose": { @@ -13272,9 +12671,9 @@ } }, "sisteransi": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-0.1.1.tgz", - "integrity": "sha512-PmGOd02bM9YO5ifxpw36nrNMBTptEtfRl4qUYl9SndkolplkrZZOW7PGHjrZL53QvMVj9nQ+TKqUnRsw4tJa4g==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.4.tgz", + "integrity": "sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig==", "dev": true }, "slash": { @@ -13755,29 +13154,21 @@ } }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { + "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "strip-ansi": "^5.1.0" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "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 - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } } } }, @@ -13842,13 +13233,10 @@ } }, "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true }, "strip-eof": { "version": "1.0.0", @@ -14019,127 +13407,37 @@ "worker-farm": "^1.7.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 - } - } - }, - "test-exclude": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.3.tgz", - "integrity": "sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "micromatch": "^2.3.11", - "object-assign": "^4.1.0", - "read-pkg-up": "^1.0.1", - "require-main-filename": "^1.0.1" - }, - "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "is-extglob": { + "schema-utils": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "dev": true, "requires": { - "is-buffer": "^1.1.5" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" } }, - "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" - } + "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 } } }, + "test-exclude": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", + "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "dev": true, + "requires": { + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^2.0.0" + } + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -14326,12 +13624,6 @@ "punycode": "^2.1.0" } }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, "tryer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", @@ -14374,16 +13666,67 @@ } }, "ts-loader": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-5.4.5.tgz", - "integrity": "sha512-XYsjfnRQCBum9AMRZpk2rTYSVpdZBpZK+kDh0TeT3kxmQNBDVIeUjdPjY5RZry4eIAb8XHc4gYSUiUWPYvzSRw==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-6.2.1.tgz", + "integrity": "sha512-Dd9FekWuABGgjE1g0TlQJ+4dFUfYGbYcs52/HQObE0ZmUNjQlmLAS7xXsSzy23AMaMwipsx5sNHvoEpT2CZq1g==", "dev": true, "requires": { "chalk": "^2.3.0", "enhanced-resolve": "^4.0.0", "loader-utils": "^1.0.2", - "micromatch": "^3.1.4", - "semver": "^5.0.1" + "micromatch": "^4.0.0", + "semver": "^6.0.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 + }, + "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" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "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" + } + } } }, "tsconfig": { @@ -14396,14 +13739,6 @@ "@types/strip-json-comments": "0.0.30", "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": { @@ -14484,9 +13819,9 @@ } }, "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==", + "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": { @@ -14705,14 +14040,14 @@ } }, "url-loader": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.2.tgz", - "integrity": "sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-2.3.0.tgz", + "integrity": "sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==", "dev": true, "requires": { - "loader-utils": "^1.1.0", - "mime": "^2.0.3", - "schema-utils": "^1.0.0" + "loader-utils": "^1.2.3", + "mime": "^2.4.4", + "schema-utils": "^2.5.0" } }, "url-parse": { @@ -14838,32 +14173,26 @@ "integrity": "sha512-G9152NzUkz0i0xTfhk0Afc8vzdXxDR1pfN4dTwE72cskkgJtdXfrKBkMfGvDuxUh35U500g5Ve4xL8PEGdWeHg==" }, "vue-eslint-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-5.0.0.tgz", - "integrity": "sha512-JlHVZwBBTNVvzmifwjpZYn0oPWH2SgWv5dojlZBsrhablDu95VFD+hriB1rQGwbD+bms6g+rAFhQHk6+NyiS6g==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-6.0.5.tgz", + "integrity": "sha512-Bvjlx7rH1Ulvus56KHeLXOjEi3JMOYTa1GAqZr9lBQhd8weK8mV7U7V2l85yokBZEWHJQjLn6X3nosY8TzkOKg==", "dev": true, "requires": { - "debug": "^4.1.0", + "debug": "^4.1.1", "eslint-scope": "^4.0.0", "eslint-visitor-keys": "^1.0.0", - "espree": "^4.1.0", + "espree": "^5.0.0", "esquery": "^1.0.1", "lodash": "^4.17.11" }, "dependencies": { - "acorn": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.0.tgz", - "integrity": "sha512-8oe72N3WPMjA+2zVG71Ia0nXZ8DpQH+QyyHO+p06jT8eg8FGG3FbcUIi8KziHlAfheJQZeoqbvq1mQSQHXKYLw==", - "dev": true - }, "espree": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-4.1.0.tgz", - "integrity": "sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", + "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", "dev": true, "requires": { - "acorn": "^6.0.2", + "acorn": "^6.0.7", "acorn-jsx": "^5.0.0", "eslint-visitor-keys": "^1.0.0" } @@ -14971,9 +14300,9 @@ "integrity": "sha512-m0w7/FMsNcwJgunJeM+wcNaHzK2KX1K1rw2WUQf7Q16ndXHo7pflRyOV/E8795JO/7fstyjH3EgqBI4h4n4qXQ==" }, "vuex-module-decorators": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/vuex-module-decorators/-/vuex-module-decorators-0.10.1.tgz", - "integrity": "sha512-OBvHEeer8uT///oTWqgf7kPe0j3hb9IC9ahdk41S4gBHhn5YUHpyXdry2OXp77zPzQ1P6wTY+Ju+/VUcU5mhzA==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/vuex-module-decorators/-/vuex-module-decorators-0.11.0.tgz", + "integrity": "sha512-mQeH0F9C5eoDvhOxGLxc2eKAA+GT9MvCyauZZtQSvLjN3PX//oj9mlhpmMJH2/q9LOScZ8fBrX1qqd+aOKq/LA==", "dev": true }, "w3c-hr-time": { @@ -14985,6 +14314,17 @@ "browser-process-hrtime": "^0.1.2" } }, + "w3c-xmlserializer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", + "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", + "dev": true, + "requires": { + "domexception": "^1.0.1", + "webidl-conversions": "^4.0.2", + "xml-name-validator": "^3.0.0" + } + }, "walker": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", @@ -14994,16 +14334,6 @@ "makeerror": "1.0.x" } }, - "watch": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz", - "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=", - "dev": true, - "requires": { - "exec-sh": "^0.2.0", - "minimist": "^1.2.0" - } - }, "watchpack": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", @@ -15068,6 +14398,19 @@ "terser-webpack-plugin": "^1.4.1", "watchpack": "^1.6.0", "webpack-sources": "^1.4.1" + }, + "dependencies": { + "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": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } } }, "webpack-bundle-analyzer": { @@ -15109,13 +14452,21 @@ } }, "webpack-chain": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/webpack-chain/-/webpack-chain-4.12.1.tgz", - "integrity": "sha512-BCfKo2YkDe2ByqkEWe1Rw+zko4LsyS75LVr29C6xIrxAg9JHJ4pl8kaIZ396SUSNp6b4815dRZPSTAS8LlURRQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/webpack-chain/-/webpack-chain-6.0.0.tgz", + "integrity": "sha512-NK62XgJOOSmYs4kaXFIKKeClpuOVHY7m6e4XwxbVX/2HAUboH6xFCTVXMVv8+jB6K8o/UGjlo1Cv3XXOyNAAGw==", "dev": true, "requires": { "deepmerge": "^1.5.2", - "javascript-stringify": "^1.6.0" + "javascript-stringify": "^2.0.0" + }, + "dependencies": { + "deepmerge": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", + "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==", + "dev": true + } } }, "webpack-dev-middleware": { @@ -15178,6 +14529,34 @@ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", @@ -15187,15 +14566,11 @@ "locate-path": "^3.0.0" } }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - } + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true }, "is-absolute-url": { "version": "3.0.3", @@ -15237,12 +14612,56 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "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": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -15261,6 +14680,38 @@ "has-flag": "^3.0.0" } }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, "ws": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", @@ -15426,51 +14877,24 @@ "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": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "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 - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "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" - } - } + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" } }, "wrappy": { @@ -15489,9 +14913,9 @@ } }, "write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", + "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", "dev": true, "requires": { "graceful-fs": "^4.1.11", @@ -15520,6 +14944,12 @@ "integrity": "sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ==", "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.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -15539,48 +14969,76 @@ "dev": true }, "yargs": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.1.tgz", - "integrity": "sha512-PRU7gJrJaXv3q3yQZ/+/X6KBswZiaQ+zOmdprZcouPYtQgvNU35i+68M4b1ZHLZtYFT5QObFLV+ZkmJYcwKdiw==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", "dev": true, "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.1.0", + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", + "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^2.0.0", + "string-width": "^3.0.0", "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^9.0.2" + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" }, "dependencies": { - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "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" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.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-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 } } }, "yargs-parser": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", - "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", "dev": true, "requires": { - "camelcase": "^4.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - } + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } }, "yorkie": { diff --git a/ui/package.json b/ui/package.json index c9d6bde09..fcd21852b 100644 --- a/ui/package.json +++ b/ui/package.json @@ -11,7 +11,7 @@ "@types/node": "^12.12.17", "axios": "^0.19.0", "clipboard-copy": "^3.1.0", - "keycloak-js": "6.0.1", + "keycloak-js": "8.0.1", "vue": "^2.6.10", "vue-class-component": "^7.1.0", "vue-monaco": "^1.1.0", @@ -26,27 +26,27 @@ "@types/jest": "^24.0.23", "@typescript-eslint/eslint-plugin": "^2.11.0", "@typescript-eslint/parser": "^2.11.0", - "@vue/cli-plugin-babel": "^3.12.1", - "@vue/cli-plugin-typescript": "^3.12.1", - "@vue/cli-plugin-unit-jest": "^3.12.1", - "@vue/cli-service": "^3.12.1", - "@vue/eslint-config-typescript": "^4.0.0", - "@vue/test-utils": "1.0.0-beta.29", + "@vue/cli-plugin-babel": "^4.1.1", + "@vue/cli-plugin-typescript": "^4.1.1", + "@vue/cli-plugin-unit-jest": "^4.1.1", + "@vue/cli-service": "^4.1.1", + "@vue/eslint-config-typescript": "^5.0.1", + "@vue/test-utils": "1.0.0-beta.30", "babel-core": "7.0.0-bridge.0", "eslint": "^6.7.2", "eslint-config-standard": "^14.1.0", "eslint-plugin-import": "^2.19.1", - "eslint-plugin-node": "^9.2.0", + "eslint-plugin-node": "^10.0.0", "eslint-plugin-promise": "^4.2.1", "eslint-plugin-standard": "^4.0.1", - "eslint-plugin-vue": "^5.2.3", + "eslint-plugin-vue": "^6.0.1", "jest-html-reporter": "^2.8.0", "monaco-editor-webpack-plugin": "^1.7.0", "sass": "^1.23.7", "ts-jest": "^24.2.0", "typescript": "^3.7.3", "vue-template-compiler": "^2.6.10", - "vuex-module-decorators": "^0.10.1" + "vuex-module-decorators": "^0.11.0" }, "homepage": "https://github.com/jvalue/ods-webclient", "licenses": [ From fde911814aeebb00dc5c6314bc7433d38b89b3c1 Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Fri, 13 Dec 2019 13:55:54 +0100 Subject: [PATCH 0261/1168] UI: linter --- ui/src/pipeline/PipelineEdit.vue | 65 ++++++++++++++----- .../edit/PipelineEditStepperButtonGroup.vue | 22 +++---- .../pipeline/edit/PipelineMetadataConfig.vue | 58 ++++++++--------- .../edit/PipelineTransformationConfig.vue | 40 ++++++------ .../pipeline/edit/PipelineTriggerConfig.vue | 33 +++++----- .../edit/adapter/PipelineAdapterConfig.vue | 31 ++++----- .../edit/adapter/PipelineCsvAdapterConfig.vue | 24 ++++--- ui/src/pipeline/pipeline.ts | 2 +- ui/src/transformation/TransformationMain.vue | 2 +- 9 files changed, 149 insertions(+), 128 deletions(-) diff --git a/ui/src/pipeline/PipelineEdit.vue b/ui/src/pipeline/PipelineEdit.vue index 648ed2128..bb9ac4256 100644 --- a/ui/src/pipeline/PipelineEdit.vue +++ b/ui/src/pipeline/PipelineEdit.vue @@ -32,7 +32,12 @@ :rules="[required]" /> - + Configure the data import - - + + Customize data transformations - - + + - - + + Configure Execution Details - - + + @@ -128,7 +162,6 @@ import PipelineMetadataConfig from './edit/PipelineMetadataConfig.vue' import PipelineTransformationConfig from './edit/PipelineTransformationConfig.vue' import PipelineTriggerConfig from './edit/PipelineTriggerConfig.vue' - const namespace = { namespace: 'pipeline' } @Component({ @@ -227,12 +260,12 @@ export default class PipelineEdit extends Vue { return !!val || 'required.' } - private evaluateAllForms() { - return this.validStep1 - && this.validStep2 - && this.validStep3 - && this.validStep4 - && this.validStep5; + private evaluateAllForms () { + return this.validStep1 && + this.validStep2 && + this.validStep3 && + this.validStep4 && + this.validStep5 } } diff --git a/ui/src/pipeline/edit/PipelineEditStepperButtonGroup.vue b/ui/src/pipeline/edit/PipelineEditStepperButtonGroup.vue index 5a42dca7f..e629997d7 100644 --- a/ui/src/pipeline/edit/PipelineEditStepperButtonGroup.vue +++ b/ui/src/pipeline/edit/PipelineEditStepperButtonGroup.vue @@ -19,7 +19,6 @@
- diff --git a/ui/src/pipeline/edit/PipelineMetadataConfig.vue b/ui/src/pipeline/edit/PipelineMetadataConfig.vue index a9d81f7af..62649254c 100644 --- a/ui/src/pipeline/edit/PipelineMetadataConfig.vue +++ b/ui/src/pipeline/edit/PipelineMetadataConfig.vue @@ -1,26 +1,25 @@ - diff --git a/ui/src/pipeline/edit/PipelineTransformationConfig.vue b/ui/src/pipeline/edit/PipelineTransformationConfig.vue index 725db8bbf..0a6af582c 100644 --- a/ui/src/pipeline/edit/PipelineTransformationConfig.vue +++ b/ui/src/pipeline/edit/PipelineTransformationConfig.vue @@ -1,18 +1,17 @@ - diff --git a/ui/src/pipeline/edit/adapter/PipelineAdapterConfig.vue b/ui/src/pipeline/edit/adapter/PipelineAdapterConfig.vue index b2cdd3084..ce2a6b025 100644 --- a/ui/src/pipeline/edit/adapter/PipelineAdapterConfig.vue +++ b/ui/src/pipeline/edit/adapter/PipelineAdapterConfig.vue @@ -26,13 +26,12 @@ - From 1a2f3ed27f1ea995cf4be40bfac5be1f4f9c0704 Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Fri, 20 Dec 2019 13:41:26 +0100 Subject: [PATCH 0277/1168] ui: Apply linter --- .../notifications/NotificationEdit.vue | 14 +-- .../notifications/NotificationOverview.vue | 4 +- ui/src/pipeline/notifications/WebhookEdit.vue | 88 +++++++++---------- 3 files changed, 53 insertions(+), 53 deletions(-) diff --git a/ui/src/pipeline/notifications/NotificationEdit.vue b/ui/src/pipeline/notifications/NotificationEdit.vue index 37859e3c7..0972fd913 100644 --- a/ui/src/pipeline/notifications/NotificationEdit.vue +++ b/ui/src/pipeline/notifications/NotificationEdit.vue @@ -36,10 +36,10 @@ md="4" > @@ -89,10 +89,10 @@ export default class PipelineNotifications extends Vue implements NotificationEd private defaultNotification: NotificationConfig = { notificationId: -1, - condition: "true", + condition: 'true', params: { - type: "WEBHOOK", - url: "" + type: 'WEBHOOK', + url: '' } } diff --git a/ui/src/pipeline/notifications/NotificationOverview.vue b/ui/src/pipeline/notifications/NotificationOverview.vue index c5e985f22..f4df082d2 100644 --- a/ui/src/pipeline/notifications/NotificationOverview.vue +++ b/ui/src/pipeline/notifications/NotificationOverview.vue @@ -130,12 +130,12 @@ export default class PipelineNotifications extends Vue { } private onCreateNotification () { - this.isEdit = false; + this.isEdit = false this.notificationEdit.openDialog() } private onEditNotification (notification: NotificationConfig) { - this.isEdit = true; + this.isEdit = true this.notificationEdit.openDialog(notification) } diff --git a/ui/src/pipeline/notifications/WebhookEdit.vue b/ui/src/pipeline/notifications/WebhookEdit.vue index 0513944f2..24c4b6b19 100644 --- a/ui/src/pipeline/notifications/WebhookEdit.vue +++ b/ui/src/pipeline/notifications/WebhookEdit.vue @@ -3,54 +3,54 @@ v-model="validForm" > From ba3bd3a681eefe188ffead3e5dd1d33cfd1660fc Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Fri, 20 Dec 2019 20:05:19 +0100 Subject: [PATCH 0278/1168] ui: Remove unused validation rule in WebhookEdit --- ui/src/pipeline/notifications/WebhookEdit.vue | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/ui/src/pipeline/notifications/WebhookEdit.vue b/ui/src/pipeline/notifications/WebhookEdit.vue index 24c4b6b19..d275b02f8 100644 --- a/ui/src/pipeline/notifications/WebhookEdit.vue +++ b/ui/src/pipeline/notifications/WebhookEdit.vue @@ -19,7 +19,7 @@ import { WebhookParams } from '@/pipeline/notifications/notificationConfig' @Component({ }) export default class WebhookEdit extends Vue { - private validForm = false; + private validForm = false @PropSync('value') private webhookParams!: WebhookParams @@ -39,10 +39,6 @@ export default class WebhookEdit extends Vue { this.emitValid() } - private required (val: string) { - return !!val || 'required.' - } - private validateURL (url: string) { const urlRegex = new RegExp('^(https?:\\/\\/)?' + // protocol '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|' + // domain name From 8f0a845257e4db092440af09275b4afc3f0c1b03 Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Fri, 20 Dec 2019 20:22:13 +0100 Subject: [PATCH 0279/1168] ui: Add useful validation message --- ui/src/pipeline/notifications/WebhookEdit.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/src/pipeline/notifications/WebhookEdit.vue b/ui/src/pipeline/notifications/WebhookEdit.vue index 24c4b6b19..1ed80e7ae 100644 --- a/ui/src/pipeline/notifications/WebhookEdit.vue +++ b/ui/src/pipeline/notifications/WebhookEdit.vue @@ -50,7 +50,7 @@ export default class WebhookEdit extends Vue { '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*' + // port and path '(\\?[;&a-z\\d%_.~+=-]*)?' + // query string '(\\#[-a-z\\d_]*)?$', 'i') // fragment locator - return !!url && url.match(urlRegex) || 'lol' + return !!url && url.match(urlRegex) || 'URL invalid' } } From 462dbe8f90a6f8fa1dc0cdb6ca3ce95dd261e249 Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Fri, 20 Dec 2019 20:22:13 +0100 Subject: [PATCH 0280/1168] ui: Add useful validation message --- ui/src/pipeline/notifications/WebhookEdit.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/src/pipeline/notifications/WebhookEdit.vue b/ui/src/pipeline/notifications/WebhookEdit.vue index d275b02f8..a20536243 100644 --- a/ui/src/pipeline/notifications/WebhookEdit.vue +++ b/ui/src/pipeline/notifications/WebhookEdit.vue @@ -46,7 +46,7 @@ export default class WebhookEdit extends Vue { '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*' + // port and path '(\\?[;&a-z\\d%_.~+=-]*)?' + // query string '(\\#[-a-z\\d_]*)?$', 'i') // fragment locator - return !!url && url.match(urlRegex) || 'lol' + return !!url && url.match(urlRegex) || 'URL invalid' } } From 4a33183fe5fd91680fe31bcfc5e3466961f834d6 Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Fri, 20 Dec 2019 20:26:49 +0100 Subject: [PATCH 0281/1168] ui: Add firebase notification type --- .../pipeline/notifications/FirebaseEdit.vue | 66 +++++++++++++++++++ .../notifications/NotificationEdit.vue | 11 +++- 2 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 ui/src/pipeline/notifications/FirebaseEdit.vue diff --git a/ui/src/pipeline/notifications/FirebaseEdit.vue b/ui/src/pipeline/notifications/FirebaseEdit.vue new file mode 100644 index 000000000..fda350268 --- /dev/null +++ b/ui/src/pipeline/notifications/FirebaseEdit.vue @@ -0,0 +1,66 @@ + + + diff --git a/ui/src/pipeline/notifications/NotificationEdit.vue b/ui/src/pipeline/notifications/NotificationEdit.vue index 0972fd913..f19934c50 100644 --- a/ui/src/pipeline/notifications/NotificationEdit.vue +++ b/ui/src/pipeline/notifications/NotificationEdit.vue @@ -41,6 +41,12 @@ class="pl-7" @validityChanged="validForm = $event" /> + @@ -73,9 +79,10 @@ import NotificationConfig from '@/pipeline/notifications/notificationConfig' import NotificationEditDialog from '@/pipeline/notifications/notificationEditDialog' import { Emit } from 'vue-property-decorator' import WebhookEdit from '@/pipeline/notifications/WebhookEdit.vue' +import FirebaseEdit from '@/pipeline/notifications/FirebaseEdit.vue' @Component({ - components: { WebhookEdit: WebhookEdit } + components: { WebhookEdit, FirebaseEdit } }) export default class PipelineNotifications extends Vue implements NotificationEditDialog { private validForm = false; @@ -84,7 +91,7 @@ export default class PipelineNotifications extends Vue implements NotificationEd return this.editedNotification } - private notificationTypes = ['WEBHOOK'] + private notificationTypes = ['WEBHOOK', 'FCM'] private dialogOpen = false private defaultNotification: NotificationConfig = { From 9ab9741012a7c874a3c6826b966c7eb8c283abf1 Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Fri, 20 Dec 2019 20:33:22 +0100 Subject: [PATCH 0282/1168] ui: Show type and condition instead of url in notification list --- .../pipeline/notifications/NotificationOverview.vue | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/ui/src/pipeline/notifications/NotificationOverview.vue b/ui/src/pipeline/notifications/NotificationOverview.vue index f4df082d2..99fe63ebd 100644 --- a/ui/src/pipeline/notifications/NotificationOverview.vue +++ b/ui/src/pipeline/notifications/NotificationOverview.vue @@ -41,8 +41,11 @@ - @@ -37,30 +36,29 @@ import { Emit, PropSync } from 'vue-property-decorator' import { FirebaseNotification } from './notificationConfig' @Component({ }) -export default class FirebaseEdit extends Vue{ +export default class FirebaseEdit extends Vue { private validForm = false @PropSync('value') private firebaseNotification!: FirebaseNotification @Emit('value') - emitValue () { + emitValue (): FirebaseNotification { return this.firebaseNotification } @Emit('validityChanged') - emitValid () { + emitValid (): boolean { return this.validForm } - formChanged () { + formChanged (): void { this.emitValue() this.emitValid() } - private required (val: string) { + private required (val: string): true | string { return !!val || 'required.' } - } diff --git a/ui/src/pipeline/notifications/NotificationEdit.vue b/ui/src/pipeline/notifications/NotificationEdit.vue index 88ee0b6ef..ade47097e 100644 --- a/ui/src/pipeline/notifications/NotificationEdit.vue +++ b/ui/src/pipeline/notifications/NotificationEdit.vue @@ -38,20 +38,20 @@ @@ -81,7 +81,7 @@ diff --git a/ui/src/pipeline/pipeline.module.ts b/ui/src/pipeline/pipeline.module.ts index d7576c172..d0f91cb19 100644 --- a/ui/src/pipeline/pipeline.module.ts +++ b/ui/src/pipeline/pipeline.module.ts @@ -5,7 +5,6 @@ import NotificationConfig from '@/pipeline/notifications/notificationConfig' @Module({ namespaced: true }) export default class PipelineModule extends VuexModule { - private pipelines: Pipeline[] = [] private selectedPipeline: Pipeline = {} as unknown as Pipeline private isLoadingPipelines = true @@ -43,7 +42,6 @@ export default class PipelineModule extends VuexModule { return await RestService.getPipelineByDatasourceId(datasourceId) } - @Action({ commit: 'setPipelines', rawError: true }) public async createPipeline (pipeline: Pipeline): Promise { await RestService.createPipeline(pipeline) diff --git a/ui/src/pipeline/router.ts b/ui/src/pipeline/router.ts index 75f6fdb36..965355ef3 100644 --- a/ui/src/pipeline/router.ts +++ b/ui/src/pipeline/router.ts @@ -1,5 +1,3 @@ -import DatasourceOverview from './DatasourceOverview.vue' -import DatasourceEdit from './DatasourceEdit.vue' import PipelineOverview from './PipelineOverview.vue' import PipelineEdit from './PipelineEdit.vue' import PipelineNotifications from '@/pipeline/notifications/NotificationOverview.vue' diff --git a/ui/src/storage/PipelineStorageOverview.vue b/ui/src/storage/PipelineStorageOverview.vue index 3c9c1dee1..35452297d 100644 --- a/ui/src/storage/PipelineStorageOverview.vue +++ b/ui/src/storage/PipelineStorageOverview.vue @@ -150,7 +150,7 @@ export default class PipelineStorageOverview extends Vue { return url } - private created () { + private created (): void { this.pipelineId = this.$route.params.storageId this.fetchData(this.pipelineId) } From ceebe2257ba688f0ba0bf0cab00898401c80a184 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20W=C3=A4chtler?= Date: Thu, 25 Jun 2020 14:57:09 +0200 Subject: [PATCH 0628/1168] Add model for datasource parameters --- .../model/DatasourceParameters.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/model/DatasourceParameters.java diff --git a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/model/DatasourceParameters.java b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/model/DatasourceParameters.java new file mode 100644 index 000000000..e47521b2e --- /dev/null +++ b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/model/DatasourceParameters.java @@ -0,0 +1,29 @@ +package org.jvalue.ods.adapterservice.datasource.model; + +import com.fasterxml.jackson.annotation.JsonCreator; + +import java.util.Map; +import java.util.Objects; + +public class DatasourceParameters { + + public final Map parameters; + + @JsonCreator + public DatasourceParameters(Map parameters) { + this.parameters = parameters; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof DatasourceParameters)) return false; + DatasourceParameters that = (DatasourceParameters) o; + return Objects.equals(parameters, that.parameters); + } + + @Override + public int hashCode() { + return Objects.hash(parameters); + } +} From 2e9fdb5dc9d62d12d6cb51bccf4070869de52c9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20W=C3=A4chtler?= Date: Thu, 25 Jun 2020 14:58:22 +0200 Subject: [PATCH 0629/1168] Add method to create adapter configs from datasource --- .../adapterservice/datasource/model/Datasource.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/model/Datasource.java b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/model/Datasource.java index c5ff59c02..e4fefd2fa 100644 --- a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/model/Datasource.java +++ b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/model/Datasource.java @@ -2,6 +2,9 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import org.jvalue.ods.adapterservice.adapter.model.AdapterConfig; +import org.jvalue.ods.adapterservice.adapter.model.FormatConfig; +import org.jvalue.ods.adapterservice.adapter.model.ProtocolConfig; import javax.persistence.*; import javax.validation.constraints.NotNull; @@ -78,6 +81,13 @@ public String toString() { '}'; } + public AdapterConfig toAdapterConfig() { + return new AdapterConfig( + new ProtocolConfig(this.getProtocol().getType(), this.getProtocol().getParameters()), + new FormatConfig(this.getFormat().getType(), this.getFormat().getParameters()) + ); + } + @Override public boolean equals(Object o) { if (this == o) return true; From 461ff3dd3ed42868fafa241f0f49eb0abd43d736 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20W=C3=A4chtler?= Date: Thu, 25 Jun 2020 14:58:52 +0200 Subject: [PATCH 0630/1168] Add trigger endpoint for datasources --- .../rest/v1/DatasourceEndpoint.java | 42 ++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/rest/v1/DatasourceEndpoint.java b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/rest/v1/DatasourceEndpoint.java index 3d978708e..1299f5c9a 100644 --- a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/rest/v1/DatasourceEndpoint.java +++ b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/rest/v1/DatasourceEndpoint.java @@ -1,10 +1,15 @@ package org.jvalue.ods.adapterservice.datasource.rest.v1; +import org.jvalue.ods.adapterservice.adapter.Adapter; +import org.jvalue.ods.adapterservice.adapter.AdapterFactory; +import org.jvalue.ods.adapterservice.adapter.model.DataBlob; import org.jvalue.ods.adapterservice.datasource.DatasourceManager; import org.jvalue.ods.adapterservice.datasource.model.Datasource; +import org.jvalue.ods.adapterservice.datasource.model.DatasourceParameters; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.web.bind.annotation.*; import org.springframework.web.server.ResponseStatusException; import org.springframework.web.servlet.support.ServletUriComponentsBuilder; @@ -18,10 +23,12 @@ public class DatasourceEndpoint { private final DatasourceManager datasourceManager; + private final AdapterFactory adapterFactory; @Autowired - public DatasourceEndpoint(DatasourceManager datasourceManager) { + public DatasourceEndpoint(DatasourceManager datasourceManager, AdapterFactory adapterFactory) { this.datasourceManager = datasourceManager; + this.adapterFactory = adapterFactory; } @GetMapping @@ -72,4 +79,37 @@ public void deleteDatasource(@PathVariable Long id) { public void deleteAllDatasources() { datasourceManager.deleteAllDatasources(); } + + @PostMapping("/{id}/trigger") + public DataBlob.MetaData getData(@PathVariable() Long id, @Valid @RequestBody DatasourceParameters datasourceParameters) { + Datasource datasource = datasourceManager.getDatasource(id) + .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No datasource found with id " + id)); + try { + String url = (String) datasource.getProtocol().getParameters().get("location"); + } catch (Exception e) { + throw new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR, "No baseurl for this datasource"); + } + if (datasourceParameters.parameters != null) { + datasourceParameters.parameters.forEach((k,v) -> { + System.out.println(k); // fill parameters + }); + } + try { + Adapter adapter = adapterFactory.getAdapter(datasource.toAdapterConfig()); + return adapter.executeJob(datasource.toAdapterConfig()); + } catch (Exception e) { + if(e instanceof HttpMessageNotReadableException) { + System.err.println("Data Import request failed. Malformed Request: " + e.getMessage()); + throw e; + } + String location = datasource.toAdapterConfig().protocolConfig.parameters.get("location").toString(); + if(location != null) { + System.err.println("Importing data from " + location + " failed.\n" + + "Reason: " + e.getClass().getName() + ": " + e.getMessage()); + } else { + System.err.println("Data Import failed. Reason: " + e.getClass() + ": " +e.getMessage()); + } + throw new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR); + } + } } From b2256d4efe7bd3a032c6a306ee03bdf74684b9a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20W=C3=A4chtler?= Date: Mon, 29 Jun 2020 14:59:52 +0200 Subject: [PATCH 0631/1168] Add method to fill open parameters of a datasource --- .../datasource/model/Datasource.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/model/Datasource.java b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/model/Datasource.java index e4fefd2fa..54562bffa 100644 --- a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/model/Datasource.java +++ b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/model/Datasource.java @@ -8,6 +8,8 @@ import javax.persistence.*; import javax.validation.constraints.NotNull; +import java.util.HashMap; +import java.util.Map; import java.util.Objects; @Entity @@ -88,6 +90,20 @@ public AdapterConfig toAdapterConfig() { ); } + public Datasource fillQueryParameters(DatasourceParameters datasourceParameters) { + if (datasourceParameters == null || datasourceParameters.parameters == null) { + return this; + } + String url = (String) this.getProtocol().getParameters().get("location"); + for (Map.Entry parameter : datasourceParameters.parameters.entrySet()) { + url = url.replace("{" + parameter.getKey() + "}", parameter.getValue()); + } + HashMap parameters = new HashMap<>(this.getProtocol().getParameters()); + parameters.put("location", url); + DatasourceProtocol protocolConfig = new DatasourceProtocol(this.getProtocol().getType(), parameters); + return new Datasource(protocolConfig, this.format, this.metadata, this.trigger); + } + @Override public boolean equals(Object o) { if (this == o) return true; From ce3fe865c764d750547c3360004230fbf8e942be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20W=C3=A4chtler?= Date: Mon, 29 Jun 2020 15:07:26 +0200 Subject: [PATCH 0632/1168] Add test for filling parameters --- .../datasource/model/DatasourceTest.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/adapter/src/test/java/org/jvalue/ods/adapterservice/datasource/model/DatasourceTest.java b/adapter/src/test/java/org/jvalue/ods/adapterservice/datasource/model/DatasourceTest.java index 4cb546d76..81620f0e0 100644 --- a/adapter/src/test/java/org/jvalue/ods/adapterservice/datasource/model/DatasourceTest.java +++ b/adapter/src/test/java/org/jvalue/ods/adapterservice/datasource/model/DatasourceTest.java @@ -1,5 +1,6 @@ package org.jvalue.ods.adapterservice.datasource.model; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Test; @@ -61,6 +62,18 @@ public void testSerialization() throws ParseException { result.get("protocol").get("parameters").get("location").textValue()); } + @Test + public void testFillQueryParameters() throws ParseException { + Datasource datasource = generateDatasource("HTTP", "JSON", "http://www.the-inder.net/{userId}/{dataId}"); + Map parameters = new HashMap<>(); + parameters.put("userId", "1"); + parameters.put("dataId", "123"); + parameters.put("notAKey", "notAValue"); + DatasourceParameters datasourceParameters = new DatasourceParameters(parameters); + Datasource newDatasource = datasource.fillQueryParameters(datasourceParameters); + assertEquals("http://www.the-inder.net/1/123", newDatasource.getProtocol().getParameters().get("location")); + } + private Datasource generateDatasource(String protocol, String format, String location) throws ParseException { DatasourceProtocol protocolConfig = new DatasourceProtocol(protocol, Map.of("location", location)); DatasourceFormat formatConfig = new DatasourceFormat(format, Map.of()); From e2f73a183d180aa8a0c89b6baf54c47ad5cdfa62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20W=C3=A4chtler?= Date: Mon, 29 Jun 2020 15:11:02 +0200 Subject: [PATCH 0633/1168] Change parameters type --- .../datasource/model/DatasourceParameters.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/model/DatasourceParameters.java b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/model/DatasourceParameters.java index e47521b2e..bddfb6736 100644 --- a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/model/DatasourceParameters.java +++ b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/model/DatasourceParameters.java @@ -1,16 +1,18 @@ package org.jvalue.ods.adapterservice.datasource.model; import com.fasterxml.jackson.annotation.JsonCreator; +import org.springframework.lang.Nullable; import java.util.Map; import java.util.Objects; public class DatasourceParameters { - public final Map parameters; + @Nullable + public final Map parameters; @JsonCreator - public DatasourceParameters(Map parameters) { + public DatasourceParameters(Map parameters) { this.parameters = parameters; } From 55a5a238fe6df95d28f10e3ed1f92b489fb0d641 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20W=C3=A4chtler?= Date: Mon, 29 Jun 2020 15:12:14 +0200 Subject: [PATCH 0634/1168] Add method for trigger a datasource with parameters --- .../datasource/DatasourceManager.java | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/DatasourceManager.java b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/DatasourceManager.java index 4c87b3ef3..69af18024 100644 --- a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/DatasourceManager.java +++ b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/DatasourceManager.java @@ -1,9 +1,13 @@ package org.jvalue.ods.adapterservice.datasource; +import org.jvalue.ods.adapterservice.adapter.Adapter; +import org.jvalue.ods.adapterservice.adapter.AdapterFactory; +import org.jvalue.ods.adapterservice.adapter.model.DataBlob; import org.jvalue.ods.adapterservice.datasource.event.DatasourceEvent; import org.jvalue.ods.adapterservice.datasource.event.EventType; import org.jvalue.ods.adapterservice.datasource.model.Datasource; import org.jvalue.ods.adapterservice.datasource.model.DatasourceMetadata; +import org.jvalue.ods.adapterservice.datasource.model.DatasourceParameters; import org.jvalue.ods.adapterservice.datasource.repository.DatasourceRepository; import org.jvalue.ods.adapterservice.datasource.repository.DatasourceEventRepository; import org.springframework.beans.factory.annotation.Autowired; @@ -18,12 +22,14 @@ public class DatasourceManager { private final DatasourceRepository datasourceRepository; private final DatasourceEventRepository eventRepository; + private final AdapterFactory adapterFactory; @Autowired - public DatasourceManager(DatasourceRepository datasourceRepository, DatasourceEventRepository eventRepository) { + public DatasourceManager(DatasourceRepository datasourceRepository, DatasourceEventRepository eventRepository, AdapterFactory adapterFactory) { this.datasourceRepository = datasourceRepository; this.eventRepository = eventRepository; + this.adapterFactory = adapterFactory; } @@ -75,6 +81,29 @@ public void deleteAllDatasources() { ); } + public Datasource getParametrizedDatasource(Long id, DatasourceParameters datasourceParameters) { + Datasource datasource = getDatasource(id) + .orElseThrow(() -> new IllegalArgumentException("No datasource found with id " + id)); + datasource.fillQueryParameters(datasourceParameters); + return datasource; + } + + public DataBlob.MetaData trigger(Long id, DatasourceParameters datasourceParameters) { + Datasource datasource = getParametrizedDatasource(id, datasourceParameters); + try { + Adapter adapter = adapterFactory.getAdapter(datasource.toAdapterConfig()); + return adapter.executeJob(datasource.toAdapterConfig()); + } catch (Exception e) { + if(e instanceof IllegalArgumentException) { + System.err.println("Data Import request failed. Malformed Request: " + e.getMessage()); + throw e; + } else { + System.err.println("Exception in the Adapter: " + e.getMessage()); + throw e; + } + } + } + /** * Create an updated DatasourceConfig using the full representation of an update. This method ensures that id and creation time remain stable. * From 0ef3c3750ff8a64a425202fc6ec5e5330e4db434 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20W=C3=A4chtler?= Date: Mon, 29 Jun 2020 15:13:08 +0200 Subject: [PATCH 0635/1168] Refactor trigger endpoint --- .../rest/v1/DatasourceEndpoint.java | 34 +++---------------- 1 file changed, 5 insertions(+), 29 deletions(-) diff --git a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/rest/v1/DatasourceEndpoint.java b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/rest/v1/DatasourceEndpoint.java index 1299f5c9a..498a0097d 100644 --- a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/rest/v1/DatasourceEndpoint.java +++ b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/rest/v1/DatasourceEndpoint.java @@ -9,7 +9,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.web.bind.annotation.*; import org.springframework.web.server.ResponseStatusException; import org.springframework.web.servlet.support.ServletUriComponentsBuilder; @@ -81,35 +80,12 @@ public void deleteAllDatasources() { } @PostMapping("/{id}/trigger") - public DataBlob.MetaData getData(@PathVariable() Long id, @Valid @RequestBody DatasourceParameters datasourceParameters) { - Datasource datasource = datasourceManager.getDatasource(id) - .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No datasource found with id " + id)); + public DataBlob.MetaData getData(@PathVariable() Long id, + @Valid @RequestBody DatasourceParameters datasourceParameters) { try { - String url = (String) datasource.getProtocol().getParameters().get("location"); - } catch (Exception e) { - throw new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR, "No baseurl for this datasource"); - } - if (datasourceParameters.parameters != null) { - datasourceParameters.parameters.forEach((k,v) -> { - System.out.println(k); // fill parameters - }); - } - try { - Adapter adapter = adapterFactory.getAdapter(datasource.toAdapterConfig()); - return adapter.executeJob(datasource.toAdapterConfig()); - } catch (Exception e) { - if(e instanceof HttpMessageNotReadableException) { - System.err.println("Data Import request failed. Malformed Request: " + e.getMessage()); - throw e; - } - String location = datasource.toAdapterConfig().protocolConfig.parameters.get("location").toString(); - if(location != null) { - System.err.println("Importing data from " + location + " failed.\n" + - "Reason: " + e.getClass().getName() + ": " + e.getMessage()); - } else { - System.err.println("Data Import failed. Reason: " + e.getClass() + ": " +e.getMessage()); - } - throw new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR); + return datasourceManager.trigger(id, datasourceParameters); + } catch (IllegalArgumentException e) { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "No valid Datasource for id "+ id); } } } From 0b33c66f0c27b738ece44d39e4b2512e1e5a1708 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20W=C3=A4chtler?= Date: Mon, 29 Jun 2020 15:23:11 +0200 Subject: [PATCH 0636/1168] Add documentation of trigger endpoint --- adapter/README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/adapter/README.md b/adapter/README.md index 55d63aeec..9703b2c66 100644 --- a/adapter/README.md +++ b/adapter/README.md @@ -94,6 +94,7 @@ When started via docker-compose *base_url* is `http://localhost:9000/api/adapter | *base_url*/datasources/events/${id} | GET | - | DatasourceEvent with {{id}} | *base_url*/datasources/events?datasourceId={datasourceId}&after={eventId} | GET | - | Array of DatasourceEvents after {{eventId}}; {{datasourceId}} optional, limits to specific datasource | | *base_url*/datasources/events/latest | GET | - | The latest DatasourceEvent | +| *base_url*/datasources/${id}/trigger | POST | Parameters | Adapter ImportResponse | When started via docker-compose *base_url* is `http://localhost:9000/api/adapter` @@ -166,3 +167,10 @@ When started via docker-compose *base_url* is `http://localhost:9000/api/adapter "datasourceId": number } ``` + +### Parameters +``` +{ + "parameters": < for open parameter to replace with the value>> +} +``` From 005af80bad05ab3adae33d04114c48b4321170fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20W=C3=A4chtler?= Date: Tue, 30 Jun 2020 07:35:07 +0200 Subject: [PATCH 0637/1168] Remove unnecessary field --- .../datasource/rest/v1/DatasourceEndpoint.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/rest/v1/DatasourceEndpoint.java b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/rest/v1/DatasourceEndpoint.java index 498a0097d..a212f669f 100644 --- a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/rest/v1/DatasourceEndpoint.java +++ b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/rest/v1/DatasourceEndpoint.java @@ -1,7 +1,5 @@ package org.jvalue.ods.adapterservice.datasource.rest.v1; -import org.jvalue.ods.adapterservice.adapter.Adapter; -import org.jvalue.ods.adapterservice.adapter.AdapterFactory; import org.jvalue.ods.adapterservice.adapter.model.DataBlob; import org.jvalue.ods.adapterservice.datasource.DatasourceManager; import org.jvalue.ods.adapterservice.datasource.model.Datasource; @@ -22,12 +20,10 @@ public class DatasourceEndpoint { private final DatasourceManager datasourceManager; - private final AdapterFactory adapterFactory; @Autowired - public DatasourceEndpoint(DatasourceManager datasourceManager, AdapterFactory adapterFactory) { + public DatasourceEndpoint(DatasourceManager datasourceManager) { this.datasourceManager = datasourceManager; - this.adapterFactory = adapterFactory; } @GetMapping From afd4131794e6ed093a6752058b596ed077f0d2c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20W=C3=A4chtler?= Date: Tue, 30 Jun 2020 07:38:46 +0200 Subject: [PATCH 0638/1168] Add toString method for datasource parameters --- .../datasource/model/DatasourceParameters.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/model/DatasourceParameters.java b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/model/DatasourceParameters.java index bddfb6736..92fdc7c93 100644 --- a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/model/DatasourceParameters.java +++ b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/model/DatasourceParameters.java @@ -16,6 +16,13 @@ public DatasourceParameters(Map parameters) { this.parameters = parameters; } + @Override + public String toString() { + return "DatasourceParameters{" + + "parameters=" + parameters + + '}'; + } + @Override public boolean equals(Object o) { if (this == o) return true; From 9da9444bf723f3700c769e65ddce1ba0fe086e8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20W=C3=A4chtler?= Date: Tue, 30 Jun 2020 11:52:55 +0200 Subject: [PATCH 0639/1168] Rename DatasourceParameters to RuntimeParameters --- .../adapterservice/datasource/DatasourceManager.java | 10 +++++----- .../adapterservice/datasource/model/Datasource.java | 6 +++--- ...atasourceParameters.java => RuntimeParameters.java} | 8 ++++---- .../datasource/rest/v1/DatasourceEndpoint.java | 6 +++--- .../datasource/model/DatasourceTest.java | 4 ++-- 5 files changed, 17 insertions(+), 17 deletions(-) rename adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/model/{DatasourceParameters.java => RuntimeParameters.java} (75%) diff --git a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/DatasourceManager.java b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/DatasourceManager.java index 69af18024..85bdd8f2d 100644 --- a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/DatasourceManager.java +++ b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/DatasourceManager.java @@ -7,7 +7,7 @@ import org.jvalue.ods.adapterservice.datasource.event.EventType; import org.jvalue.ods.adapterservice.datasource.model.Datasource; import org.jvalue.ods.adapterservice.datasource.model.DatasourceMetadata; -import org.jvalue.ods.adapterservice.datasource.model.DatasourceParameters; +import org.jvalue.ods.adapterservice.datasource.model.RuntimeParameters; import org.jvalue.ods.adapterservice.datasource.repository.DatasourceRepository; import org.jvalue.ods.adapterservice.datasource.repository.DatasourceEventRepository; import org.springframework.beans.factory.annotation.Autowired; @@ -81,15 +81,15 @@ public void deleteAllDatasources() { ); } - public Datasource getParametrizedDatasource(Long id, DatasourceParameters datasourceParameters) { + public Datasource getParametrizedDatasource(Long id, RuntimeParameters runtimeParameters) { Datasource datasource = getDatasource(id) .orElseThrow(() -> new IllegalArgumentException("No datasource found with id " + id)); - datasource.fillQueryParameters(datasourceParameters); + datasource.fillQueryParameters(runtimeParameters); return datasource; } - public DataBlob.MetaData trigger(Long id, DatasourceParameters datasourceParameters) { - Datasource datasource = getParametrizedDatasource(id, datasourceParameters); + public DataBlob.MetaData trigger(Long id, RuntimeParameters runtimeParameters) { + Datasource datasource = getParametrizedDatasource(id, runtimeParameters); try { Adapter adapter = adapterFactory.getAdapter(datasource.toAdapterConfig()); return adapter.executeJob(datasource.toAdapterConfig()); diff --git a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/model/Datasource.java b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/model/Datasource.java index 54562bffa..327b955da 100644 --- a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/model/Datasource.java +++ b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/model/Datasource.java @@ -90,12 +90,12 @@ public AdapterConfig toAdapterConfig() { ); } - public Datasource fillQueryParameters(DatasourceParameters datasourceParameters) { - if (datasourceParameters == null || datasourceParameters.parameters == null) { + public Datasource fillQueryParameters(RuntimeParameters runtimeParameters) { + if (runtimeParameters == null || runtimeParameters.parameters == null) { return this; } String url = (String) this.getProtocol().getParameters().get("location"); - for (Map.Entry parameter : datasourceParameters.parameters.entrySet()) { + for (Map.Entry parameter : runtimeParameters.parameters.entrySet()) { url = url.replace("{" + parameter.getKey() + "}", parameter.getValue()); } HashMap parameters = new HashMap<>(this.getProtocol().getParameters()); diff --git a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/model/DatasourceParameters.java b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/model/RuntimeParameters.java similarity index 75% rename from adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/model/DatasourceParameters.java rename to adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/model/RuntimeParameters.java index 92fdc7c93..e7ff90a5d 100644 --- a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/model/DatasourceParameters.java +++ b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/model/RuntimeParameters.java @@ -6,13 +6,13 @@ import java.util.Map; import java.util.Objects; -public class DatasourceParameters { +public class RuntimeParameters { @Nullable public final Map parameters; @JsonCreator - public DatasourceParameters(Map parameters) { + public RuntimeParameters(Map parameters) { this.parameters = parameters; } @@ -26,8 +26,8 @@ public String toString() { @Override public boolean equals(Object o) { if (this == o) return true; - if (!(o instanceof DatasourceParameters)) return false; - DatasourceParameters that = (DatasourceParameters) o; + if (!(o instanceof RuntimeParameters)) return false; + RuntimeParameters that = (RuntimeParameters) o; return Objects.equals(parameters, that.parameters); } diff --git a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/rest/v1/DatasourceEndpoint.java b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/rest/v1/DatasourceEndpoint.java index a212f669f..28e0ca06f 100644 --- a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/rest/v1/DatasourceEndpoint.java +++ b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/rest/v1/DatasourceEndpoint.java @@ -3,7 +3,7 @@ import org.jvalue.ods.adapterservice.adapter.model.DataBlob; import org.jvalue.ods.adapterservice.datasource.DatasourceManager; import org.jvalue.ods.adapterservice.datasource.model.Datasource; -import org.jvalue.ods.adapterservice.datasource.model.DatasourceParameters; +import org.jvalue.ods.adapterservice.datasource.model.RuntimeParameters; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -77,9 +77,9 @@ public void deleteAllDatasources() { @PostMapping("/{id}/trigger") public DataBlob.MetaData getData(@PathVariable() Long id, - @Valid @RequestBody DatasourceParameters datasourceParameters) { + @Valid @RequestBody RuntimeParameters runtimeParameters) { try { - return datasourceManager.trigger(id, datasourceParameters); + return datasourceManager.trigger(id, runtimeParameters); } catch (IllegalArgumentException e) { throw new ResponseStatusException(HttpStatus.NOT_FOUND, "No valid Datasource for id "+ id); } diff --git a/adapter/src/test/java/org/jvalue/ods/adapterservice/datasource/model/DatasourceTest.java b/adapter/src/test/java/org/jvalue/ods/adapterservice/datasource/model/DatasourceTest.java index 81620f0e0..7fdf9775e 100644 --- a/adapter/src/test/java/org/jvalue/ods/adapterservice/datasource/model/DatasourceTest.java +++ b/adapter/src/test/java/org/jvalue/ods/adapterservice/datasource/model/DatasourceTest.java @@ -69,8 +69,8 @@ public void testFillQueryParameters() throws ParseException { parameters.put("userId", "1"); parameters.put("dataId", "123"); parameters.put("notAKey", "notAValue"); - DatasourceParameters datasourceParameters = new DatasourceParameters(parameters); - Datasource newDatasource = datasource.fillQueryParameters(datasourceParameters); + RuntimeParameters runtimeParameters = new RuntimeParameters(parameters); + Datasource newDatasource = datasource.fillQueryParameters(runtimeParameters); assertEquals("http://www.the-inder.net/1/123", newDatasource.getProtocol().getParameters().get("location")); } From bc01c70ca0342dc3c56f627263ccc8c81f25c2b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20W=C3=A4chtler?= Date: Tue, 30 Jun 2020 12:00:32 +0200 Subject: [PATCH 0640/1168] Remove unused import --- .../ods/adapterservice/datasource/model/DatasourceTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/adapter/src/test/java/org/jvalue/ods/adapterservice/datasource/model/DatasourceTest.java b/adapter/src/test/java/org/jvalue/ods/adapterservice/datasource/model/DatasourceTest.java index 7fdf9775e..29559b581 100644 --- a/adapter/src/test/java/org/jvalue/ods/adapterservice/datasource/model/DatasourceTest.java +++ b/adapter/src/test/java/org/jvalue/ods/adapterservice/datasource/model/DatasourceTest.java @@ -1,6 +1,5 @@ package org.jvalue.ods.adapterservice.datasource.model; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Test; From 759f4cf72bace87e2ecb6d9e3ccfd6a11d0c0a1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20W=C3=A4chtler?= Date: Tue, 30 Jun 2020 15:59:52 +0200 Subject: [PATCH 0641/1168] Refactor toAdapterConfig --- .../datasource/DatasourceManager.java | 12 ++++++------ .../datasource/model/Datasource.java | 14 +++++++------- .../datasource/model/DatasourceTest.java | 7 +++++-- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/DatasourceManager.java b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/DatasourceManager.java index 85bdd8f2d..ae801f16d 100644 --- a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/DatasourceManager.java +++ b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/DatasourceManager.java @@ -2,6 +2,7 @@ import org.jvalue.ods.adapterservice.adapter.Adapter; import org.jvalue.ods.adapterservice.adapter.AdapterFactory; +import org.jvalue.ods.adapterservice.adapter.model.AdapterConfig; import org.jvalue.ods.adapterservice.adapter.model.DataBlob; import org.jvalue.ods.adapterservice.datasource.event.DatasourceEvent; import org.jvalue.ods.adapterservice.datasource.event.EventType; @@ -81,18 +82,17 @@ public void deleteAllDatasources() { ); } - public Datasource getParametrizedDatasource(Long id, RuntimeParameters runtimeParameters) { + private AdapterConfig getParametrizedDatasource(Long id, RuntimeParameters runtimeParameters) { Datasource datasource = getDatasource(id) .orElseThrow(() -> new IllegalArgumentException("No datasource found with id " + id)); - datasource.fillQueryParameters(runtimeParameters); - return datasource; + return datasource.toAdapterConfig(runtimeParameters); } public DataBlob.MetaData trigger(Long id, RuntimeParameters runtimeParameters) { - Datasource datasource = getParametrizedDatasource(id, runtimeParameters); + AdapterConfig adapterConfig = getParametrizedDatasource(id, runtimeParameters); try { - Adapter adapter = adapterFactory.getAdapter(datasource.toAdapterConfig()); - return adapter.executeJob(datasource.toAdapterConfig()); + Adapter adapter = adapterFactory.getAdapter(adapterConfig); + return adapter.executeJob(adapterConfig); } catch (Exception e) { if(e instanceof IllegalArgumentException) { System.err.println("Data Import request failed. Malformed Request: " + e.getMessage()); diff --git a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/model/Datasource.java b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/model/Datasource.java index 327b955da..aa44d53d0 100644 --- a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/model/Datasource.java +++ b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/model/Datasource.java @@ -83,16 +83,17 @@ public String toString() { '}'; } - public AdapterConfig toAdapterConfig() { + public AdapterConfig toAdapterConfig(RuntimeParameters runtimeParameters) { + DatasourceProtocol datasourceProtocol = fillQueryParameters(runtimeParameters); return new AdapterConfig( - new ProtocolConfig(this.getProtocol().getType(), this.getProtocol().getParameters()), + new ProtocolConfig(this.getProtocol().getType(), datasourceProtocol.getParameters()), new FormatConfig(this.getFormat().getType(), this.getFormat().getParameters()) ); } - public Datasource fillQueryParameters(RuntimeParameters runtimeParameters) { - if (runtimeParameters == null || runtimeParameters.parameters == null) { - return this; + protected DatasourceProtocol fillQueryParameters(RuntimeParameters runtimeParameters) { + if (runtimeParameters == null || runtimeParameters.parameters == null || !this.getProtocol().getType().equals("HTTP")) { + return this.getProtocol(); } String url = (String) this.getProtocol().getParameters().get("location"); for (Map.Entry parameter : runtimeParameters.parameters.entrySet()) { @@ -100,8 +101,7 @@ public Datasource fillQueryParameters(RuntimeParameters runtimeParameters) { } HashMap parameters = new HashMap<>(this.getProtocol().getParameters()); parameters.put("location", url); - DatasourceProtocol protocolConfig = new DatasourceProtocol(this.getProtocol().getType(), parameters); - return new Datasource(protocolConfig, this.format, this.metadata, this.trigger); + return new DatasourceProtocol(this.getProtocol().getType(), parameters); } @Override diff --git a/adapter/src/test/java/org/jvalue/ods/adapterservice/datasource/model/DatasourceTest.java b/adapter/src/test/java/org/jvalue/ods/adapterservice/datasource/model/DatasourceTest.java index 29559b581..626cfcdb8 100644 --- a/adapter/src/test/java/org/jvalue/ods/adapterservice/datasource/model/DatasourceTest.java +++ b/adapter/src/test/java/org/jvalue/ods/adapterservice/datasource/model/DatasourceTest.java @@ -3,6 +3,9 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Test; +import org.jvalue.ods.adapterservice.adapter.model.AdapterConfig; +import org.jvalue.ods.adapterservice.adapter.model.FormatConfig; +import org.jvalue.ods.adapterservice.adapter.model.ProtocolConfig; import org.springframework.format.datetime.DateFormatter; import java.io.File; @@ -69,8 +72,8 @@ public void testFillQueryParameters() throws ParseException { parameters.put("dataId", "123"); parameters.put("notAKey", "notAValue"); RuntimeParameters runtimeParameters = new RuntimeParameters(parameters); - Datasource newDatasource = datasource.fillQueryParameters(runtimeParameters); - assertEquals("http://www.the-inder.net/1/123", newDatasource.getProtocol().getParameters().get("location")); + DatasourceProtocol datasourceProtocol = datasource.fillQueryParameters(runtimeParameters); + assertEquals("http://www.the-inder.net/1/123", datasourceProtocol.getParameters().get("location")); } private Datasource generateDatasource(String protocol, String format, String location) throws ParseException { From 901c04700156ded4b5775287386c9c837acd1e88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20W=C3=A4chtler?= Date: Tue, 30 Jun 2020 16:00:19 +0200 Subject: [PATCH 0642/1168] Add test for toAdapterConfig --- .../datasource/model/DatasourceTest.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/adapter/src/test/java/org/jvalue/ods/adapterservice/datasource/model/DatasourceTest.java b/adapter/src/test/java/org/jvalue/ods/adapterservice/datasource/model/DatasourceTest.java index 626cfcdb8..d8ab0d7f5 100644 --- a/adapter/src/test/java/org/jvalue/ods/adapterservice/datasource/model/DatasourceTest.java +++ b/adapter/src/test/java/org/jvalue/ods/adapterservice/datasource/model/DatasourceTest.java @@ -76,6 +76,23 @@ public void testFillQueryParameters() throws ParseException { assertEquals("http://www.the-inder.net/1/123", datasourceProtocol.getParameters().get("location")); } + @Test + public void testToAdapterConfig() throws ParseException { + Datasource datasource = generateDatasource("HTTP", "JSON", "http://www.the-inder.net/{userId}/{dataId}"); + Map parameters = new HashMap<>(); + parameters.put("userId", "1"); + parameters.put("dataId", "123"); + parameters.put("notAKey", "notAValue"); + RuntimeParameters runtimeParameters = new RuntimeParameters(parameters); + AdapterConfig adapterConfig = datasource.toAdapterConfig(runtimeParameters); + System.out.println(adapterConfig); + AdapterConfig testAgainst = new AdapterConfig( + new ProtocolConfig("HTTP", Map.of("location", "http://www.the-inder.net/1/123")), + new FormatConfig("JSON", Map.of()) + ); + assertEquals(testAgainst, adapterConfig); + } + private Datasource generateDatasource(String protocol, String format, String location) throws ParseException { DatasourceProtocol protocolConfig = new DatasourceProtocol(protocol, Map.of("location", location)); DatasourceFormat formatConfig = new DatasourceFormat(format, Map.of()); From ec09676aca1e5ec1d871ea6a22c66dd67065e0aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20W=C3=A4chtler?= Date: Wed, 1 Jul 2020 08:16:10 +0200 Subject: [PATCH 0643/1168] Rename class in toString method --- .../ods/adapterservice/datasource/model/RuntimeParameters.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/model/RuntimeParameters.java b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/model/RuntimeParameters.java index e7ff90a5d..1fd640b22 100644 --- a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/model/RuntimeParameters.java +++ b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/model/RuntimeParameters.java @@ -18,7 +18,7 @@ public RuntimeParameters(Map parameters) { @Override public String toString() { - return "DatasourceParameters{" + + return "RuntimeParameters{" + "parameters=" + parameters + '}'; } From 76aaf68ac73925368a1ce925c77ed0cf04ec4dd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20W=C3=A4chtler?= Date: Wed, 1 Jul 2020 09:02:20 +0200 Subject: [PATCH 0644/1168] Remove commandline output --- .../ods/adapterservice/datasource/model/DatasourceTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/adapter/src/test/java/org/jvalue/ods/adapterservice/datasource/model/DatasourceTest.java b/adapter/src/test/java/org/jvalue/ods/adapterservice/datasource/model/DatasourceTest.java index d8ab0d7f5..8abad3322 100644 --- a/adapter/src/test/java/org/jvalue/ods/adapterservice/datasource/model/DatasourceTest.java +++ b/adapter/src/test/java/org/jvalue/ods/adapterservice/datasource/model/DatasourceTest.java @@ -85,7 +85,6 @@ public void testToAdapterConfig() throws ParseException { parameters.put("notAKey", "notAValue"); RuntimeParameters runtimeParameters = new RuntimeParameters(parameters); AdapterConfig adapterConfig = datasource.toAdapterConfig(runtimeParameters); - System.out.println(adapterConfig); AdapterConfig testAgainst = new AdapterConfig( new ProtocolConfig("HTTP", Map.of("location", "http://www.the-inder.net/1/123")), new FormatConfig("JSON", Map.of()) From c8463e813ef90787a58da7597698b61be6a0743c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20W=C3=A4chtler?= Date: Thu, 2 Jul 2020 11:31:00 +0200 Subject: [PATCH 0645/1168] Add dynamic mock endpoint --- adapter/integration-test/src/mock.server.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/adapter/integration-test/src/mock.server.js b/adapter/integration-test/src/mock.server.js index 1dffa64ed..1fe8ac2f3 100644 --- a/adapter/integration-test/src/mock.server.js +++ b/adapter/integration-test/src/mock.server.js @@ -14,6 +14,11 @@ router.get('/json', async ctx => { ctx.body = { whateverwillbe: 'willbe', quesera: 'sera' } }) +router.get('/json/:id', async ctx => { + console.log('Get /json/' + ctx.params.id) + ctx.body = { id: ctx.params.id } +}) + router.get('/xml', async ctx => { console.log('GET /xml') From dfda51604fae9b6f390d5fb1a8e9c95e8b62bdeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20W=C3=A4chtler?= Date: Thu, 2 Jul 2020 11:33:13 +0200 Subject: [PATCH 0646/1168] Add test for trigger endpoint --- .../src/adapter-datasource.test.js | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/adapter/integration-test/src/adapter-datasource.test.js b/adapter/integration-test/src/adapter-datasource.test.js index df9a72e10..2479f691b 100644 --- a/adapter/integration-test/src/adapter-datasource.test.js +++ b/adapter/integration-test/src/adapter-datasource.test.js @@ -2,6 +2,9 @@ const request = require('supertest') const waitOn = require('wait-on') const URL = process.env.ADAPTER_API || 'http://localhost:9000/api/adapter' +const MOCK_SERVER_PORT = process.env.MOCK_SERVER_PORT || 8081 +const MOCK_SERVER_HOST = process.env.MOCK_SERVER_HOST || 'localhost' +const MOCK_SERVER_URL = 'http://' + MOCK_SERVER_HOST + ':' + MOCK_SERVER_PORT describe('Adapter Configuration', () => { console.log('Adapter-Service URL= ' + URL) @@ -184,6 +187,33 @@ describe('Adapter Configuration', () => { }) }) +test('POST datasources/{id}/trigger', async () => { + const datasourceResponse = await request(URL) + .post('/datasources') + .send(dynamicDatasourceConfig) + const datasourceId = datasourceResponse.body.id + + const dataMetaData = await request(URL) + .post('/datasources/' + datasourceId + '/trigger') + .send(runtimeParameters) + + const id = dataMetaData.body.id + const data = await request(URL) + .get('/data/' + id) + .send() + + const delResponse = await request(URL) + .delete('/datasources/') + .send() + + expect(delResponse.status).toEqual(204) + expect(dataMetaData.status).toEqual(200) + expect(dataMetaData.body.id).toBeGreaterThanOrEqual(0) + expect(dataMetaData.body.location).toEqual('/data/' + id) + expect(data.status).toEqual(200) + expect(data.body.id).toBe(runtimeParameters.parameters.id) +}) + const datasourceConfig = { id: 12345, protocol: { @@ -208,3 +238,35 @@ const datasourceConfig = { description: 'integraiton testing datasources' } } + +const dynamicDatasourceConfig = { + id: 54321, + protocol: { + type: 'HTTP', + parameters: { + location: MOCK_SERVER_URL + '/json/{id}', + encoding: 'UTF-8' + } + }, + format: { + type: 'JSON', + parameters: {} + }, + trigger: { + firstExecution: '1905-12-01T02:30:00.123Z', + periodic: false, + interval: 50000 + }, + metadata: { + author: 'icke', + license: 'none', + displayName: 'test datasource 2', + description: 'integration testing dynamic datasources' + } +} + +const runtimeParameters = { + parameters: { + id: '2' + } +} From 8d30507ea289fafb4b5d4f3ec0c610719c86085a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20W=C3=A4chtler?= Date: Thu, 2 Jul 2020 11:38:01 +0200 Subject: [PATCH 0647/1168] Remove braces --- .../adapterservice/datasource/rest/v1/DatasourceEndpoint.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/rest/v1/DatasourceEndpoint.java b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/rest/v1/DatasourceEndpoint.java index 28e0ca06f..3fe78f4af 100644 --- a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/rest/v1/DatasourceEndpoint.java +++ b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/rest/v1/DatasourceEndpoint.java @@ -76,7 +76,7 @@ public void deleteAllDatasources() { } @PostMapping("/{id}/trigger") - public DataBlob.MetaData getData(@PathVariable() Long id, + public DataBlob.MetaData getData(@PathVariable Long id, @Valid @RequestBody RuntimeParameters runtimeParameters) { try { return datasourceManager.trigger(id, runtimeParameters); From 921db98eaa448f0d4c3a440efc1eab58295e22fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20W=C3=A4chtler?= Date: Thu, 2 Jul 2020 12:42:37 +0200 Subject: [PATCH 0648/1168] Add test for triggering not dynamic datasources --- .../src/adapter-datasource.test.js | 69 +++++++++++++++---- 1 file changed, 57 insertions(+), 12 deletions(-) diff --git a/adapter/integration-test/src/adapter-datasource.test.js b/adapter/integration-test/src/adapter-datasource.test.js index 2479f691b..155765888 100644 --- a/adapter/integration-test/src/adapter-datasource.test.js +++ b/adapter/integration-test/src/adapter-datasource.test.js @@ -188,18 +188,32 @@ describe('Adapter Configuration', () => { }) test('POST datasources/{id}/trigger', async () => { - const datasourceResponse = await request(URL) + const dynamicDatasourceResponse = await request(URL) .post('/datasources') .send(dynamicDatasourceConfig) - const datasourceId = datasourceResponse.body.id + const dynDatasourceId = dynamicDatasourceResponse.body.id - const dataMetaData = await request(URL) - .post('/datasources/' + datasourceId + '/trigger') + const dynamicDataMetaData = await request(URL) + .post('/datasources/' + dynDatasourceId + '/trigger') .send(runtimeParameters) - const id = dataMetaData.body.id - const data = await request(URL) - .get('/data/' + id) + const dynId = dynamicDataMetaData.body.id + const dynData = await request(URL) + .get('/data/' + dynId) + .send() + + const normalDatasourceResponse = await request(URL) + .post('/datasources') + .send(notDynamicDatasourceConfig) + const normalDatasourceId = normalDatasourceResponse.body.id + + const normalDataMetaData = await request(URL) + .post('/datasources/' + normalDatasourceId + '/trigger') + .send(null) + + const normalId = normalDataMetaData.body.id + const normalData = await request(URL) + .get('/data/' + normalId) .send() const delResponse = await request(URL) @@ -207,11 +221,16 @@ test('POST datasources/{id}/trigger', async () => { .send() expect(delResponse.status).toEqual(204) - expect(dataMetaData.status).toEqual(200) - expect(dataMetaData.body.id).toBeGreaterThanOrEqual(0) - expect(dataMetaData.body.location).toEqual('/data/' + id) - expect(data.status).toEqual(200) - expect(data.body.id).toBe(runtimeParameters.parameters.id) + expect(dynamicDataMetaData.status).toEqual(200) + expect(dynamicDataMetaData.body.id).toBeGreaterThanOrEqual(0) + expect(dynamicDataMetaData.body.location).toEqual('/data/' + dynId) + expect(dynData.status).toEqual(200) + expect(dynData.body.id).toBe(runtimeParameters.parameters.id) + expect(normalDataMetaData.status).toEqual(200) + expect(normalDataMetaData.body.id).toBeGreaterThanOrEqual(0) + expect(normalDataMetaData.body.location).toEqual('/data/' + normalId) + expect(normalData.status).toEqual(200) + expect(normalData.body.id).toBe('1') }) const datasourceConfig = { @@ -265,6 +284,32 @@ const dynamicDatasourceConfig = { } } +const notDynamicDatasourceConfig = { + id: -1, + protocol: { + type: 'HTTP', + parameters: { + location: MOCK_SERVER_URL + '/json/1', + encoding: 'UTF-8' + } + }, + format: { + type: 'JSON', + parameters: {} + }, + trigger: { + firstExecution: '1905-12-01T02:30:00.123Z', + periodic: false, + interval: 50000 + }, + metadata: { + author: 'icke', + license: 'none', + displayName: 'test datasource 2', + description: 'integration testing dynamic datasources' + } +} + const runtimeParameters = { parameters: { id: '2' From 5956126d92a5a1dd984cfc38b23c4a8220180521 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20W=C3=A4chtler?= Date: Thu, 2 Jul 2020 12:45:08 +0200 Subject: [PATCH 0649/1168] Change trigger post body to optional --- .../adapterservice/datasource/rest/v1/DatasourceEndpoint.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/rest/v1/DatasourceEndpoint.java b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/rest/v1/DatasourceEndpoint.java index 3fe78f4af..3293abb3c 100644 --- a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/rest/v1/DatasourceEndpoint.java +++ b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/rest/v1/DatasourceEndpoint.java @@ -77,7 +77,7 @@ public void deleteAllDatasources() { @PostMapping("/{id}/trigger") public DataBlob.MetaData getData(@PathVariable Long id, - @Valid @RequestBody RuntimeParameters runtimeParameters) { + @Valid @RequestBody (required = false) RuntimeParameters runtimeParameters) { try { return datasourceManager.trigger(id, runtimeParameters); } catch (IllegalArgumentException e) { From 5b42dee9e167f2491792f3f3411aa3db59da0e5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20W=C3=A4chtler?= Date: Thu, 2 Jul 2020 15:29:22 +0200 Subject: [PATCH 0650/1168] Use template literals for string concatenation --- .../integration-test/src/adapter-datasource.test.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/adapter/integration-test/src/adapter-datasource.test.js b/adapter/integration-test/src/adapter-datasource.test.js index 155765888..0d01ab152 100644 --- a/adapter/integration-test/src/adapter-datasource.test.js +++ b/adapter/integration-test/src/adapter-datasource.test.js @@ -194,12 +194,12 @@ test('POST datasources/{id}/trigger', async () => { const dynDatasourceId = dynamicDatasourceResponse.body.id const dynamicDataMetaData = await request(URL) - .post('/datasources/' + dynDatasourceId + '/trigger') + .post(`/datasources/${dynDatasourceId}/trigger`) .send(runtimeParameters) const dynId = dynamicDataMetaData.body.id const dynData = await request(URL) - .get('/data/' + dynId) + .get(`/data/${dynId}`) .send() const normalDatasourceResponse = await request(URL) @@ -208,12 +208,12 @@ test('POST datasources/{id}/trigger', async () => { const normalDatasourceId = normalDatasourceResponse.body.id const normalDataMetaData = await request(URL) - .post('/datasources/' + normalDatasourceId + '/trigger') + .post(`/datasources/${normalDatasourceId}/trigger`) .send(null) const normalId = normalDataMetaData.body.id const normalData = await request(URL) - .get('/data/' + normalId) + .get(`/data/${normalId}`) .send() const delResponse = await request(URL) @@ -223,12 +223,12 @@ test('POST datasources/{id}/trigger', async () => { expect(delResponse.status).toEqual(204) expect(dynamicDataMetaData.status).toEqual(200) expect(dynamicDataMetaData.body.id).toBeGreaterThanOrEqual(0) - expect(dynamicDataMetaData.body.location).toEqual('/data/' + dynId) + expect(dynamicDataMetaData.body.location).toEqual(`/data/${dynId}`) expect(dynData.status).toEqual(200) expect(dynData.body.id).toBe(runtimeParameters.parameters.id) expect(normalDataMetaData.status).toEqual(200) expect(normalDataMetaData.body.id).toBeGreaterThanOrEqual(0) - expect(normalDataMetaData.body.location).toEqual('/data/' + normalId) + expect(normalDataMetaData.body.location).toEqual(`/data/${normalId}`) expect(normalData.status).toEqual(200) expect(normalData.body.id).toBe('1') }) From c59857d4fd8b3fdc510ed527e0cf7e561025c0fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20W=C3=A4chtler?= Date: Thu, 2 Jul 2020 17:37:55 +0200 Subject: [PATCH 0651/1168] Add check if mock server and rabbitmq is online --- adapter/integration-test/src/adapter-datasource.test.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/adapter/integration-test/src/adapter-datasource.test.js b/adapter/integration-test/src/adapter-datasource.test.js index 0d01ab152..c06ae4bb3 100644 --- a/adapter/integration-test/src/adapter-datasource.test.js +++ b/adapter/integration-test/src/adapter-datasource.test.js @@ -5,6 +5,7 @@ const URL = process.env.ADAPTER_API || 'http://localhost:9000/api/adapter' const MOCK_SERVER_PORT = process.env.MOCK_SERVER_PORT || 8081 const MOCK_SERVER_HOST = process.env.MOCK_SERVER_HOST || 'localhost' const MOCK_SERVER_URL = 'http://' + MOCK_SERVER_HOST + ':' + MOCK_SERVER_PORT +const RABBIT_URL = `http://${process.env.RABBIT_HOST}:15672` describe('Adapter Configuration', () => { console.log('Adapter-Service URL= ' + URL) @@ -13,8 +14,12 @@ describe('Adapter Configuration', () => { try { const pingUrl = URL + '/version' console.log('Waiting for service with URL: ' + pingUrl) - await waitOn({ resources: [pingUrl], timeout: 50000 }) + console.log('Waiting for service with URL: ' + MOCK_SERVER_URL) + console.log('Waiting for service with URL: ' + RABBIT_URL) + await waitOn({ resources: [pingUrl, MOCK_SERVER_URL, RABBIT_URL], timeout: 50000 }) console.log('[online] Service with URL: ' + pingUrl) + console.log('[online] Service with URL: ' + MOCK_SERVER_URL) + console.log('[online] Service with URL: ' + RABBIT_URL) } catch (err) { process.exit(1) } From 3dd921dc4fda7590e1e59cfdaf5d5932de95977c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20W=C3=A4chtler?= Date: Thu, 2 Jul 2020 18:09:07 +0200 Subject: [PATCH 0652/1168] Split trigger test case in dynamic and static part --- .../src/adapter-datasource.test.js | 57 +++++++++++-------- 1 file changed, 33 insertions(+), 24 deletions(-) diff --git a/adapter/integration-test/src/adapter-datasource.test.js b/adapter/integration-test/src/adapter-datasource.test.js index c06ae4bb3..5d2b820df 100644 --- a/adapter/integration-test/src/adapter-datasource.test.js +++ b/adapter/integration-test/src/adapter-datasource.test.js @@ -192,33 +192,47 @@ describe('Adapter Configuration', () => { }) }) -test('POST datasources/{id}/trigger', async () => { - const dynamicDatasourceResponse = await request(URL) +test('POST datasources/{id}/trigger dynamic', async () => { + const datasourceResponse = await request(URL) .post('/datasources') .send(dynamicDatasourceConfig) - const dynDatasourceId = dynamicDatasourceResponse.body.id + const datasourceId = datasourceResponse.body.id - const dynamicDataMetaData = await request(URL) - .post(`/datasources/${dynDatasourceId}/trigger`) + const dataMetaData = await request(URL) + .post(`/datasources/${datasourceId}/trigger`) .send(runtimeParameters) - const dynId = dynamicDataMetaData.body.id - const dynData = await request(URL) - .get(`/data/${dynId}`) + const id = dataMetaData.body.id + const data = await request(URL) + .get(`/data/${id}`) .send() - const normalDatasourceResponse = await request(URL) + const delResponse = await request(URL) + .delete('/datasources/') + .send() + + expect(delResponse.status).toEqual(204) + expect(datasourceResponse.status).toEqual(201) + expect(dataMetaData.status).toEqual(200) + expect(dataMetaData.body.id).toBeGreaterThanOrEqual(0) + expect(dataMetaData.body.location).toEqual(`/data/${id}`) + expect(data.status).toEqual(200) + expect(data.body.id).toBe(runtimeParameters.parameters.id) +}) + +test('POST datasources/{id}/trigger static', async () => { + const datasourceResponse = await request(URL) .post('/datasources') - .send(notDynamicDatasourceConfig) - const normalDatasourceId = normalDatasourceResponse.body.id + .send(staticDatasourceConfig) + const datasourceId = datasourceResponse.body.id - const normalDataMetaData = await request(URL) - .post(`/datasources/${normalDatasourceId}/trigger`) + const dataMetaData = await request(URL) + .post(`/datasources/${datasourceId}/trigger`) .send(null) - const normalId = normalDataMetaData.body.id + const id = dataMetaData.body.id const normalData = await request(URL) - .get(`/data/${normalId}`) + .get(`/data/${id}`) .send() const delResponse = await request(URL) @@ -226,14 +240,9 @@ test('POST datasources/{id}/trigger', async () => { .send() expect(delResponse.status).toEqual(204) - expect(dynamicDataMetaData.status).toEqual(200) - expect(dynamicDataMetaData.body.id).toBeGreaterThanOrEqual(0) - expect(dynamicDataMetaData.body.location).toEqual(`/data/${dynId}`) - expect(dynData.status).toEqual(200) - expect(dynData.body.id).toBe(runtimeParameters.parameters.id) - expect(normalDataMetaData.status).toEqual(200) - expect(normalDataMetaData.body.id).toBeGreaterThanOrEqual(0) - expect(normalDataMetaData.body.location).toEqual(`/data/${normalId}`) + expect(dataMetaData.status).toEqual(200) + expect(dataMetaData.body.id).toBeGreaterThanOrEqual(0) + expect(dataMetaData.body.location).toEqual(`/data/${id}`) expect(normalData.status).toEqual(200) expect(normalData.body.id).toBe('1') }) @@ -289,7 +298,7 @@ const dynamicDatasourceConfig = { } } -const notDynamicDatasourceConfig = { +const staticDatasourceConfig = { id: -1, protocol: { type: 'HTTP', From 74b5d22a7668cfd9c9c9cf2ae87bc4253a712f21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20W=C3=A4chtler?= Date: Fri, 3 Jul 2020 13:38:03 +0200 Subject: [PATCH 0653/1168] Fix documentation to include dependencies for system-test --- system-test/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system-test/README.md b/system-test/README.md index 49e7714b3..03e862337 100644 --- a/system-test/README.md +++ b/system-test/README.md @@ -10,10 +10,10 @@ There are three ways of executing the system test: ### 2) Testing locally in the docker environment * Build the latest version of the open-data-service via ```docker-compose build``` in the project root directory. * Start the open-data-service via ```docker-compose up -d``` in the projects root directory (Startup can be speeded up by appending ```--scale ui=0```). -* Run the system-test by ```docker-compose -f docker-compose.st.yml up```. If you want your changes to be applied, you have to rebuild first. +* Run the system-test by ```docker-compose -f docker-compose.yml -f docker-compose.st.yml up system-test```. If you want your changes to be applied, you have to rebuild first. ### 3) Testing locally outside of the docker environment * Build and start the ods as outlined above. -* Start the mock-server by ```docker-compose -f docker-compose.st.yml up mock-server```. +* Start the mock-server by ```docker-compose -f docker-compose.yml -f docker-compose.st.yml up mock-server```. * Install necessary dependencies by executing ```npm i``` in the system-test directory. * Run the system test with your favourite IDE or by executing ```npm run test``` in the system-test directory. From defa29d53677c582f102c70ec5aa0cb9b2edea6b Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Fri, 3 Jul 2020 13:55:32 +0200 Subject: [PATCH 0654/1168] Adapter: implement model class for data import execution finished event --- .../event/DatesourceImportedEvent.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/event/DatesourceImportedEvent.java diff --git a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/event/DatesourceImportedEvent.java b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/event/DatesourceImportedEvent.java new file mode 100644 index 000000000..f03f8a664 --- /dev/null +++ b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/event/DatesourceImportedEvent.java @@ -0,0 +1,19 @@ +package org.jvalue.ods.adapterservice.datasource.event; + +public class DatesourceImportedEvent { + private final Long datasourceId; + private final String dataLocation; + + public DatesourceImportedEvent(Long datasourceId, String dataLocation) { + this.datasourceId = datasourceId; + this.dataLocation = dataLocation; + } + + public Long getDatasourceId() { + return this.datasourceId; + } + + public String getDataLocation() { + return this.dataLocation; + } +} From add9c42dd7b6862f920c13c41ac75a448d7c903e Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Fri, 3 Jul 2020 13:56:08 +0200 Subject: [PATCH 0655/1168] Adapter: pull sending event on finished data import up from Adapter to DatasourceManager --- .../jvalue/ods/adapterservice/adapter/Adapter.java | 11 +---------- .../ods/adapterservice/adapter/AdapterFactory.java | 7 ++----- .../datasource/DatasourceManager.java | 13 ++++++++++--- 3 files changed, 13 insertions(+), 18 deletions(-) diff --git a/adapter/src/main/java/org/jvalue/ods/adapterservice/adapter/Adapter.java b/adapter/src/main/java/org/jvalue/ods/adapterservice/adapter/Adapter.java index 428f87abc..7269959f3 100644 --- a/adapter/src/main/java/org/jvalue/ods/adapterservice/adapter/Adapter.java +++ b/adapter/src/main/java/org/jvalue/ods/adapterservice/adapter/Adapter.java @@ -5,11 +5,8 @@ import org.jvalue.ods.adapterservice.adapter.interpreter.Interpreter; import org.jvalue.ods.adapterservice.adapter.model.AdapterConfig; import org.jvalue.ods.adapterservice.adapter.model.DataBlob; -import org.jvalue.ods.adapterservice.config.RabbitConfiguration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.amqp.core.Message; -import org.springframework.amqp.rabbit.core.RabbitTemplate; import java.io.IOException; import java.util.Objects; @@ -18,18 +15,13 @@ public class Adapter { private static final Logger logger = LoggerFactory.getLogger(Adapter.class); private Importer importer; - private Interpreter interpreter; - private DataBlobRepository blobRepository; - private final RabbitTemplate rabbitTemplate; - - public Adapter(Importer importer, Interpreter interpreter, DataBlobRepository dataRepository, RabbitTemplate rabbitTemplate) { + public Adapter(Importer importer, Interpreter interpreter, DataBlobRepository dataRepository) { this.importer = importer; this.interpreter = interpreter; this.blobRepository = dataRepository; - this.rabbitTemplate = rabbitTemplate; } public DataBlob.MetaData executeJob(AdapterConfig config){ @@ -38,7 +30,6 @@ public DataBlob.MetaData executeJob(AdapterConfig config){ logger.debug("Fetched: {}", raw); JsonNode result = interpreter.interpret(raw, config.formatConfig.parameters); DataBlob blob = blobRepository.save(new DataBlob(result.toString())); - rabbitTemplate.convertAndSend(RabbitConfiguration.DATA_IMPORT_QUEUE, blob.getMetaData().getLocation()); return blob.getMetaData(); } catch (IOException e) { throw new IllegalArgumentException("Not able to parse data as format: " + config.formatConfig.format, e); diff --git a/adapter/src/main/java/org/jvalue/ods/adapterservice/adapter/AdapterFactory.java b/adapter/src/main/java/org/jvalue/ods/adapterservice/adapter/AdapterFactory.java index 8831f27f8..ecf04d680 100644 --- a/adapter/src/main/java/org/jvalue/ods/adapterservice/adapter/AdapterFactory.java +++ b/adapter/src/main/java/org/jvalue/ods/adapterservice/adapter/AdapterFactory.java @@ -7,7 +7,6 @@ import org.jvalue.ods.adapterservice.adapter.interpreter.JsonInterpreter; import org.jvalue.ods.adapterservice.adapter.interpreter.XmlInterpreter; import org.jvalue.ods.adapterservice.adapter.model.AdapterConfig; -import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; @@ -22,7 +21,6 @@ public class AdapterFactory { private final DataBlobRepository dataRepository; - private final RabbitTemplate rabbitTemplate; private static final Map importers = Map.ofEntries( entry("HTTP", new HttpImporter(new RestTemplate())) @@ -34,9 +32,8 @@ public class AdapterFactory { ); @Autowired - public AdapterFactory(DataBlobRepository dataRepository, RabbitTemplate rabbitTemplate) { + public AdapterFactory(DataBlobRepository dataRepository) { this.dataRepository = dataRepository; - this.rabbitTemplate = rabbitTemplate; } @@ -50,7 +47,7 @@ public Adapter getAdapter(AdapterConfig config) { throw new IllegalArgumentException("Interpreter for format " + config.formatConfig.format + " does not exist"); } - return new Adapter(importer, interpreter, dataRepository, rabbitTemplate); + return new Adapter(importer, interpreter, dataRepository); } public Collection getAllImporters() { diff --git a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/DatasourceManager.java b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/DatasourceManager.java index ae801f16d..afc826553 100644 --- a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/DatasourceManager.java +++ b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/DatasourceManager.java @@ -4,13 +4,16 @@ import org.jvalue.ods.adapterservice.adapter.AdapterFactory; import org.jvalue.ods.adapterservice.adapter.model.AdapterConfig; import org.jvalue.ods.adapterservice.adapter.model.DataBlob; +import org.jvalue.ods.adapterservice.config.RabbitConfiguration; import org.jvalue.ods.adapterservice.datasource.event.DatasourceEvent; +import org.jvalue.ods.adapterservice.datasource.event.DatesourceImportedEvent; import org.jvalue.ods.adapterservice.datasource.event.EventType; import org.jvalue.ods.adapterservice.datasource.model.Datasource; import org.jvalue.ods.adapterservice.datasource.model.DatasourceMetadata; import org.jvalue.ods.adapterservice.datasource.model.RuntimeParameters; import org.jvalue.ods.adapterservice.datasource.repository.DatasourceRepository; import org.jvalue.ods.adapterservice.datasource.repository.DatasourceEventRepository; +import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -24,13 +27,15 @@ public class DatasourceManager { private final DatasourceRepository datasourceRepository; private final DatasourceEventRepository eventRepository; private final AdapterFactory adapterFactory; + private final RabbitTemplate rabbitTemplate; @Autowired - public DatasourceManager(DatasourceRepository datasourceRepository, DatasourceEventRepository eventRepository, AdapterFactory adapterFactory) { + public DatasourceManager(DatasourceRepository datasourceRepository, DatasourceEventRepository eventRepository, AdapterFactory adapterFactory, RabbitTemplate rabbitTemplate) { this.datasourceRepository = datasourceRepository; this.eventRepository = eventRepository; this.adapterFactory = adapterFactory; + this.rabbitTemplate = rabbitTemplate; } @@ -91,8 +96,10 @@ private AdapterConfig getParametrizedDatasource(Long id, RuntimeParameters runti public DataBlob.MetaData trigger(Long id, RuntimeParameters runtimeParameters) { AdapterConfig adapterConfig = getParametrizedDatasource(id, runtimeParameters); try { - Adapter adapter = adapterFactory.getAdapter(adapterConfig); - return adapter.executeJob(adapterConfig); + Adapter adapter = adapterFactory.getAdapter(adapterConfig); + DataBlob.MetaData executionResult = adapter.executeJob(adapterConfig); + this.rabbitTemplate.convertAndSend(RabbitConfiguration.DATA_IMPORT_QUEUE, new DatesourceImportedEvent(id, executionResult.getLocation())); + return executionResult; } catch (Exception e) { if(e instanceof IllegalArgumentException) { System.err.println("Data Import request failed. Malformed Request: " + e.getMessage()); From d14fc375712dac27fb0a038079d8cf1e16b7a2bb Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Fri, 3 Jul 2020 14:26:53 +0200 Subject: [PATCH 0656/1168] Add deployment section to README --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index d7fef40dd..87bf780fa 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ To execute the ODS locally, run `docker-compose up` in the project root director - [Using the API](#using-the-api) - [Using the UI](#using-the-ui) - [Project Structure](#project-structure) +- [Deployment](#deployment) - [Contributing](#contributing) - [Contact us](#contact-us) - [License](#license) @@ -117,6 +118,13 @@ We use the microservice architectural style in this project. The microservices a Further information about a specific microservice can be found in the respective README file. Examples showing the API of each microservice are in the [example request](doc/example-requests) directory. +# Deployment +Docker images of the microservices the ods consists of are deployed via our continous deployment pipeline. + +An online live instance is planned and will soon be available. + +A detailled explanation of available deployment mechanisms is accessible in our [deployment section](deployment/README.md). + # Contributing Contributions are welcome. Thank you if you want to contribute to the development of the ODS. From d1ce8fb3f07f985b54b1c41e0b68e3ebcd4deaa8 Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Fri, 3 Jul 2020 15:05:20 +0200 Subject: [PATCH 0657/1168] Adapter: add serializable information to imported event --- .../datasource/event/DatesourceImportedEvent.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/event/DatesourceImportedEvent.java b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/event/DatesourceImportedEvent.java index f03f8a664..196ecc0c9 100644 --- a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/event/DatesourceImportedEvent.java +++ b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/event/DatesourceImportedEvent.java @@ -1,10 +1,15 @@ package org.jvalue.ods.adapterservice.datasource.event; -public class DatesourceImportedEvent { +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class DatesourceImportedEvent implements Serializable { + private final Long datasourceId; private final String dataLocation; - public DatesourceImportedEvent(Long datasourceId, String dataLocation) { + public DatesourceImportedEvent(@JsonProperty("datasourceId") final Long datasourceId, @JsonProperty("dataLocation") final String dataLocation) { this.datasourceId = datasourceId; this.dataLocation = dataLocation; } From 14c091df79318a333f38b486ed21818d88e4a24f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20W=C3=A4chtler?= Date: Fri, 3 Jul 2020 15:15:10 +0200 Subject: [PATCH 0658/1168] Fix rabbitmq url --- docker-compose.st.yml | 1 + system-test/src/system.test.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docker-compose.st.yml b/docker-compose.st.yml index 760fa4c84..282fd0aa0 100644 --- a/docker-compose.st.yml +++ b/docker-compose.st.yml @@ -24,6 +24,7 @@ services: MOCK_SERVER_API: http://mock-server:8080 NOTIFICATION_API: http://notification:8080 RABBIT_HOST: rabbitmq + RABBIT_API: http://rabbitmq:15672 mock-server: build: diff --git a/system-test/src/system.test.js b/system-test/src/system.test.js index 40d6f6c7a..6d13919f0 100644 --- a/system-test/src/system.test.js +++ b/system-test/src/system.test.js @@ -7,7 +7,7 @@ const SCHEDULER_URL = process.env.SCHEDULER_API || 'http://localhost:9000/api/sc const ADAPTER_URL = process.env.ADAPTER_API || 'http://localhost:9000/api/adapter' const TRANSFORMATION_URL = process.env.TRANSFORMATION_API || 'http://localhost:9000/api/transformation' const MOCK_SERVER_URL = process.env.MOCK_SERVER_API || 'http://localhost:9000/api/system-tests/mock-server' -const RABBIT_URL = `http://${process.env.RABBIT_HOST}:15672` +const RABBIT_URL = process.env.RABBIT_API || 'http://localhost:9000/api/rabbitmq' const STORAGE_DOCKER = process.env.STORAGE_API || 'http://storage:3000' // needed to run tests outside of docker environment const MOCK_SERVER_DOCKER = process.env.MOCK_SERVER_API || 'http://mock-server:8080' From 759fca8f1efad5efd5a4017ac63ed4e0feff059f Mon Sep 17 00:00:00 2001 From: Mathias Zinnen Date: Fri, 3 Jul 2020 20:49:39 +0200 Subject: [PATCH 0659/1168] Fix typo --- .../ods/adapterservice/datasource/DatasourceManager.java | 4 ++-- ...esourceImportedEvent.java => DatasourceImportedEvent.java} | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) rename adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/event/{DatesourceImportedEvent.java => DatasourceImportedEvent.java} (80%) diff --git a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/DatasourceManager.java b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/DatasourceManager.java index afc826553..8bd55c7e8 100644 --- a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/DatasourceManager.java +++ b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/DatasourceManager.java @@ -6,7 +6,7 @@ import org.jvalue.ods.adapterservice.adapter.model.DataBlob; import org.jvalue.ods.adapterservice.config.RabbitConfiguration; import org.jvalue.ods.adapterservice.datasource.event.DatasourceEvent; -import org.jvalue.ods.adapterservice.datasource.event.DatesourceImportedEvent; +import org.jvalue.ods.adapterservice.datasource.event.DatasourceImportedEvent; import org.jvalue.ods.adapterservice.datasource.event.EventType; import org.jvalue.ods.adapterservice.datasource.model.Datasource; import org.jvalue.ods.adapterservice.datasource.model.DatasourceMetadata; @@ -98,7 +98,7 @@ public DataBlob.MetaData trigger(Long id, RuntimeParameters runtimeParameters) { try { Adapter adapter = adapterFactory.getAdapter(adapterConfig); DataBlob.MetaData executionResult = adapter.executeJob(adapterConfig); - this.rabbitTemplate.convertAndSend(RabbitConfiguration.DATA_IMPORT_QUEUE, new DatesourceImportedEvent(id, executionResult.getLocation())); + this.rabbitTemplate.convertAndSend(RabbitConfiguration.DATA_IMPORT_QUEUE, new DatasourceImportedEvent(id, executionResult.getLocation())); return executionResult; } catch (Exception e) { if(e instanceof IllegalArgumentException) { diff --git a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/event/DatesourceImportedEvent.java b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/event/DatasourceImportedEvent.java similarity index 80% rename from adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/event/DatesourceImportedEvent.java rename to adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/event/DatasourceImportedEvent.java index 196ecc0c9..97eefae9c 100644 --- a/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/event/DatesourceImportedEvent.java +++ b/adapter/src/main/java/org/jvalue/ods/adapterservice/datasource/event/DatasourceImportedEvent.java @@ -4,12 +4,12 @@ import com.fasterxml.jackson.annotation.JsonProperty; -public class DatesourceImportedEvent implements Serializable { +public class DatasourceImportedEvent implements Serializable { private final Long datasourceId; private final String dataLocation; - public DatesourceImportedEvent(@JsonProperty("datasourceId") final Long datasourceId, @JsonProperty("dataLocation") final String dataLocation) { + public DatasourceImportedEvent(@JsonProperty("datasourceId") final Long datasourceId, @JsonProperty("dataLocation") final String dataLocation) { this.datasourceId = datasourceId; this.dataLocation = dataLocation; } From 64d39168d9630e9309a39dea33841c1cbbe9ed5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20W=C3=A4chtler?= Date: Thu, 9 Jul 2020 11:39:01 +0200 Subject: [PATCH 0660/1168] Add example request for dynamic datasource --- doc/example-requests/adapter.http | 42 +++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/doc/example-requests/adapter.http b/doc/example-requests/adapter.http index 25c0d0431..ae6bed616 100644 --- a/doc/example-requests/adapter.http +++ b/doc/example-requests/adapter.http @@ -131,3 +131,45 @@ Content-Type: application/json "license": "AGPL3" } } + +### Performe Manual Data Import without runtime parameters +POST {{baseURL}}/datasources/{{datasourceId}}/trigger HTTP/1.1 +Content-Type: application/json + +### Create datasource with dynamic parameters +POST {{baseURL}}/datasources HTTP/1.1 +Content-Type: application/json + +{ + "protocol": { + "type": "HTTP", + "parameters": { + "location": "https://www.pegelonline.wsv.de/webservices/rest-api/v2/stations/{station}/W/measurements.json?start=P1D", + "encoding": "UTF-8" + } + }, + "format": { + "type": "JSON", + "parameters": {} + }, + "trigger": { + "firstExecution": "2018-10-07T01:32:00.123Z", + "periodic": false, + "interval": 60000 + }, + "metadata": { + "displayName": "pegelOnline", + "author": "icke", + "license": "none" + } +} + +### Perform Manual Data Import with runtime parameters +POST {{baseURL}}/datasources/{{datasourceId}}/trigger HTTP/1.1 +Content-Type: application/json + +{ + "parameters": { + "station": "BONN" + } +} From ee9610b6c80bb3da8b5cdc201dce5ae5a528c1ac Mon Sep 17 00:00:00 2001 From: Georg Schwarz Date: Mon, 13 Jul 2020 08:42:07 +0200 Subject: [PATCH 0661/1168] Enable Notification Service to Consume Events (#120) * copy changes for notification service * copy changes for notification service in ui * Notification: refactor to more domain-driven directory design * Notification: update package-lock * Notification: rename endpoint to nofiticationConfigEndpoint * Notification: readd old notification endpoint for notification execution by scheduler * Notification: refactor express to have different endpoint files * Notification: separate integration tests into two files * Notification: fix imports to relative ones * Deploy: add notification db to notification service * Notification: add health endpoint only after initialization * Notification: undo changes on test structure, moving back to src directory * Notification: remove unused imports and injections from NotificationConfigEnpoint * Notification: refactor notification config storage to not expose orm details * Notification: refactoring; renamed notificationService to executor, pulled up message building so that execution is independent of API model * Notification: refactor amqphandler to process events in async/await style * Notification: add types to amqp channel * Notification: refactor trigger event handler as own class * Notification: fix some of the integration tests (adapt to new trigger API) * Notification: fix integration tests * Notification: fix config get endpoints to fetch config with id, not config with pipelineId * Notification: change ids for integration tests to surely not existing ones * Notification: change some ids in integration test * Notification: introduce higher timeouut and fix slack config * Notification: return 200 on successful trigger * Documentation: add http example requests for notification * Notification: add cleanup to notification execution integration tests * Notification: send message and dataLocation * Notification: readd location to notification and send human-readable message under field message * Notification: response with updated config on PUT * Notification: return 404 if requested config does not exist * Notification: fix integration test (pointing to wrong url, assuming wrong response) * Notification: completly remove type-pattern for notifications for the time being * Notification: adjust integration test to API changes * Notification: reformatting in integration tests * Fix typos and clean up * Handle update and delete for notifications that dont exist * Notification: fix url mismatch for cleaning up notification configs after tests * Notification: fix integration test variable assignment from const to let * Notification: fix variable assignment in integation tests * Core: remove notification (since moved to notification service) * Core: adapt integration tests to removed notification configs * System-test: adapt to notification api changes * Notification: remove unnecessary event information about transformation execution * Scheduler: adapt to notification API changes using the trigger endpoint * System-test: wait for notification service and add some checks for CRUD success on configs * Notification: return 201 on creation of config (instead of 200) * Notification: adapt integration test to trigger event simplification * System-test: fix notification model * Scheduler: don't abort on empty transformation, send data instead of transformation response to notification * System-test: increase timeouts * Scheduler: also accept status 201 from notification as success * Scheduler: adapt integration tests to notification changes to trigger instead of sending out single notification configs * UI: adapt to changes on notification API * UI: remove outcommented code * Fix typos and clean up * Update example requests Co-authored-by: Mathias Zinnen --- core/README.md | 40 - core/integration-test/src/core.test.js | 115 +- .../ods/coreservice/model/PipelineConfig.java | 26 +- .../coreservice/model/PipelineMetadata.java | 3 +- .../notification/FirebaseNotification.java | 70 - .../notification/NotificationConfig.java | 76 - .../model/notification/NotificationType.java | 7 - .../model/notification/SlackNotification.java | 59 - .../notification/WebhookNotification.java | 43 - .../coreservice/pipeline/PipelineManager.java | 38 +- .../rest/v1/PipelinesEndpoint.java | 25 - .../ods/coreservice/model/PipelineConfig.json | 9 +- .../coreservice/model/PipelineConfigTest.java | 18 +- .../notification/NotificationConfigTest.java | 157 -- .../pipeline/PipelineManagerTest.java | 42 +- doc/example-requests/core.http | 34 +- .../covid19-api/cases-per-country.http | 3 +- .../covid19-api/hotspot-countries.http | 1 - .../covid19-api/list-of-countries.http | 31 +- doc/example-requests/notification.http | 59 + .../mirror-and-cuxhaven-via-internal.http | 2 - .../pegelonline/station-constanz.http | 1 - doc/example-requests/transformation.http | 61 - docker-compose.yml | 23 +- .../integration-test/src/mock.receiver.js | 60 +- .../src/notification-config.test.js | 145 ++ .../src/notification-execution.test.js | 159 ++ .../integration-test/src/notification.test.js | 117 - notification/jest.config.js | 6 +- notification/package-lock.json | 2246 ++++++++++++----- notification/package.json | 8 +- notification/src/api/amqp/amqpHandler.ts | 114 + .../src/api/notificationMessageFactory.ts | 25 + .../api/rest/notificationConfigEndpoint.ts | 559 ++++ .../api/rest/notificationExecutionEndpoint.ts | 26 + .../rest}/notificationRequest.ts | 4 +- notification/src/api/transformationEvent.ts | 13 + notification/src/api/triggerEventHandler.ts | 67 + notification/src/index.ts | 51 +- .../src/interfaces/notificationService.ts | 6 - .../src/interfaces/sandboxExecutor.ts | 3 - .../src/jsNotificationService.test.ts | 114 - notification/src/jsNotificationService.ts | 110 - .../notification-config/notificationConfig.ts | 65 + .../notificationRepository.ts | 24 + .../notificationSummary.ts | 20 + .../src/notification-config/storageHandler.ts | 483 ++++ .../condition-evaluation/sandboxExecutor.ts | 3 + .../vm2SandboxExecutor.test.ts | 20 +- .../vm2SandboxExecutor.ts | 10 +- .../notificationCallbacks}/fcmCallback.ts | 0 .../notificationCallbacks}/slackCallback.ts | 0 .../notificationCallbacks}/webhookCallback.ts | 1 + .../notificationExecutor.test.ts | 151 ++ .../notificationExecutor.ts | 104 + notification/src/notificationEndpoint.ts | 126 - notification/tsconfig.json | 6 +- scheduler/integration-test/src/mock.core.js | 22 +- .../integration-test/src/mock.notification.js | 42 +- .../src/mock.transformation.js | 4 - .../integration-test/src/scheduler.test.js | 32 +- scheduler/src/clients/notification-client.ts | 17 +- .../src/clients/transformation-client.ts | 8 +- .../src/interfaces/notification-config.ts | 7 - scheduler/src/interfaces/pipeline-config.ts | 2 - scheduler/src/workflow-execution.test.ts | 42 +- scheduler/src/workflow-execution.ts | 37 +- system-test/src/system.test.js | 151 +- ui/.env.template | 1 + ui/.gitignore | 2 +- ui/Dockerfile | 3 + ui/package-lock.json | 45 +- ui/package.json | 2 +- ui/src/main.ts | 4 +- .../FirebaseEdit.vue | 6 +- .../NotificationEdit.vue | 50 +- .../NotificationOverview.vue | 72 +- .../SlackEdit.vue | 3 +- .../WebhookEdit.vue | 0 ui/src/notification/notification.module.ts | 48 + ui/src/notification/notificationConfig.ts | 32 + .../notificationEditDialog.ts | 2 +- ui/src/notification/notificationRest.ts | 107 + ui/src/notification/router.ts | 10 + ui/src/pipeline/PipelineEdit.vue | 25 +- .../notifications/notificationConfig.ts | 24 - ui/src/pipeline/pipeline.module.ts | 29 - ui/src/pipeline/pipeline.ts | 3 - ui/src/pipeline/pipelineRest.ts | 21 +- ui/src/pipeline/router.ts | 7 - ui/src/router.ts | 2 + 91 files changed, 4377 insertions(+), 2274 deletions(-) delete mode 100644 core/src/main/java/org/jvalue/ods/coreservice/model/notification/FirebaseNotification.java delete mode 100644 core/src/main/java/org/jvalue/ods/coreservice/model/notification/NotificationConfig.java delete mode 100644 core/src/main/java/org/jvalue/ods/coreservice/model/notification/NotificationType.java delete mode 100644 core/src/main/java/org/jvalue/ods/coreservice/model/notification/SlackNotification.java delete mode 100644 core/src/main/java/org/jvalue/ods/coreservice/model/notification/WebhookNotification.java delete mode 100644 core/src/test/java/org/jvalue/ods/coreservice/model/notification/NotificationConfigTest.java create mode 100644 doc/example-requests/notification.http create mode 100644 notification/integration-test/src/notification-config.test.js create mode 100644 notification/integration-test/src/notification-execution.test.js delete mode 100644 notification/integration-test/src/notification.test.js create mode 100644 notification/src/api/amqp/amqpHandler.ts create mode 100644 notification/src/api/notificationMessageFactory.ts create mode 100644 notification/src/api/rest/notificationConfigEndpoint.ts create mode 100644 notification/src/api/rest/notificationExecutionEndpoint.ts rename notification/src/{interfaces => api/rest}/notificationRequest.ts (77%) create mode 100644 notification/src/api/transformationEvent.ts create mode 100644 notification/src/api/triggerEventHandler.ts delete mode 100644 notification/src/interfaces/notificationService.ts delete mode 100644 notification/src/interfaces/sandboxExecutor.ts delete mode 100644 notification/src/jsNotificationService.test.ts delete mode 100644 notification/src/jsNotificationService.ts create mode 100644 notification/src/notification-config/notificationConfig.ts create mode 100644 notification/src/notification-config/notificationRepository.ts create mode 100644 notification/src/notification-config/notificationSummary.ts create mode 100644 notification/src/notification-config/storageHandler.ts create mode 100644 notification/src/notification-execution/condition-evaluation/sandboxExecutor.ts rename notification/src/{ => notification-execution/condition-evaluation}/vm2SandboxExecutor.test.ts (71%) rename notification/src/{ => notification-execution/condition-evaluation}/vm2SandboxExecutor.ts (77%) rename notification/src/{interfaces => notification-execution/notificationCallbacks}/fcmCallback.ts (100%) rename notification/src/{interfaces => notification-execution/notificationCallbacks}/slackCallback.ts (100%) rename notification/src/{interfaces => notification-execution/notificationCallbacks}/webhookCallback.ts (81%) create mode 100644 notification/src/notification-execution/notificationExecutor.test.ts create mode 100644 notification/src/notification-execution/notificationExecutor.ts delete mode 100644 notification/src/notificationEndpoint.ts delete mode 100644 scheduler/src/interfaces/notification-config.ts rename ui/src/{pipeline/notifications => notification}/FirebaseEdit.vue (93%) rename ui/src/{pipeline/notifications => notification}/NotificationEdit.vue (77%) rename ui/src/{pipeline/notifications => notification}/NotificationOverview.vue (62%) rename ui/src/{pipeline/notifications => notification}/SlackEdit.vue (94%) rename ui/src/{pipeline/notifications => notification}/WebhookEdit.vue (100%) create mode 100644 ui/src/notification/notification.module.ts create mode 100644 ui/src/notification/notificationConfig.ts rename ui/src/{pipeline/notifications => notification}/notificationEditDialog.ts (64%) create mode 100644 ui/src/notification/notificationRest.ts create mode 100644 ui/src/notification/router.ts delete mode 100644 ui/src/pipeline/notifications/notificationConfig.ts diff --git a/core/README.md b/core/README.md index 76d4118a4..e940134ef 100644 --- a/core/README.md +++ b/core/README.md @@ -28,8 +28,6 @@ Note that you need to delete existing docker images from your local docker daemo | *base_url*/pipelines | POST | PipelineConfig | PipelineConfig | Create a new pipeline (id will be set by the core service) | | *base_url*/pipelines/${id} | PUT | PipelineConfig | - | Update existing pipeline | | *base_url*/pipelines/${id} | DELETE | - | - | Delete existing pipeline | -| *base_url*/pipelines/${id}/notifications | POST | NotificationConfig | NotificationConfig | Create notification for a pipeline | -| *base_url*/pipelines/${id}/notifications/${notificationId} | DELETE | - | - | Delete notification | | *base_url*/pipelines | DELETE | - | - | Delete all pipelines | | *base_url*/events | GET | - | Array of PipelineEvents | Get all events | | *base_url*/events/${id} | GET | - | PipelineEvent | Get a event with id ${id} | @@ -42,7 +40,6 @@ Note that you need to delete existing docker images from your local docker daemo "id": number, "datasourceId": number, "transformation": TransformationConfig, - "notifications": [*NotificationConfig] "metadata":PipelineMetadata } ``` @@ -73,40 +70,3 @@ Note that you need to delete existing docker images from your local docker daemo "description":String } ``` - -### NotificationConfig -``` -WebhookNotification | SlackNotification | FirebaseNotification -``` - -### WebhookParams -``` -{ - "condition": String, - "type": "WEBHOOK", - "url": String (the url of the webhook you want to be triggered) -} -``` - -### SlackParams -``` -{ - "condition": String, - "type": "SLACK", - "workspaceId": String (id of your slack workspace), - "channelId": String (id of the channel where the notification is to be posted), - "secret": String (secret part of the slack webhook, get it at slack management console) -} -``` - -### FirebaseParams -``` -{ - "condition": String, - "type": "FCM", - "projectId": String (id of your firebase project), - "clientEmail": String (email of the firebase service account), - "privateKey: String (secret key associated with the service account), - "topic": String (topic under which the notification is to be posted) -} -``` diff --git a/core/integration-test/src/core.test.js b/core/integration-test/src/core.test.js index 00ce149b9..0be3848d6 100644 --- a/core/integration-test/src/core.test.js +++ b/core/integration-test/src/core.test.js @@ -46,14 +46,6 @@ describe('Core', () => { expect(response.body.id).not.toEqual(pipelineConfig.id) // id not under control of client expect(response.body.datasourceId).toEqual(pipelineConfig.datasourceId) - // Check if notifications were stored correctly - expect(response.body.notifications).toHaveLength(pipelineConfig.notifications.length) - pipelineConfig.notifications.forEach(n => { - expect(response.body.notifications).toEqual( - expect.arrayContaining([ - expect.objectContaining(n)])) - }) - const delResponse = await request(URL) .delete('/pipelines/' + response.body.id) .send() @@ -189,89 +181,6 @@ describe('Core', () => { expect(response.body.eventType).toEqual('PIPELINE_DELETE') }) - test('POST /{pipelineId}/notifications', async () => { - const notificationConfig = { - condition: 'data.value1 === 5', - url: 'www.some-url.net', - type: 'WEBHOOK' - } - - // add pipeline - const pipelineCreationResponse = await request(URL) - .post('/pipelines') - .send(pipelineConfig) - - const pipelineId = pipelineCreationResponse.body.id - - const notificationCreationResponse = await request(URL) - .post('/pipelines/' + pipelineId + '/notifications') - .send(notificationConfig) - - // check if notification post worked - expect(notificationCreationResponse.status).toEqual(200) - expect(notificationCreationResponse.type).toEqual('application/json') - expect(notificationCreationResponse.body.type).toEqual('WEBHOOK') - expect(notificationCreationResponse.body.condition).toEqual('data.value1 === 5') - expect(notificationCreationResponse.body.url).toEqual('www.some-url.net') - - // check if update event worked - const eventsResponse = await request(URL) - .get('/events/latest') - .send() - - expect(eventsResponse.body.eventType).toEqual('PIPELINE_UPDATE') - expect(eventsResponse.body.pipelineId).toEqual(pipelineId) - - // check if pipeline config was updated correctly - const pipelineResponse = await request(URL) - .get('/pipelines/' + pipelineId) - .send() - - expect(pipelineResponse.body.notifications).toHaveLength(4) - - // clean up - await request(URL) - .delete('/pipelines/ ' + pipelineId) - .send() - }) - - test('DELETE /{pipelineId}/notifications', async () => { - // add pipeline - const pipelineCreationResponse = await request(URL) - .post('/pipelines') - .send(pipelineConfig) - - const pipelineId = pipelineCreationResponse.body.id - const notificationId = pipelineCreationResponse.body.notifications[0].notificationId - - const notificationDeletionResponse = await request(URL) - .delete('/pipelines/' + pipelineId + '/notifications/' + notificationId) - .send() - - // check if notification deletion worked - expect(notificationDeletionResponse.status).toEqual(204) - - // check if update event worked - const eventsResponse = await request(URL) - .get('/events/latest') - .send() - - expect(eventsResponse.body.eventType).toEqual('PIPELINE_UPDATE') - expect(eventsResponse.body.pipelineId).toEqual(pipelineId) - - // check if pipeline config was updated correctly - const pipelineResponse = await request(URL) - .get('/pipelines/' + pipelineId) - .send() - - expect(pipelineResponse.body.notifications).toHaveLength(2) - - // clean up - await request(URL) - .delete('/pipelines/ ' + pipelineId) - .send() - }) - test('Persist long transformation function', async () => { const configToPersist = Object.assign({}, pipelineConfig) const crazyLongTransformation = { @@ -314,27 +223,5 @@ const pipelineConfig = { license: 'none', displayName: 'test pipeline 1', description: 'integraiton testing pipeline' - }, - notifications: [ - { - condition: 'data.value1 > 10', - type: 'WEBHOOK', - url: 'http://www.webhookland.com' - }, - { - condition: 'false', - type: 'SLACK', - workspaceId: '123', - channelId: '456', - secret: '789' - }, - { - condition: '1 === 2', - type: 'FCM', - projectId: 'nebelalarm', - clientEmail: 'client@mail.yeah', - privateKey: 'verylongverysecretkey', - topic: 'interestingstuff' - } - ] + } } diff --git a/core/src/main/java/org/jvalue/ods/coreservice/model/PipelineConfig.java b/core/src/main/java/org/jvalue/ods/coreservice/model/PipelineConfig.java index c03aebada..59bc65885 100644 --- a/core/src/main/java/org/jvalue/ods/coreservice/model/PipelineConfig.java +++ b/core/src/main/java/org/jvalue/ods/coreservice/model/PipelineConfig.java @@ -2,7 +2,6 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import org.jvalue.ods.coreservice.model.notification.NotificationConfig; import javax.persistence.*; import javax.validation.constraints.NotNull; @@ -27,21 +26,16 @@ public class PipelineConfig implements Serializable { @Embedded @NotNull private PipelineMetadata metadata; - @OneToMany(cascade = CascadeType.ALL) - private List notifications; - //Constructor for JPA public PipelineConfig() {} @JsonCreator public PipelineConfig(@JsonProperty("datasourceId") Long datasourceId, @JsonProperty("transformation") TransformationConfig transformation, - @JsonProperty("metadata") PipelineMetadata metadata, - @JsonProperty("notifications") List notifications) { + @JsonProperty("metadata") PipelineMetadata metadata) { this.datasourceId = datasourceId; this.transformation = transformation; this.metadata = metadata; - this.notifications = notifications; } public Long getId() { @@ -72,18 +66,6 @@ public PipelineMetadata getMetadata() { return metadata; } - public List getNotifications() { - return notifications; - } - - public void addNotification(NotificationConfig notification) { - this.notifications.add(notification); - } - - public void removeNotification(NotificationConfig notification) { - this.notifications.remove(notification); - } - @Override public String toString() { return "PipelineConfig{" + @@ -91,7 +73,6 @@ public String toString() { ", datasourceId=" + datasourceId + ", transformation=" + transformation + ", metadata=" + metadata + - ", notifications=" + notifications + '}'; } @@ -103,12 +84,11 @@ public boolean equals(Object o) { return Objects.equals(id, that.id) && Objects.equals(datasourceId, that.datasourceId) && Objects.equals(transformation, that.transformation) && - Objects.equals(metadata, that.metadata) && - Objects.equals(notifications, that.notifications); + Objects.equals(metadata, that.metadata); } @Override public int hashCode() { - return Objects.hash(id, datasourceId, transformation, metadata, notifications); + return Objects.hash(id, datasourceId, transformation, metadata); } } diff --git a/core/src/main/java/org/jvalue/ods/coreservice/model/PipelineMetadata.java b/core/src/main/java/org/jvalue/ods/coreservice/model/PipelineMetadata.java index 788ff1a92..9b1a133e9 100644 --- a/core/src/main/java/org/jvalue/ods/coreservice/model/PipelineMetadata.java +++ b/core/src/main/java/org/jvalue/ods/coreservice/model/PipelineMetadata.java @@ -6,7 +6,6 @@ import javax.persistence.Embeddable; import javax.validation.constraints.NotNull; -import java.time.LocalDateTime; import java.util.Date; import java.util.Objects; @@ -22,7 +21,7 @@ public class PipelineMetadata { private String license; private String description; - @NotNull + @NotNull @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", locale = "UTC") private Date creationTimestamp; diff --git a/core/src/main/java/org/jvalue/ods/coreservice/model/notification/FirebaseNotification.java b/core/src/main/java/org/jvalue/ods/coreservice/model/notification/FirebaseNotification.java deleted file mode 100644 index 0099adac7..000000000 --- a/core/src/main/java/org/jvalue/ods/coreservice/model/notification/FirebaseNotification.java +++ /dev/null @@ -1,70 +0,0 @@ -package org.jvalue.ods.coreservice.model.notification; - -import com.fasterxml.jackson.annotation.JsonProperty; - -import javax.persistence.Column; -import javax.persistence.DiscriminatorValue; -import javax.persistence.Entity; -import javax.validation.constraints.NotNull; -import java.util.Objects; - -@Entity -@DiscriminatorValue("Firebase") -public class FirebaseNotification extends NotificationConfig { - - @NotNull private String projectId; - @NotNull private String clientEmail; - @Column(length = 2000) - @NotNull private String privateKey; - @NotNull private String topic; - - public FirebaseNotification() { - } - - public FirebaseNotification( - @JsonProperty(value = "condition", required = true) String condition, - @JsonProperty(value = "projectId", required = true) String projectId, - @JsonProperty(value = "clientEmail", required = true) @NotNull String clientEmail, - @JsonProperty(value = "privateKey", required = true) @NotNull String privateKey, - @JsonProperty(value = "topic", required = true) @NotNull String topic) { - - super(condition, NotificationType.FCM); - this.projectId = projectId; - this.clientEmail = clientEmail; - this.privateKey = privateKey; - this.topic = topic; - } - - public String getProjectId() { - return projectId; - } - - public String getClientEmail() { - return clientEmail; - } - - public String getPrivateKey() { - return privateKey; - } - - public String getTopic() { - return topic; - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), projectId, clientEmail, privateKey, topic); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - FirebaseNotification that = (FirebaseNotification) o; - return Objects.equals(projectId, that.projectId) && - Objects.equals(clientEmail, that.clientEmail) && - Objects.equals(privateKey, that.privateKey) && - Objects.equals(topic, that.topic); - } -} diff --git a/core/src/main/java/org/jvalue/ods/coreservice/model/notification/NotificationConfig.java b/core/src/main/java/org/jvalue/ods/coreservice/model/notification/NotificationConfig.java deleted file mode 100644 index bc9bcb8be..000000000 --- a/core/src/main/java/org/jvalue/ods/coreservice/model/notification/NotificationConfig.java +++ /dev/null @@ -1,76 +0,0 @@ -package org.jvalue.ods.coreservice.model.notification; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSubTypes; -import com.fasterxml.jackson.annotation.JsonTypeInfo; - -import javax.persistence.*; -import javax.validation.constraints.NotNull; -import java.util.Objects; - -@Entity -@Inheritance(strategy = InheritanceType.SINGLE_TABLE) -@DiscriminatorColumn(name = "Notification_Type") -@JsonTypeInfo( - use = JsonTypeInfo.Id.NAME, - include = JsonTypeInfo.As.PROPERTY, - property = "type" -) -@JsonSubTypes({ - @JsonSubTypes.Type(value = WebhookNotification.class, name = "WEBHOOK"), - @JsonSubTypes.Type(value = SlackNotification.class, name = "SLACK"), - @JsonSubTypes.Type(value = FirebaseNotification.class, name = "FCM") -}) -public abstract class NotificationConfig { - - @Id - @GeneratedValue - private Long notificationId; - - @NotNull - @Column(length = 10000) - private String condition; - - private NotificationType type; - - //Constructor for JPA - public NotificationConfig() { - } - - public NotificationConfig( - @JsonProperty(value = "condition", required = true) String condition, - @JsonProperty(value = "type", required = true) NotificationType type) { - this.condition = condition; - this.type = type; - } - - public Long getNotificationId() { - return notificationId; - } - - public void setNotificationId(Long notificationId) { - this.notificationId = notificationId; - } - - public String getCondition() { - return condition; - } - - public NotificationType getType() { - return type; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - NotificationConfig that = (NotificationConfig) o; - return Objects.equals(notificationId, that.notificationId) && - Objects.equals(condition, that.condition); - } - - @Override - public int hashCode() { - return Objects.hash(notificationId, condition); - } -} diff --git a/core/src/main/java/org/jvalue/ods/coreservice/model/notification/NotificationType.java b/core/src/main/java/org/jvalue/ods/coreservice/model/notification/NotificationType.java deleted file mode 100644 index b7f1442a7..000000000 --- a/core/src/main/java/org/jvalue/ods/coreservice/model/notification/NotificationType.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.jvalue.ods.coreservice.model.notification; - -public enum NotificationType { - WEBHOOK, - SLACK, - FCM -} diff --git a/core/src/main/java/org/jvalue/ods/coreservice/model/notification/SlackNotification.java b/core/src/main/java/org/jvalue/ods/coreservice/model/notification/SlackNotification.java deleted file mode 100644 index 36f7a57a0..000000000 --- a/core/src/main/java/org/jvalue/ods/coreservice/model/notification/SlackNotification.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.jvalue.ods.coreservice.model.notification; - -import com.fasterxml.jackson.annotation.JsonProperty; - -import javax.persistence.DiscriminatorValue; -import javax.persistence.Entity; -import javax.validation.constraints.NotNull; -import java.util.Objects; - -@Entity -@DiscriminatorValue("Slack") -public class SlackNotification extends NotificationConfig { - - @NotNull private String workspaceId; - @NotNull private String channelId; - @NotNull private String secret; - - public SlackNotification( - @JsonProperty(value = "condition", required = true) String condition, - @JsonProperty(value = "workspaceId", required = true) @NotNull String workspaceId, - @JsonProperty(value = "channelId", required = true) @NotNull String channelId, - @JsonProperty(value = "secret", required = true) @NotNull String secret) { - super(condition, NotificationType.SLACK); - this.workspaceId = workspaceId; - this.channelId = channelId; - this.secret = secret; - } - - public String getWorkspaceId() { - return workspaceId; - } - - public String getChannelId() { - return channelId; - } - - public String getSecret() { - return secret; - } - - public SlackNotification() { - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - SlackNotification that = (SlackNotification) o; - return Objects.equals(workspaceId, that.workspaceId) && - Objects.equals(channelId, that.channelId) && - Objects.equals(secret, that.secret); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), workspaceId, channelId, secret); - } -} diff --git a/core/src/main/java/org/jvalue/ods/coreservice/model/notification/WebhookNotification.java b/core/src/main/java/org/jvalue/ods/coreservice/model/notification/WebhookNotification.java deleted file mode 100644 index 76992a98c..000000000 --- a/core/src/main/java/org/jvalue/ods/coreservice/model/notification/WebhookNotification.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.jvalue.ods.coreservice.model.notification; - -import com.fasterxml.jackson.annotation.JsonProperty; - -import javax.persistence.DiscriminatorValue; -import javax.persistence.Entity; -import javax.validation.constraints.NotNull; -import java.util.Objects; - -@Entity -@DiscriminatorValue("Webhook") -public class WebhookNotification extends NotificationConfig { - - @NotNull private String url; - - public WebhookNotification() { - } - - public WebhookNotification( - @JsonProperty(value = "condition", required = true) String condition, - @JsonProperty(value = "url", required = true) String url) { - super(condition, NotificationType.WEBHOOK); - this.url = url; - } - - public String getUrl() { - return url; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - WebhookNotification that = (WebhookNotification) o; - return Objects.equals(url, that.url); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), url); - } -} diff --git a/core/src/main/java/org/jvalue/ods/coreservice/pipeline/PipelineManager.java b/core/src/main/java/org/jvalue/ods/coreservice/pipeline/PipelineManager.java index c51ac0de1..c3e4e10ba 100644 --- a/core/src/main/java/org/jvalue/ods/coreservice/pipeline/PipelineManager.java +++ b/core/src/main/java/org/jvalue/ods/coreservice/pipeline/PipelineManager.java @@ -3,14 +3,12 @@ import org.jvalue.ods.coreservice.model.*; import org.jvalue.ods.coreservice.model.event.EventType; import org.jvalue.ods.coreservice.model.event.PipelineEvent; -import org.jvalue.ods.coreservice.model.notification.NotificationConfig; import org.jvalue.ods.coreservice.repository.EventRepository; import org.jvalue.ods.coreservice.repository.PipelineRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -91,8 +89,7 @@ private PipelineConfig applyUpdate(PipelineConfig existing, PipelineConfig updat PipelineConfig updated = new PipelineConfig( updateConfig.getDatasourceId(), updateConfig.getTransformation(), - updatedMetadata, - updateConfig.getNotifications()); + updatedMetadata); updated.setId(existing.getId()); return updated; @@ -113,37 +110,4 @@ public Iterable getEventsByPipeline(Long pipelineId) { public PipelineEvent getLatestEvent() { return eventRepository.findFirstByOrderByEventIdDesc(); } - - @Transactional - public NotificationConfig addNotification(long pipelineId, NotificationConfig notificationConfig) { - PipelineConfig existing = pipelineRepository.findById(pipelineId) - .orElseThrow(() -> new IllegalArgumentException("Pipeline with id " + pipelineId + " not found.")); - - List notificationsBefore = new ArrayList<>(existing.getNotifications()); - - existing.addNotification(notificationConfig); - - PipelineConfig savedConfig = pipelineRepository.save(existing); - eventRepository.save(new PipelineEvent(EventType.PIPELINE_UPDATE, pipelineId)); - - return savedConfig.getNotifications().stream() - .filter(n -> !notificationsBefore.contains(n)) - .findFirst() - .orElseThrow(IllegalStateException::new); - } - - @Transactional - public void removeNotification(long pipelineId, Long notificationId) { - PipelineConfig existing = pipelineRepository.findById(pipelineId) - .orElseThrow(() -> new IllegalArgumentException("Pipeline with id " + pipelineId + " not found.")); - - NotificationConfig toRemove = existing.getNotifications().stream() - .filter(n -> n.getNotificationId().equals(notificationId)) - .findFirst() - .orElseThrow( () -> new IllegalArgumentException("Notification with id " + notificationId + "does not exist for pipeline with id " + pipelineId)); - - existing.removeNotification(toRemove); - pipelineRepository.save(existing); - eventRepository.save(new PipelineEvent(EventType.PIPELINE_UPDATE, pipelineId)); - } } diff --git a/core/src/main/java/org/jvalue/ods/coreservice/rest/v1/PipelinesEndpoint.java b/core/src/main/java/org/jvalue/ods/coreservice/rest/v1/PipelinesEndpoint.java index 56af1fbb2..d2c455f99 100644 --- a/core/src/main/java/org/jvalue/ods/coreservice/rest/v1/PipelinesEndpoint.java +++ b/core/src/main/java/org/jvalue/ods/coreservice/rest/v1/PipelinesEndpoint.java @@ -1,6 +1,5 @@ package org.jvalue.ods.coreservice.rest.v1; -import org.jvalue.ods.coreservice.model.notification.NotificationConfig; import org.jvalue.ods.coreservice.model.PipelineConfig; import org.jvalue.ods.coreservice.pipeline.PipelineManager; import org.springframework.beans.factory.annotation.Autowired; @@ -82,28 +81,4 @@ public void deletePipeline(@PathVariable Long id) { public void deleteAllPipelines() { pipelineManager.deleteAllPipelines(); } - - @PostMapping("/{pipelineId}/notifications") - public NotificationConfig addNotification( - @PathVariable Long pipelineId, - @Valid @RequestBody NotificationConfig notificationConfig) { - try { - return pipelineManager.addNotification(pipelineId, notificationConfig); - } catch (IllegalArgumentException e) { - throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Pipeline not found", e); - } - } - - @DeleteMapping("/{pipelineId}/notifications/{notificationId}") - @ResponseStatus(HttpStatus.NO_CONTENT) - public void removeNotification( - @PathVariable Long pipelineId, - @PathVariable Long notificationId) { - try { - pipelineManager.removeNotification(pipelineId, notificationId); - } catch (IllegalArgumentException e) { - throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Pipeline or notification not found", e); - } - } - } diff --git a/core/src/test/java/org/jvalue/ods/coreservice/model/PipelineConfig.json b/core/src/test/java/org/jvalue/ods/coreservice/model/PipelineConfig.json index 779b70168..d8ddd5feb 100644 --- a/core/src/test/java/org/jvalue/ods/coreservice/model/PipelineConfig.json +++ b/core/src/test/java/org/jvalue/ods/coreservice/model/PipelineConfig.json @@ -10,12 +10,5 @@ "license": "none", "displayName": "TestName", "description": "Describing..." - }, - "notifications": [ - { - "condition": "data.value1 > 10", - "type": "WEBHOOK", - "url": "http://www.webhookland.com" - } - ] + } } diff --git a/core/src/test/java/org/jvalue/ods/coreservice/model/PipelineConfigTest.java b/core/src/test/java/org/jvalue/ods/coreservice/model/PipelineConfigTest.java index 167a1e8ff..d3ba8b226 100644 --- a/core/src/test/java/org/jvalue/ods/coreservice/model/PipelineConfigTest.java +++ b/core/src/test/java/org/jvalue/ods/coreservice/model/PipelineConfigTest.java @@ -3,8 +3,6 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Test; -import org.jvalue.ods.coreservice.model.notification.NotificationConfig; -import org.jvalue.ods.coreservice.model.notification.WebhookNotification; import org.springframework.format.datetime.DateFormatter; import java.io.File; @@ -37,31 +35,19 @@ public void testDeserialization() throws IOException { Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")); cal.setTime(result.getMetadata().getCreationTimestamp()); assertEquals(LocalDateTime.now().getDayOfYear(), cal.get(Calendar.DAY_OF_YEAR)); - assertEquals(1, result.getNotifications().size()); - assertNotNull(result.getNotifications().get(0)); - assertEquals("data.value1 > 10", result.getNotifications().get(0).getCondition()); - assertEquals("http://www.webhookland.com", ((WebhookNotification) result.getNotifications().get(0)).getUrl()); } @Test public void testSerialization() { TransformationConfig transformation = new TransformationConfig("return 1+1", "[1]"); PipelineMetadata metadata = new PipelineMetadata("icke", "none", "Display", "description"); - List notifications = List.of( - new WebhookNotification("data.value1 > 10", "http://www.webhookland.com/1"), - new WebhookNotification("data.value1 < 0", "http://www.webhookland.com/2")); - PipelineConfig config = new PipelineConfig(1L, transformation, metadata, notifications); + PipelineConfig config = new PipelineConfig(1L, transformation, metadata); JsonNode result = mapper.valueToTree(config); System.out.println(result); - assertEquals(5, result.size()); + assertEquals(4, result.size()); assertEquals("return 1+1", result.get("transformation").get("func").textValue()); assertEquals("[1]", result.get("transformation").get("data").textValue()); - assertEquals(2, result.get("notifications").size()); - assertEquals(4, result.get("notifications").get(0).size()); - assertEquals("data.value1 > 10", result.get("notifications").get(0).get("condition").textValue()); - assertEquals("WEBHOOK", result.get("notifications").get(0).get("type").textValue()); - assertEquals("http://www.webhookland.com/2", result.get("notifications").get(1).get("url").textValue()); } } diff --git a/core/src/test/java/org/jvalue/ods/coreservice/model/notification/NotificationConfigTest.java b/core/src/test/java/org/jvalue/ods/coreservice/model/notification/NotificationConfigTest.java deleted file mode 100644 index a709bb001..000000000 --- a/core/src/test/java/org/jvalue/ods/coreservice/model/notification/NotificationConfigTest.java +++ /dev/null @@ -1,157 +0,0 @@ -package org.jvalue.ods.coreservice.model.notification; - -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.exc.InvalidTypeIdException; -import com.fasterxml.jackson.databind.exc.MismatchedInputException; -import org.junit.Test; -import org.jvalue.ods.coreservice.model.notification.*; - -import java.io.IOException; - -import static junit.framework.TestCase.assertTrue; -import static org.junit.Assert.assertEquals; - -public class NotificationConfigTest { - private final ObjectMapper mapper = new ObjectMapper(); - - @Test - public void testWebhookDeserialization() throws IOException { - final String configString = "{ " + - "\"condition\":\"ifthisthenthat\"," + - "\"type\":\"WEBHOOK\"," + - "\"url\":\"URRRRRL\"" + - "}"; - - WebhookNotification result = mapper.readValue(configString, WebhookNotification.class); - - assertEquals("ifthisthenthat", result.getCondition()); - assertEquals(NotificationType.WEBHOOK, result.getType()); - assertEquals("URRRRRL", result.getUrl()); - } - - @Test - public void testSlackDeserialization() throws IOException { - final String configString = "{ " + - "\"condition\":\"ifthenelse\"," + - "\"type\":\"SLACK\"," + - "\"workspaceId\":\"12\"," + - "\"channelId\":\"34\"," + - "\"secret\":\"56\"}"; - - SlackNotification result = mapper.readValue(configString, SlackNotification.class); - assertEquals("ifthenelse", result.getCondition()); - assertEquals("12", result.getWorkspaceId()); - assertEquals("34", result.getChannelId()); - assertEquals("56", result.getSecret()); - } - - @Test - public void testFirebaseDeserialization() throws IOException { - final String configString = "{ " + - "\"condition\":\"ifthenelse\"," + - "\"type\":\"FCM\"," + - "\"projectId\":\"12\"," + - "\"clientEmail\":\"fire@base.com\"," + - "\"privateKey\":\"1234\"," + - "\"topic\":\"weather\"}"; - - FirebaseNotification result = mapper.readValue(configString, FirebaseNotification.class); - assertEquals("ifthenelse", result.getCondition()); - assertEquals("12", result.getProjectId()); - assertEquals("fire@base.com", result.getClientEmail()); - assertEquals("1234", result.getPrivateKey()); - assertEquals("weather", result.getTopic()); - } - - @Test(expected = InvalidTypeIdException.class) - public void testDeserializationOfInvalidType() throws IOException { - final String configString = "{ " + - "\"condition\":\"ifthisthenthat\"," + - "\"type\":\"lol\"," + - "\"url\":\"URRRRRL\"" + - "}"; - mapper.readValue(configString, NotificationConfig.class); - } - - @Test(expected = JsonMappingException.class) - public void testDeserializationOfInvalidParams() throws IOException { - final String configString = "{ " + - "\"condition\":\"ifthisthenthat\"," + - "\"type\":\"WEBHOOK\"," + - "\"url\":\"URRRRRL\"," + - "\"extra\":\"bonus\"" + - "}"; - mapper.readValue(configString, NotificationConfig.class); - } - - @Test(expected = MismatchedInputException.class) - public void testDeserializationMissingParams() throws IOException { - final String configString = "{ " + - "\"condition\":\"ifthisthenthat\"," + - "\"type\":\"WEBHOOK\"" + - "}"; - mapper.readValue(configString, NotificationConfig.class); - } - - @Test(expected = JsonMappingException.class) - public void testDeserializationWrongType() throws IOException { - final String configString = "{ " + - "\"condition\":\"ifthenelse\"," + - "\"type\":\"SLACK\"," + - "\"projectId\":\"12\"," + - "\"clientEmail\":\"fire@base.com\"," + - "\"privateKey\":\"1234\"," + - "\"topic\":\"weather\"}"; - mapper.readValue(configString, NotificationConfig.class); - } - - @Test - public void testWebhookSerialization() { - WebhookNotification notification = new WebhookNotification("1>2", "URRL"); - - JsonNode result = mapper.valueToTree(notification); - - System.out.println(result); - assertEquals(4, result.size()); - assertEquals("1>2", result.get("condition").asText()); - assertTrue(result.has("notificationId")); // is always in testing because it is set by the JPA - assertEquals("URRL", result.get("url").asText()); - assertEquals("WEBHOOK", result.get("type").asText()); - } - - - @Test - public void testSlackSerialization() { - SlackNotification notification = new SlackNotification("1>2", "1", "2", "3"); - - JsonNode result = mapper.valueToTree(notification); - - System.out.println(result); - assertEquals(6, result.size()); - assertEquals("1>2", result.get("condition").asText()); - assertTrue(result.has("notificationId")); // is always in testing because it is set by the JPA - assertEquals("1", result.get("workspaceId").asText()); - assertEquals("2", result.get("channelId").asText()); - assertEquals("3", result.get("secret").asText()); - assertEquals("SLACK", result.get("type").asText()); - } - - @Test - public void testFirebaseSerialization() { - FirebaseNotification notification = new FirebaseNotification("1>2", "2", "a@b.c", "1", "topic"); - - JsonNode result = mapper.valueToTree(notification); - - System.out.println(result); - assertEquals(7, result.size()); - assertEquals("1>2", result.get("condition").asText()); - assertTrue(result.has("notificationId")); // is always in testing because it is set by the JPA - assertEquals("FCM", result.get("type").asText()); - assertEquals("2", result.get("projectId").asText()); - assertEquals("a@b.c", result.get("clientEmail").asText()); - assertEquals("1", result.get("privateKey").asText()); - assertEquals("topic", result.get("topic").asText()); - } -} diff --git a/core/src/test/java/org/jvalue/ods/coreservice/pipeline/PipelineManagerTest.java b/core/src/test/java/org/jvalue/ods/coreservice/pipeline/PipelineManagerTest.java index ba22a8a55..2bfc71835 100644 --- a/core/src/test/java/org/jvalue/ods/coreservice/pipeline/PipelineManagerTest.java +++ b/core/src/test/java/org/jvalue/ods/coreservice/pipeline/PipelineManagerTest.java @@ -6,8 +6,6 @@ import org.jvalue.ods.coreservice.model.*; import org.jvalue.ods.coreservice.model.event.EventType; import org.jvalue.ods.coreservice.model.event.PipelineEvent; -import org.jvalue.ods.coreservice.model.notification.NotificationConfig; -import org.jvalue.ods.coreservice.model.notification.WebhookNotification; import org.jvalue.ods.coreservice.repository.EventRepository; import org.jvalue.ods.coreservice.repository.PipelineRepository; import org.mockito.InjectMocks; @@ -43,7 +41,7 @@ public class PipelineManagerTest { public void testCreatePipeline() throws IOException { PipelineConfig config = mapper.readValue(configFile, PipelineConfig.class); - PipelineConfig expectedConfig = new PipelineConfig(config.getDatasourceId(), config.getTransformation(), config.getMetadata(), config.getNotifications()); + PipelineConfig expectedConfig = new PipelineConfig(config.getDatasourceId(), config.getTransformation(), config.getMetadata()); expectedConfig.setId(123L); when(pipelineRepository.save(config)).thenReturn(expectedConfig); @@ -60,7 +58,7 @@ public void testUpdatePipeline() throws IOException { PipelineConfig config = mapper.readValue(configFile, PipelineConfig.class); config.setId(123L); - PipelineConfig updated = new PipelineConfig(config.getDatasourceId(), null, config.getMetadata(), config.getNotifications()); + PipelineConfig updated = new PipelineConfig(config.getDatasourceId(), null, config.getMetadata()); updated.setId(123L); when(pipelineRepository.findById(123L)).thenReturn(Optional.of(config)); @@ -129,40 +127,4 @@ public void testGetLatestEvent() { verify(eventRepository).findFirstByOrderByEventIdDesc(); } - - @Test - public void testAddNotification() throws IOException { - PipelineConfig pipelineConfig = mapper.readValue(configFile, PipelineConfig.class); - pipelineConfig.setId(21L); - - when(pipelineRepository.findById(21L)).thenReturn(Optional.of(pipelineConfig)); - - NotificationConfig notificationConfig = new WebhookNotification("data.value2 === 1", "http://www.hook.org"); - - when(pipelineRepository.save(pipelineConfig)).thenReturn(pipelineConfig); - - manager.addNotification(21L, notificationConfig); - - PipelineConfig result = manager.getPipeline(21L).get(); - - assertEquals(2, result.getNotifications().size()); - assertEquals("data.value2 === 1", result.getNotifications().get(1).getCondition()); - assertEquals("http://www.hook.org", ((WebhookNotification) result.getNotifications().get(1)).getUrl()); - verify(eventRepository).save(argThat(event -> event.getEventType().equals("PIPELINE_UPDATE"))); - } - - @Test - public void testRemoveNotification() throws IOException { - PipelineConfig pipelineConfig = mapper.readValue(configFile, PipelineConfig.class); - pipelineConfig.setId(22L); - pipelineConfig.getNotifications().get(0).setNotificationId(1L); - - when(pipelineRepository.findById(22L)).thenReturn(Optional.of(pipelineConfig)); - - manager.removeNotification(22L, 1L); - - PipelineConfig result = manager.getPipeline(22L).get(); - assertEquals(0, result.getNotifications().size()); - verify(eventRepository).save(argThat(event -> event.getEventType().equals("PIPELINE_UPDATE"))); - } } diff --git a/doc/example-requests/core.http b/doc/example-requests/core.http index faeb5872a..6809d40cb 100644 --- a/doc/example-requests/core.http +++ b/doc/example-requests/core.http @@ -19,22 +19,7 @@ Content-Type: application/json "metadata": { "author": "icke", "license": "none" - }, - "notifications": [ - { - "condition": "data.test === 'abc'", - "type": "WEBHOOK", - "url": "http://www.mocky.io/v2/5dc94f7a2f0000680073eb96" - }, - { - "condition": "typeof data.test === 'string'", - "type": "FCM", - "projectId": "{{fcmProjectId}}", - "clientEmail": "{{fcmClientEmail}}", - "privateKey": "{{fcmKey}}", - "topic": "{{fcmTopic}}" - } - ] + } } @@ -52,22 +37,7 @@ Content-Type: application/json "metadata": { "author": "icke", "license": "none" - }, - "notifications": [ - { - "condition": "data.test === 'abc'", - "type": "WEBHOOK", - "url": "http://www.mocky.io/v2/5dc94f7a2f0000680073eb96" - }, - { - "condition": "typeof data.test === 'string'", - "type": "FCM", - "projectId": "{{fcmProjectId}}", - "clientEmail": "{{fcmClientEmail}}", - "privateKey": "{{fcmKey}}", - "topic": "{{fcmTopic}}" - } - ] + } } diff --git a/doc/example-requests/covid19-api/cases-per-country.http b/doc/example-requests/covid19-api/cases-per-country.http index 38858defe..58760fa0c 100644 --- a/doc/example-requests/covid19-api/cases-per-country.http +++ b/doc/example-requests/covid19-api/cases-per-country.http @@ -45,6 +45,5 @@ Content-Type: application/json }, "metadata": { "displayName":"UKHotspots" - }, - "notifications": [ ] + } } diff --git a/doc/example-requests/covid19-api/hotspot-countries.http b/doc/example-requests/covid19-api/hotspot-countries.http index 749925e20..539c0ea32 100644 --- a/doc/example-requests/covid19-api/hotspot-countries.http +++ b/doc/example-requests/covid19-api/hotspot-countries.http @@ -45,5 +45,4 @@ Content-Type: application/json "metadata": { "displayName":"HotspotCountries" }, - "notifications": [ ] } diff --git a/doc/example-requests/covid19-api/list-of-countries.http b/doc/example-requests/covid19-api/list-of-countries.http index 71040031f..5a794d3fb 100644 --- a/doc/example-requests/covid19-api/list-of-countries.http +++ b/doc/example-requests/covid19-api/list-of-countries.http @@ -1,6 +1,6 @@ @adapterUrl = http://localhost:9000/api/adapter/datasources @coreUrl = http://localhost:9000/api/core - +@notificationUrl = http://localhost:9000/api/notification ### Get List Of Countries POST {{adapterUrl}} HTTP/1.1 @@ -32,7 +32,7 @@ Content-Type: application/json # for a fresh install of the ods, the id will be 1. @dataSourceId = 1 -### Store data without modification and trigger a firebase notification +### Store data without modification POST {{coreUrl}}/pipelines HTTP/1.1 Content-Type: application/json @@ -43,15 +43,20 @@ Content-Type: application/json }, "metadata": { "displayName":"covid" - }, - "notifications": [ - { - "condition": "true", - "type": "FCM", - "projectId": "{{fcmProjectId}}", - "clientEmail": "{{fcmClientEmail}}", - "privateKey": "{{fcmKey}}", - "topic": "{{fcmTopic}}" - } - ] + } +} + + +@pipelineId = 1 +### Trigger a firebase notification +POST {{notificationUrl}}/config/fcm +Content-Type: application/json + +{ + "pipelineId": {{pipelineId}}, + "condition": "true", + "projectId": "{{fcmProjectId}}", + "clientEmail": "{{fcmClientEmail}}", + "privateKey": "{{fcmKey}}", + "topic": "{{fcmTopic}}" } diff --git a/doc/example-requests/notification.http b/doc/example-requests/notification.http new file mode 100644 index 000000000..c8ca8066e --- /dev/null +++ b/doc/example-requests/notification.http @@ -0,0 +1,59 @@ +@baseURL = http://localhost:9000/api/notification +#@baseURL = http://localhost:8080 +### Get version +GET {{baseURL}}/version HTTP/1.1 + + +### Get all notification configs for pipeline +GET {{baseURL}}/config/pipeline/17 HTTP/1.1 +Content-Type: application/json + +### Save notification webhook config +POST {{baseURL}}/config/webhook HTTP/1.1 +Content-Type: application/json + +{ + "pipelineId": 15, + "condition": "true", + "url": "http://www.mocky.io/v2/5dc94f7a2f0000680073eb96" +} + +### Get webhook config +GET {{baseURL}}/config/webhook/1 HTTP/1.1 +Content-Type: application/json + +### Edit webhook config +PUT {{baseURL}}/config/webhook/10 HTTP/1.1 +Content-Type: application/json + + +{ + "pipelineId": 17, + "condition": "true", + "url": "http://www.mocky.io/v2/5dc94f7a2f0000680073eb96" +} + + +### Delete webhook config +DELETE {{baseURL}}/config/webhook/1 HTTP/1.1 +Content-Type: application/json + +### Trigger all notifications of pipeline +POST {{baseURL}}/trigger HTTP/1.1 +Content-Type: application/json + +{ + "pipelineId": 17, + "pipelineName": "Integration-Test Pipeline 2 (not triggering)", + "dataLocation": "http://www.ods.de/data/123", + "jobResult": { + "data": { + "value1": 1 + }, + "stats": { + "durationInMilliSeconds": 500, + "startTimestamp": 12345, + "endTimestamp": 12345 + } + } +} diff --git a/doc/example-requests/pegelonline/mirror-and-cuxhaven-via-internal.http b/doc/example-requests/pegelonline/mirror-and-cuxhaven-via-internal.http index 0cc11ea67..45f7691c3 100644 --- a/doc/example-requests/pegelonline/mirror-and-cuxhaven-via-internal.http +++ b/doc/example-requests/pegelonline/mirror-and-cuxhaven-via-internal.http @@ -40,7 +40,6 @@ Content-Type: application/json "author": "icke", "license": "none" }, - "notifications": [] } @@ -57,5 +56,4 @@ Content-Type: application/json "author": "icke", "license": "none" }, - "notifications": [] } diff --git a/doc/example-requests/pegelonline/station-constanz.http b/doc/example-requests/pegelonline/station-constanz.http index 9eb97ba00..348107253 100644 --- a/doc/example-requests/pegelonline/station-constanz.http +++ b/doc/example-requests/pegelonline/station-constanz.http @@ -42,5 +42,4 @@ Content-Type: application/json "author": "icke", "license": "none" }, - "notifications": [] } diff --git a/doc/example-requests/transformation.http b/doc/example-requests/transformation.http index ae3457bcd..9061f8020 100644 --- a/doc/example-requests/transformation.http +++ b/doc/example-requests/transformation.http @@ -71,64 +71,3 @@ Content-Type: application/json }, "func": "function accessMember(object) {\nreturn object.splice(a);\n}\n data.a = accessMember(data.a);\nreturn data;" } - - -### Trigger webhook notification -POST {{baseURL}}/notification/webhook HTTP/1.1 -Content-Type: application/json - -{ - "pipelineId": 666, - "pipelineName": "peterchens pipeline", - "data": { - "eins": "one", - "zwei": 2 - }, - "dataLocation": "ods-storage", - "condition": "data.zwei > 1", - "type": "WEBHOOK", - "url": "http://www.mocky.io/v2/5185415ba171ea3a00704eed" -} - -### Trigger slack notification -### Please environment variables according to the slack workspace/channel you want to use -### For further informations on the fields see readme of the "core" subproject. -POST {{baseURL}}/notification/slack HTTP/1.1 -Content-Type: application/json - -{ - "pipelineId": 666, - "pipelineName": "peterchens pipeline", - "data": { - "eins": "one", - "zwei": 2 - }, - "dataLocation": "ods-storage", - "condition": "data.zwei > 1", - "type": "SLACK", - "workspaceId": "{{slackWorkspaceId}}", - "channelId": "{{slackChannelId}}", - "secret": "{{slackSecret}}" -} - -### Trigger firebase notification -### please set environment variables according to the credentials of your firebase project -### For further informations on the fields see readme of the "core" subproject. -POST {{baseURL}}/notification/fcm HTTP/1.1 -Content-Type: application/json - -{ - "pipelineId": 666, - "pipelineName": "peterchens pipeline", - "data": { - "eins": "one", - "zwei": 2 - }, - "dataLocation": "ods-storage", - "condition": "data.zwei > 1", - "type": "FCM", - "projectId": "{{fcmProjectId}}", - "clientEmail": "{{fcmClientEmail}}", - "privateKey": "{{fcmKey}}", - "topic": "{{fcmTopic}}" -} diff --git a/docker-compose.yml b/docker-compose.yml index ac3872a0f..8ddb8d798 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -102,7 +102,6 @@ services: - "traefik.http.routers.to-scheduler.rule=PathPrefix(`/api/scheduler`)" - "traefik.http.routers.to-scheduler.middlewares=scheduler-stripprefix@docker" - "traefik.http.middlewares.scheduler-stripprefix.stripprefix.prefixes=/api/scheduler" - # ----------------- STORAGE SERVICE (/storage) -------------------- storage: # Wraps postgres database with API image: ${DOCKER_REGISTRY}/storage @@ -174,6 +173,22 @@ services: context: ./notification/ environment: AUTH_ENABLED: 'false' #TODO: turn to true as soon as it works! + + # Postgres connection vars + PGUSER: 'notification_usr' + PGHOST: 'notification-db' + PGPASSWORD: 'admin' + PGPORT: 5432, + + # Rabbitmq connection details + AMQP_SERVICE_HOST: 'rabbitmq' + AMQP_SERVICE_USER: 'rabbit_adm' + AMQP_SERVICE_PWD: 'R4bb!7_4DM_p4SS' + + AMQP_NOTIFICATION_QUEUE: 'NOTIF_QUEUE' + depends_on: + - notification-db + - rabbitmq labels: - "traefik.enable=true" - "traefik.http.routers.to-notification.rule=PathPrefix(`/api/notification`)" @@ -181,7 +196,11 @@ services: - "traefik.http.middlewares.notification-stripprefix.stripprefix.prefixes=/api/notification" - "traefik.http.services.notification.loadbalancer.server.port=8080" - + notification-db: + image: postgres + environment: + POSTGRES_USER: 'notification_usr' + POSTGRES_PASSWORD: 'admin' # ----------------- CORE SERVICE (/core) -------------------- core: image: ${DOCKER_REGISTRY}/core diff --git a/notification/integration-test/src/mock.receiver.js b/notification/integration-test/src/mock.receiver.js index 3316850b5..79eacf345 100644 --- a/notification/integration-test/src/mock.receiver.js +++ b/notification/integration-test/src/mock.receiver.js @@ -11,53 +11,53 @@ app.use(bodyParser()) const notifications = new Map() router.get('/', async ctx => { - ctx.type = 'text/plain' - ctx.body = 'ok' + ctx.type = 'text/plain' + ctx.body = 'ok' }) router.get('/:path', async ctx => { - const path = ctx.params.path - const notification = notifications.get(path) - if (!notification) { - ctx.throw(404) - } else { - ctx.body = notification - ctx.type = 'application/json' - ctx.status = 200 - } + const path = ctx.params.path + const notification = notifications.get(path) + if (!notification) { + ctx.throw(404) + } else { + ctx.body = notification + ctx.type = 'application/json' + ctx.status = 200 + } }) router.post('/:path', async ctx => { - const path = ctx.params.path - console.log(`Notification on /${path} triggered.`) - notifications.set(path, ctx.request.body) - ctx.status = 201 + const path = ctx.params.path + console.log(`Notification on /${path} triggered.`) + notifications.set(path, ctx.request.body) + ctx.status = 201 }) router.get('/slack/*', async ctx => { - const notification = notifications.get('slack') - if (!notification) { - ctx.throw(404) - } else { - ctx.body = notification - ctx.type = 'application/json' - ctx.status = 200 - } + const notification = notifications.get('slack') + if (!notification) { + ctx.throw(404) + } else { + ctx.body = notification + ctx.type = 'application/json' + ctx.status = 200 + } }) router.post('/slack/*', async ctx => { - console.log('Slack notification triggered.') - notifications.set('slack', ctx.request.body) - ctx.status = 201 + console.log('Slack notification triggered.') + notifications.set('slack', ctx.request.body) + ctx.status = 201 }) app.use(router.routes()) const server = app.listen(PORT, () => console.log(`Starting mock notification receiver on port ${PORT}`)) -process.on('SIGTERM', async () => { - console.info('Mock-Notification-Receiver: SIGTERM signal received.') - await server.close() +process.on('SIGTERM', async() => { + console.info('Mock-Notification-Receiver: SIGTERM signal received.') + await server.close() }) -module.exports = server +module.exports = server \ No newline at end of file diff --git a/notification/integration-test/src/notification-config.test.js b/notification/integration-test/src/notification-config.test.js new file mode 100644 index 000000000..5cd7c9e86 --- /dev/null +++ b/notification/integration-test/src/notification-config.test.js @@ -0,0 +1,145 @@ +/* eslint-env jest */ +const request = require('supertest') +const waitOn = require('wait-on') + +const URL = process.env.NOTIFICATION_API || 'http://localhost:8080' + +const MOCK_RECEIVER_PORT = process.env.MOCK_RECEIVER_PORT || 8081 +const MOCK_RECEIVER_HOST = process.env.MOCK_RECEIVER_HOST || 'localhost' +const MOCK_RECEIVER_URL = 'http://' + MOCK_RECEIVER_HOST + ':' + MOCK_RECEIVER_PORT + +describe('Notification', () => { + console.log('Notification-Service URL= ' + URL) + + beforeAll(async() => { + const pingUrl = URL + '/' + console.log('Waiting for notification-service with URL: ' + pingUrl) + console.log('Waiting for mock webhook receiver with URL: ' + MOCK_RECEIVER_URL) + await waitOn({ resources: [pingUrl, MOCK_RECEIVER_URL], timeout: 50000 }) + }, 60000) + + test('GET /version', async() => { + const response = await request(URL).get('/version') + expect(response.status).toEqual(200) + expect(response.type).toEqual('text/plain') + const semanticVersionReExp = '^(0|[1-9]d*).(0|[1-9]d*).(0|[1-9]d*)' + expect(response.text).toMatch(new RegExp(semanticVersionReExp)) + }) + + + test('GET /config/pipeline/982323 requests notification configs for non-existing pipeline', async() => { + const receiverResponse = await request(URL) + .get('/config/pipeline/982323') + .send() + + expect(receiverResponse.status).toEqual(200) + + // expect empty list + expect(receiverResponse.body).toEqual({ + webhook: [], + slack: [], + firebase: [] + }) + }) + + test('GET /config/slack/487749 request slack config that does not exist', async() => { + const receiverResponse = await request(URL) + .get('/config/slack/487749') + .send() + + expect(receiverResponse.status).toEqual(404) + }) + + + test('CRUD Webhook Config', async() => { + const webhookConfig = { + pipelineId: 1, + condition: 'true', + url: MOCK_RECEIVER_URL + '/webhook1' + } + + // POST / CREATE + let notificationResponse = await request(URL) + .post('/config/webhook') + .send(webhookConfig) + expect(notificationResponse.status).toEqual(201) + const id = notificationResponse.body.id + + // compare response with initial webhook config + expect(notificationResponse.body.pipelineId).toEqual(webhookConfig.pipelineId) + expect(notificationResponse.body.condition).toEqual(webhookConfig.condition) + expect(notificationResponse.body.url).toEqual(webhookConfig.url) + + // PUT / UPDATE + webhookConfig.pipelineId = 2 + notificationResponse = await request(URL) + .put(`/config/webhook/${id}`) + .send(webhookConfig) + expect(notificationResponse.status).toEqual(200) + + // compare response with initial webhook config + expect(notificationResponse.body.id).toEqual(id) + expect(notificationResponse.body.pipelineId).toEqual(webhookConfig.pipelineId) + + // GET / RETRIEVE + notificationResponse = await request(URL) + .get(`/config/webhook/${id}`) + .send() + expect(notificationResponse.status).toEqual(200) + + // compare response with initial webhook config + expect(notificationResponse.body.id).toEqual(id) + expect(notificationResponse.body.pipelineId).toEqual(webhookConfig.pipelineId) + expect(notificationResponse.body.condition).toEqual(webhookConfig.condition) + expect(notificationResponse.body.url).toEqual(webhookConfig.url) + + // DELETE + notificationResponse = await request(URL) + .delete(`/config/webhook/${id}`) + .send() + expect(notificationResponse.status).toEqual(200) + + // GET / RETRIEVE not exist + notificationResponse = await request(URL) + .get(`/config/webhook/${id}`) + .send() + expect(notificationResponse.status).toEqual(404) + }) + + test('Get All Notification Configs for Pipeline', async() => { + const webhookConfig = { + pipelineId: 879428, + condition: 'true', + url: MOCK_RECEIVER_URL + '/webhook1' + } + + // POST / CREATE + let notificationResponse = await request(URL) + .post('/config/webhook') + .send(webhookConfig) + expect(notificationResponse.status).toEqual(201) + const id = notificationResponse.body.id + + notificationResponse = await request(URL) + .get(`/config/pipeline/${webhookConfig.pipelineId}`) + .send() + + expect(notificationResponse.status).toEqual(200) + expect(notificationResponse.body).toEqual({ + webhook: [ { + id: id, + pipelineId: webhookConfig.pipelineId, + condition: webhookConfig.condition, + url: webhookConfig.url + } ], + slack: [], + firebase: [] + }) + + // CLEANUP + notificationResponse = await request(URL) + .delete(`/config/webhook/${id}`) + .send() + expect(notificationResponse.status).toEqual(200) + }) +}) diff --git a/notification/integration-test/src/notification-execution.test.js b/notification/integration-test/src/notification-execution.test.js new file mode 100644 index 000000000..b470d9e9d --- /dev/null +++ b/notification/integration-test/src/notification-execution.test.js @@ -0,0 +1,159 @@ +/* eslint-env jest */ +const request = require('supertest') +const waitOn = require('wait-on') + +const URL = process.env.NOTIFICATION_API || 'http://localhost:8080' + +const MOCK_RECEIVER_PORT = process.env.MOCK_RECEIVER_PORT || 8081 +const MOCK_RECEIVER_HOST = process.env.MOCK_RECEIVER_HOST || 'localhost' +const MOCK_RECEIVER_URL = 'http://' + MOCK_RECEIVER_HOST + ':' + MOCK_RECEIVER_PORT + +describe('Notification', () => { + console.log('Notification-Service URL= ' + URL) + + beforeAll(async() => { + const pingUrl = URL + '/' + console.log('Waiting for notification-service with URL: ' + pingUrl) + console.log('Waiting for mock webhook receiver with URL: ' + MOCK_RECEIVER_URL) + await waitOn({ resources: [pingUrl, MOCK_RECEIVER_URL], timeout: 50000 }) + }, 60000) + + test('Trigger webhook', async() => { + // SETUP: store notification config + const webhookConfig = { + pipelineId: 1, + condition: 'data.value1 > 0', + url: MOCK_RECEIVER_URL + '/webhook1' + } + const notificationResponse = await request(URL) + .post('/config/webhook') + .send(webhookConfig) + expect(notificationResponse.status).toEqual(201) + const id = notificationResponse.body.id + + // SETUP: trigger event + const dataLocation = 'storage/1234' + const triggerEvent = { + pipelineId: 1, + pipelineName: "Integration-Test Pipeline 1", + dataLocation: dataLocation, + data: { + value1: 1 + } + } + + // ACT + const notificationTriggerResponse = await request(URL) + .post('/trigger') + .send(triggerEvent) + + expect(notificationTriggerResponse.status).toEqual(200) + await sleep(3000) // wait for processing + + // ASSERT + const receiverResponse = await request(MOCK_RECEIVER_URL) + .get('/webhook1') + + expect(receiverResponse.status).toEqual(200) + expect(receiverResponse.body.location).toEqual(dataLocation) + }, 10000) + + test('Trigger not notifying webhook when condition is false', async() => { + // SETUP: store notification config + const webhookConfig = { + pipelineId: 2, + condition: 'data.value1 < 0', + url: MOCK_RECEIVER_URL + '/webhook2' + } + let notificationResponse = await request(URL) + .post('/config/webhook') + .send(webhookConfig) + expect(notificationResponse.status).toEqual(201) + const id = notificationResponse.body.id + + // SETUP: trigger event + const dataLocation = 'storage/1234' + const triggerEvent = { + pipelineId: 2, + pipelineName: "Integration-Test Pipeline 2 (not triggering)", + dataLocation: dataLocation, + data: { + value1: 1 + } + } + // ACT + const notificationTriggerResponse = await request(URL) + .post('/trigger') + .send(triggerEvent) + expect(notificationTriggerResponse.status).toEqual(200) + await sleep(3000) // wait for processing + + // ASSERT + const receiverResponse = await request(MOCK_RECEIVER_URL) + .get('/webhook2') + .send() + expect(receiverResponse.status).toEqual(404) + + // CLEANUP + notificationResponse = await request(URL) + .delete(`/config/webhook/${id}`) + .send() + expect(notificationResponse.status).toEqual(200) + + console.log("1") + }, 10000) + + test('POST /slack triggers slack notification', async() => { + // SETUP: store notification config + const slackConfig = { + pipelineId: 3, + condition: 'typeof data.niceString === "string"', + channelId: '12', + workspaceId: '34', + secret: '56' + } + let notificationResponse = await request(URL) + .post('/config/slack') + .send(slackConfig) + expect(notificationResponse.status).toEqual(201) + const id = notificationResponse.body.id + + // SETUP: trigger event + const dataLocation = 'storage/234' + const triggerEvent = { + pipelineId: 3, + pipelineName: "Integration-Test Pipeline 3 (Slack)", + dataLocation: dataLocation, + data: { + niceString: 'nice' + } + } + + // ACT + const notificationTriggerResponse = await request(URL) + .post('/trigger') + .send(triggerEvent) + expect(notificationTriggerResponse.status).toEqual(200) + await sleep(3000) // wait for processing + + // ASSERT + const receiverResponse = await request(MOCK_RECEIVER_URL) + .get('/slack/12/34/56') + .send() + + expect(receiverResponse.status).toEqual(200) + expect(receiverResponse.body.text).toMatch(`${triggerEvent.pipelineName}`) + expect(receiverResponse.body.text).toMatch(`${triggerEvent.pipelineId}`) + expect(receiverResponse.body.text).toMatch(`${triggerEvent.dataLocation}`) + + // CLEANUP + notificationResponse = await request(URL) + .delete(`/config/slack/${id}`) + .send() + expect(notificationResponse.status).toEqual(200) + }, 10000) + + function sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms)) + } +}) diff --git a/notification/integration-test/src/notification.test.js b/notification/integration-test/src/notification.test.js deleted file mode 100644 index 8c797b36d..000000000 --- a/notification/integration-test/src/notification.test.js +++ /dev/null @@ -1,117 +0,0 @@ -/* eslint-env jest */ -const request = require('supertest') -const waitOn = require('wait-on') - -const URL = process.env.NOTIFICATION_API || 'http://localhost:8080' - -const MOCK_RECEIVER_PORT = process.env.MOCK_RECEIVER_PORT || 8081 -const MOCK_RECEIVER_HOST = process.env.MOCK_RECEIVER_HOST || 'localhost' -const MOCK_RECEIVER_URL = 'http://' + MOCK_RECEIVER_HOST + ':' + MOCK_RECEIVER_PORT - -describe('Scheduler', () => { - console.log('Scheduler-Service URL= ' + URL) - - beforeAll(async () => { - const pingUrl = URL + '/' - console.log('Waiting for notification-service with URL: ' + pingUrl) - console.log('Waiting for mock webhook receiver with URL: ' + MOCK_RECEIVER_URL) - await waitOn({ resources: [pingUrl, MOCK_RECEIVER_URL], timeout: 50000 }) - }, 60000) - - test('GET /version', async () => { - const response = await request(URL).get('/version') - expect(response.status).toEqual(200) - expect(response.type).toEqual('text/plain') - const semanticVersionReExp = '^(0|[1-9]d*).(0|[1-9]d*).(0|[1-9]d*)' - expect(response.text).toMatch(new RegExp(semanticVersionReExp)) - }) - - test('POST /webhook triggers webhook', async () => { - const dataLocation = 'storage/1234' - const notificationJob = { - pipelineName: 'webhookpipeline', - pipelineId: 1, - dataLocation: dataLocation, - data: { - value1: 1 - }, - condition: 'data.value1 > 0', - type: 'WEBHOOK', - url: MOCK_RECEIVER_URL + '/webhook1' - } - - const notificationResponse = await request(URL) - .post('/webhook') - .send(notificationJob) - - expect(notificationResponse.status).toEqual(200) - await sleep(3000) // wait for processing - - const receiverResponse = await request(MOCK_RECEIVER_URL) - .get('/webhook1') - - expect(receiverResponse.status).toEqual(200) - expect(receiverResponse.body.location).toEqual(dataLocation) - }) - - test('POST /webhook does not trigger webhook when condition is false', async () => { - const notificationJob = { - pipelineName: 'do not trigger', - pipelineId: 2, - dataLocation: 'storage/1234', - data: { - value1: 1 - }, - condition: 'data.value1 < 0', - url: MOCK_RECEIVER_URL + '/webhook2', - type: 'WEBHOOK' - } - - const notificationResponse = await request(URL) - .post('/webhook') - .send(notificationJob) - - expect(notificationResponse.status).toEqual(200) - await sleep(3000) - - const receiverResponse = await request(MOCK_RECEIVER_URL) - .get('/webhook2') - - expect(receiverResponse.status).toEqual(404) - }) - - test('POST /slack triggers slack notification', async () => { - const dataLocation = 'storage/234' - const slackJob = { - pipelineName: 'peterchens pipeline', - pipelineId: 666, - dataLocation, - data: { - niceString: 'nice' - }, - condition: 'typeof data.niceString === "string"', - type: 'SLACK', - channelId: '12', - workspaceId: '34', - secret: '56' - } - - const notificationResponse = await request(URL) - .post('/slack') - .send(slackJob) - expect(notificationResponse.status).toEqual(200) - - await sleep(3000) - - const receiverResponse = await request(MOCK_RECEIVER_URL) - .get('/slack/12/34/56') - - expect(receiverResponse.status).toEqual(200) - expect(receiverResponse.body.text) - .toEqual(`Pipeline ${slackJob.pipelineName}(${slackJob.pipelineId}) has new data available. Fetch at ${dataLocation}.`) - }) - - function sleep (ms) { - return new Promise(resolve => setTimeout(resolve, ms)) - } -}) diff --git a/notification/jest.config.js b/notification/jest.config.js index bf5c9268f..38abe9e6d 100644 --- a/notification/jest.config.js +++ b/notification/jest.config.js @@ -1,5 +1,5 @@ module.exports = { - preset: 'ts-jest', - testEnvironment: 'node', - roots: ['./src'] + preset: 'ts-jest', + testEnvironment: 'node', + roots: ['./src'] } diff --git a/notification/package-lock.json b/notification/package-lock.json index 853bf0040..7f98cfacd 100644 --- a/notification/package-lock.json +++ b/notification/package-lock.json @@ -14,19 +14,19 @@ } }, "@babel/core": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.2.tgz", - "integrity": "sha512-KQmV9yguEjQsXqyOUGKjS4+3K8/DlOCE2pZcq4augdQmtTy5iv5EHtmMSJ7V4c1BIPjuwtZYqYLCq9Ga+hGBRQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.1.tgz", + "integrity": "sha512-u8XiZ6sMXW/gPmoP5ijonSUln4unazG291X0XAQ5h0s8qnAFr6BRRZGUEK+jtRWdmB0NTJQt7Uga25q8GetIIg==", "dev": true, "requires": { "@babel/code-frame": "^7.10.1", - "@babel/generator": "^7.10.2", + "@babel/generator": "^7.10.1", "@babel/helper-module-transforms": "^7.10.1", "@babel/helpers": "^7.10.1", - "@babel/parser": "^7.10.2", + "@babel/parser": "^7.10.1", "@babel/template": "^7.10.1", "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.2", + "@babel/types": "^7.10.1", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", @@ -66,15 +66,6 @@ "ms": "^2.1.1" } }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -90,12 +81,12 @@ } }, "@babel/generator": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", - "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.1.tgz", + "integrity": "sha512-AT0YPLQw9DI21tliuJIdplVfLHya6mcGa8ctkv7n4Qv+hYacJrKmNWIteAK1P9iyLikFIAkwqJ7HAOqIDLFfgA==", "dev": true, "requires": { - "@babel/types": "^7.10.2", + "@babel/types": "^7.10.1", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" @@ -237,9 +228,9 @@ } }, "@babel/parser": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", - "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.1.tgz", + "integrity": "sha512-AUTksaz3FqugBkbTZ1i+lDLG5qy8hIzCaAxEtttU6C0BtZZU9pkNZtWSVAht4EW9kl46YBiyTGMp9xTTGqViNg==", "dev": true }, "@babel/plugin-syntax-async-generators": { @@ -420,9 +411,9 @@ } }, "@babel/types": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", - "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.1.tgz", + "integrity": "sha512-L2yqUOpf3tzlW9GVuipgLEcZxnO+96SzR6fjXMuxxNkIgFJ5+07mHCZ+HkHqaeZu8+3LKnNJJ1bKbjBETQAsrA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.1", @@ -457,11 +448,11 @@ "integrity": "sha512-88h74TMQ6wXChPA6h9Q3E1Jg6TkTHep2+k63OWg3s0ozyGVMeY+TTOti7PFPzq5RhszQPQOoCi59es4MaRvgCw==" }, "@firebase/component": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.1.13.tgz", - "integrity": "sha512-DuSIM96NQkE3Yo77IOa5BWw8VBdvCR5cbMLNiFT4X3dTU15Dm0zHjncQHt/6rQpABGNYWAfOCJmSU1v6vc3DFA==", + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.1.12.tgz", + "integrity": "sha512-03w800MxR/EW1m7N0Q46WNcngwdDIHDWpFPHTdbZEI6U/HuLks5RJQlBxWqb1P73nYPkN8YP3U8gTdqrDpqY3Q==", "requires": { - "@firebase/util": "0.2.48", + "@firebase/util": "0.2.47", "tslib": "1.11.1" }, "dependencies": { @@ -473,15 +464,15 @@ } }, "@firebase/database": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.6.4.tgz", - "integrity": "sha512-m3jaElEEXhr3a9D+M/kbDuRCQG5EmrnSqyEq7iNk3s5ankIrALid0AYm2RZF764F/DIeMFtAzng4EyyEqsaQlQ==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.6.3.tgz", + "integrity": "sha512-gHoCISHQVLoq+rGu+PorYxMkhsjhXov3ocBxz/0uVdznNhrbKkAZaEKF+dIAsUPDlwSYeZuwWuik7xcV3DtRaw==", "requires": { "@firebase/auth-interop-types": "0.1.5", - "@firebase/component": "0.1.13", + "@firebase/component": "0.1.12", "@firebase/database-types": "0.5.1", - "@firebase/logger": "0.2.5", - "@firebase/util": "0.2.48", + "@firebase/logger": "0.2.4", + "@firebase/util": "0.2.47", "faye-websocket": "0.11.3", "tslib": "1.11.1" }, @@ -502,14 +493,14 @@ } }, "@firebase/logger": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.2.5.tgz", - "integrity": "sha512-qqw3m0tWs/qrg7axTZG/QZq24DIMdSY6dGoWuBn08ddq7+GLF5HiqkRj71XznYeUUbfRq5W9C/PSFnN4JxX+WA==" + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.2.4.tgz", + "integrity": "sha512-akHkOU7izYB1okp/B5sxClGjjw6KvZdSHyjNM5pKd67Zg5W6PsbkI/GFNv21+y6LkUkJwDRbdeDgJoYXWT3mMA==" }, "@firebase/util": { - "version": "0.2.48", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.2.48.tgz", - "integrity": "sha512-6Wzq6IBF//3mrMTmTQ+JmceM0PMQpxV2GVfXhZn/4sMMkkhB0MA908nPDnatoHwUKyWE3BMw+uTLkyBnkuTu5A==", + "version": "0.2.47", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.2.47.tgz", + "integrity": "sha512-RjcIvcfswyxYhf0OMXod+qeI/933wl9FGLIszf0/O1yMZ/s8moXcse7xnOpMjmQPRLB9vHzCMoxW5X90kKg/bQ==", "requires": { "tslib": "1.11.1" }, @@ -539,16 +530,44 @@ } }, "@google-cloud/firestore": { - "version": "3.8.5", - "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-3.8.5.tgz", - "integrity": "sha512-MMUiQRhraXybayNZ6vbs+tLUq/TwXi7i40NEY9W5Wo5f4tX3SxX0km6FFbnNBy6pAEwpkZ02s0RMVy/RsMeGqA==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-3.8.1.tgz", + "integrity": "sha512-gI9XZlGqQfWnn5KUq6XfdwZqlzZMuOKlHYF/WsKSWtSbDYE/FhNNoT5M3ujjnssaUIXMk5gOhw47AWod07ZuAg==", "optional": true, "requires": { "deep-equal": "^2.0.0", "functional-red-black-tree": "^1.0.1", - "google-gax": "^1.15.3", + "google-gax": "^1.13.0", "readable-stream": "^3.4.0", "through2": "^3.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "optional": 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==", + "optional": 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==", + "optional": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } } }, "@google-cloud/paginator": { @@ -603,36 +622,67 @@ "xdg-basedir": "^4.0.0" }, "dependencies": { - "gaxios": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-3.0.3.tgz", - "integrity": "sha512-PkzQludeIFhd535/yucALT/Wxyj/y2zLyrMwPcJmnLHDugmV49NvAi/vb+VUq/eWztATZCNcb8ue+ywPG+oLuw==", - "optional": true, - "requires": { - "abort-controller": "^3.0.0", - "extend": "^3.0.2", - "https-proxy-agent": "^5.0.0", - "is-stream": "^2.0.0", - "node-fetch": "^2.3.0" - } - }, "mime": { "version": "2.4.6", "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", "optional": 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==", + "optional": 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==", + "optional": 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==", + "optional": true, + "requires": { + "safe-buffer": "~5.2.0" + } } } }, "@grpc/grpc-js": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.0.5.tgz", - "integrity": "sha512-Hm+xOiqAhcpT9RYM8lc15dbQD7aQurM7ZU8ulmulepiPlN7iwBXXwP3vSBUimoFoApRqz7pSIisXU8pZaCB4og==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.0.4.tgz", + "integrity": "sha512-Qawt6HUrEmljQMPWnLnIXpcjelmtIAydi3M9awiG02WWJ1CmIvFEx4IOC1EsWUWUlabOGksRbpfvoIeZKFTNXw==", "optional": true, "requires": { + "google-auth-library": "^6.0.0", "semver": "^6.2.0" }, "dependencies": { + "google-auth-library": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-6.0.0.tgz", + "integrity": "sha512-uLydy1t6SHN/EvYUJrtN3GCHFrnJ0c8HJjOxXiGjoTuYHIoCUT3jVxnzmjHwVnSdkfE9Akasm2rM6qG1COTXfQ==", + "optional": true, + "requires": { + "arrify": "^2.0.0", + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "fast-text-encoding": "^1.0.0", + "gaxios": "^3.0.0", + "gcp-metadata": "^4.0.0", + "gtoken": "^5.0.0", + "jws": "^4.0.0", + "lru-cache": "^5.0.0" + } + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -842,6 +892,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "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 + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -971,6 +1027,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "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 + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -997,6 +1059,14 @@ "callsites": "^3.0.0", "graceful-fs": "^4.2.4", "source-map": "^0.6.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==", + "dev": true + } } }, "@jest/test-result": { @@ -1022,6 +1092,14 @@ "jest-haste-map": "^25.5.1", "jest-runner": "^25.5.4", "jest-runtime": "^25.5.4" + }, + "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==", + "dev": true + } } }, "@jest/transform": { @@ -1083,6 +1161,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "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 + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -1243,10 +1327,20 @@ "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "optional": true }, + "@types/amqplib": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/@types/amqplib/-/amqplib-0.5.13.tgz", + "integrity": "sha512-0r8cJfUajAlcHxlJsZyqRrSAYzv+pJPsaAQjDC6e5rACi3AOIuR0AfevJG7NLvw3Qu4EGhf3KS/ECwd5cUAY2A==", + "dev": true, + "requires": { + "@types/bluebird": "*", + "@types/node": "*" + } + }, "@types/babel__core": { - "version": "7.1.8", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.8.tgz", - "integrity": "sha512-KXBiQG2OXvaPWFPDS1rD8yV9vO0OuWIqAEqLsbfX0oU2REN5KuoMnZ1gClWcBhO5I3n6oTVAmrMufOvRqdmFTQ==", + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.7.tgz", + "integrity": "sha512-RL62NqSFPCDK2FM1pSDH0scHpJvsXtZNiYlMB73DgPBaG1E38ZYVL+ei5EkWRbr+KC4YNiAUNBnRj+bgwpgjMw==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -1276,14 +1370,20 @@ } }, "@types/babel__traverse": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.12.tgz", - "integrity": "sha512-t4CoEokHTfcyfb4hUaF9oOHu9RmmNWnm1CP0YmMqOOfClKascOmvlEM736vlqeScuGvBDsHkf8R2INd4DWreQA==", + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.11.tgz", + "integrity": "sha512-ddHK5icION5U6q11+tV2f9Mo6CZVuT8GJKld2q9LqHSZbvLbH34Kcu2yFGckZut453+eQU6btIA3RihmnRgI+Q==", "dev": true, "requires": { "@babel/types": "^7.3.0" } }, + "@types/bluebird": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.32.tgz", + "integrity": "sha512-dIOxFfI0C+jz89g6lQ+TqhGgPQ0MxSnh/E4xuC0blhFtyW269+mPG5QeLgbdwst/LvdP8o1y0o/Gz5EHXLec/g==", + "dev": true + }, "@types/body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", @@ -1297,8 +1397,7 @@ "@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", - "dev": true + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" }, "@types/connect": { "version": "3.4.33", @@ -1381,9 +1480,9 @@ } }, "@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==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.2.tgz", + "integrity": "sha512-rsZg7eL+Xcxsxk2XlBt9KcG8nOp9iYdKCOikY9x2RFJCyOdNj4MKPQty0e8oZr29vVAzKXr1BmR+kZauti3o1w==", "dev": true }, "@types/istanbul-lib-report": { @@ -1416,9 +1515,9 @@ } }, "@types/json-schema": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", - "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", + "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", "dev": true }, "@types/json5": { @@ -1459,6 +1558,22 @@ "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", "dev": true }, + "@types/pg": { + "version": "7.14.3", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-7.14.3.tgz", + "integrity": "sha512-go5zddQ1FrUQHeBvqPzQ1svKo4KKucSwvqLsvwc/EIuQ9sxDA21b68xc/RwhzAK5pPCnez8NrkYatFIGdJBVvA==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/pg-types": "*" + } + }, + "@types/pg-types": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@types/pg-types/-/pg-types-1.11.5.tgz", + "integrity": "sha512-L8ogeT6vDzT1vxlW3KITTCt+BVXXVkLXfZ/XNm6UqbcJgxf+KPO7yjWx7dQQE8RW07KopL10x2gNMs41+IkMGQ==", + "dev": true + }, "@types/prettier": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-1.19.1.tgz", @@ -1721,6 +1836,19 @@ "uri-js": "^4.2.2" } }, + "amqplib": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.5.6.tgz", + "integrity": "sha512-J4TR0WAMPBHN+tgTuhNsSObfM9eTVTZm/FNw0LyaGfbiLsBxqSameDNYpChUFXW4bnTKHDXy0ab+nuLhumnRrQ==", + "requires": { + "bitsyntax": "~0.1.0", + "bluebird": "^3.5.2", + "buffer-more-ints": "~1.0.0", + "readable-stream": "1.x >=1.1.9", + "safe-buffer": "~5.1.2", + "url-parse": "~1.4.3" + } + }, "ansi-escapes": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", @@ -1741,18 +1869,21 @@ "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 + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, "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" } }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, "anymatch": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", @@ -1763,11 +1894,15 @@ "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==" + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, "requires": { "sprintf-js": "~1.0.2" } @@ -1970,6 +2105,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "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 + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -2042,8 +2183,7 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base": { "version": "0.11.2", @@ -2103,8 +2243,7 @@ "base64-js": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", - "optional": true + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" }, "bcrypt-pbkdf": { "version": "1.0.2", @@ -2121,6 +2260,21 @@ "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==", "optional": true }, + "bitsyntax": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bitsyntax/-/bitsyntax-0.1.0.tgz", + "integrity": "sha512-ikAdCnrloKmFOugAfxWws89/fPc+nw0OOG1IzIE72uSOg/A3cYptKCjSUhDTuj7fhsJtzkzlv7l3b8PzRHLN0Q==", + "requires": { + "buffer-more-ints": "~1.0.0", + "debug": "~2.6.9", + "safe-buffer": "~5.1.2" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", @@ -2147,7 +2301,6 @@ "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" @@ -2208,6 +2361,15 @@ "node-int64": "^0.4.0" } }, + "buffer": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, "buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -2218,6 +2380,16 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, + "buffer-more-ints": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-1.0.0.tgz", + "integrity": "sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==" + }, + "buffer-writer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==" + }, "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", @@ -2249,8 +2421,7 @@ "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, "capture-exit": { "version": "2.0.0", @@ -2271,7 +2442,6 @@ "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", @@ -2322,139 +2492,332 @@ "restore-cursor": "^3.1.0" } }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "cliui": { - "version": "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" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "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 - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "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 - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "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 - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "optional": true, - "requires": { - "mime-db": ">= 1.43.0 < 2" - }, - "dependencies": { - "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", - "optional": true - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", - "optional": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" - } - }, - "concurrently": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-5.2.0.tgz", - "integrity": "sha512-XxcDbQ4/43d6CxR7+iV8IZXhur4KbmEJk1CetVMUqCy34z9l0DkszbY+/9wvmSnToTej0SYomc2WSRH+L0zVJw==", - "dev": true, + "cli-highlight": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.4.tgz", + "integrity": "sha512-s7Zofobm20qriqDoU9sXptQx0t2R9PEgac92mENNm7xaEe1hn71IIMsXMK+6encA6WRCWWxIGQbipr3q998tlQ==", "requires": { - "chalk": "^2.4.2", - "date-fns": "^2.0.1", - "lodash": "^4.17.15", - "read-pkg": "^4.0.1", - "rxjs": "^6.5.2", - "spawn-command": "^0.0.2-1", - "supports-color": "^6.1.0", - "tree-kill": "^1.2.2", - "yargs": "^13.3.0" + "chalk": "^3.0.0", + "highlight.js": "^9.6.0", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^5.1.1", + "yargs": "^15.0.0" }, "dependencies": { - "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, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "requires": { - "has-flag": "^3.0.0" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } - } - } - }, - "configstore": { + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "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==", + "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==" + }, + "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==" + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.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==" + }, + "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==" + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "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==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" + }, + "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==" + }, + "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==", + "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==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "requires": { + "has-flag": "^4.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==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", + "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", + "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.1" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "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 + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "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 + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "optional": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + }, + "dependencies": { + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "optional": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "optional": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "optional": 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==", + "optional": 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==", + "optional": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, + "concurrently": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-5.2.0.tgz", + "integrity": "sha512-XxcDbQ4/43d6CxR7+iV8IZXhur4KbmEJk1CetVMUqCy34z9l0DkszbY+/9wvmSnToTej0SYomc2WSRH+L0zVJw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "date-fns": "^2.0.1", + "lodash": "^4.17.15", + "read-pkg": "^4.0.1", + "rxjs": "^6.5.2", + "spawn-command": "^0.0.2-1", + "supports-color": "^6.1.0", + "tree-kill": "^1.2.2", + "yargs": "^13.3.0" + }, + "dependencies": { + "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" + } + } + } + }, + "configstore": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", @@ -2611,8 +2974,7 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "decode-uri-component": { "version": "0.2.0", @@ -2642,6 +3004,12 @@ "which-typed-array": "^1.1.2" }, "dependencies": { + "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==", + "optional": true + }, "isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", @@ -2774,6 +3142,11 @@ "is-obj": "^2.0.0" } }, + "dotenv": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.2.0.tgz", + "integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==" + }, "duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", @@ -2800,6 +3173,15 @@ "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==", + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } } } }, @@ -2843,8 +3225,7 @@ "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 + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" }, "encodeurl": { "version": "1.0.2", @@ -2890,6 +3271,13 @@ "object.assign": "^4.1.0", "string.prototype.trimleft": "^2.1.1", "string.prototype.trimright": "^2.1.1" + }, + "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==" + } } }, "es-get-iterator": { @@ -2907,6 +3295,12 @@ "isarray": "^2.0.5" }, "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==", + "optional": true + }, "isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", @@ -2933,13 +3327,12 @@ "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 + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "escodegen": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.2.tgz", - "integrity": "sha512-InuOIiKk8wwuOFg6x9BQXbzjrQhtyXh46K9bqVTPzSo2FnyMBaYGBMC6PhQy7yxxil9vIedFBweQBMK74/7o8A==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", + "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", "dev": true, "requires": { "esprima": "^4.0.1", @@ -3071,9 +3464,9 @@ "dev": true }, "eslint-import-resolver-node": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", - "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", + "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": { "debug": "^2.6.9", @@ -3099,6 +3492,60 @@ "requires": { "debug": "^2.6.9", "pkg-dir": "^2.0.0" + }, + "dependencies": { + "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" + } + }, + "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 + }, + "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" + } + } } }, "eslint-plugin-es": { @@ -3150,6 +3597,70 @@ "isarray": "^1.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" + } + }, + "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 + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, "resolve": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", @@ -3624,6 +4135,11 @@ "bser": "2.1.1" } }, + "figlet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.4.0.tgz", + "integrity": "sha512-CxxIjEKHlqGosgXaIA+sikGDdV6KZOOlzPJnYuPgQlOSHZP5h9WIghYI30fyXnwEVeSH7Hedy72gC6zJrFC+SQ==" + }, "figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -3669,7 +4185,6 @@ "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" } @@ -3792,13 +4307,12 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", + "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", "dev": true, "optional": true }, @@ -3813,9 +4327,9 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" }, "gaxios": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-2.3.4.tgz", - "integrity": "sha512-US8UMj8C5pRnao3Zykc4AAVr+cffoNKRTg9Rsf2GiuZCW69vgJj38VK2PzlPuQU73FZ/nTk9/Av6/JGcE1N9vA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-3.0.3.tgz", + "integrity": "sha512-PkzQludeIFhd535/yucALT/Wxyj/y2zLyrMwPcJmnLHDugmV49NvAi/vb+VUq/eWztATZCNcb8ue+ywPG+oLuw==", "optional": true, "requires": { "abort-controller": "^3.0.0", @@ -3826,12 +4340,12 @@ } }, "gcp-metadata": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-3.5.0.tgz", - "integrity": "sha512-ZQf+DLZ5aKcRpLzYUyBS3yo3N0JSa82lNDO8rj3nMSlovLcz2riKFBsYgDzeXcv75oo5eqB2lx+B14UvPoCRnA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.1.0.tgz", + "integrity": "sha512-r57SV28+olVsflPlKyVig3Muo/VDlcsObMtvDGOEtEJXj+DDE8bEl0coIkXh//hbkSDTvo+f5lbihZOndYXQQQ==", "optional": true, "requires": { - "gaxios": "^2.1.0", + "gaxios": "^3.0.0", "json-bigint": "^0.3.0" } }, @@ -3847,6 +4361,21 @@ "google-auth-library": "^5.0.0", "pumpify": "^2.0.0", "stream-events": "^1.0.4" + }, + "dependencies": { + "gaxios": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-2.3.4.tgz", + "integrity": "sha512-US8UMj8C5pRnao3Zykc4AAVr+cffoNKRTg9Rsf2GiuZCW69vgJj38VK2PzlPuQU73FZ/nTk9/Av6/JGcE1N9vA==", + "optional": true, + "requires": { + "abort-controller": "^3.0.0", + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.3.0" + } + } } }, "gensync": { @@ -3858,8 +4387,7 @@ "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 + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-package-type": { "version": "0.1.0", @@ -3895,7 +4423,6 @@ "version": "7.1.4", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -3935,6 +4462,64 @@ "gtoken": "^4.1.0", "jws": "^4.0.0", "lru-cache": "^5.0.0" + }, + "dependencies": { + "gaxios": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-2.3.4.tgz", + "integrity": "sha512-US8UMj8C5pRnao3Zykc4AAVr+cffoNKRTg9Rsf2GiuZCW69vgJj38VK2PzlPuQU73FZ/nTk9/Av6/JGcE1N9vA==", + "optional": true, + "requires": { + "abort-controller": "^3.0.0", + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.3.0" + } + }, + "gcp-metadata": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-3.5.0.tgz", + "integrity": "sha512-ZQf+DLZ5aKcRpLzYUyBS3yo3N0JSa82lNDO8rj3nMSlovLcz2riKFBsYgDzeXcv75oo5eqB2lx+B14UvPoCRnA==", + "optional": true, + "requires": { + "gaxios": "^2.1.0", + "json-bigint": "^0.3.0" + } + }, + "google-p12-pem": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-2.0.4.tgz", + "integrity": "sha512-S4blHBQWZRnEW44OcR7TL9WR+QCqByRvhNDZ/uuQfpxywfupikf/miba8js1jZi6ZOGv5slgSuoshCWh6EMDzg==", + "optional": true, + "requires": { + "node-forge": "^0.9.0" + } + }, + "gtoken": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-4.1.4.tgz", + "integrity": "sha512-VxirzD0SWoFUo5p8RDP8Jt2AGyOmyYcT/pOUgDKJCK+iSw0TMqwrVfY37RXTNmoKwrzmDHSk0GMT9FsgVmnVSA==", + "optional": true, + "requires": { + "gaxios": "^2.1.0", + "google-p12-pem": "^2.0.0", + "jws": "^4.0.0", + "mime": "^2.2.0" + } + }, + "mime": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", + "optional": true + }, + "node-forge": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.1.tgz", + "integrity": "sha512-G6RlQt5Sb4GMBzXvhfkeFmbqR6MzhtnT7VTHuLadjkii3rdYHNdw0m8zA4BTxVIh68FicCQ2NSUANpsqkr9jvQ==", + "optional": true + } } }, "google-gax": { @@ -3969,9 +4554,9 @@ } }, "google-p12-pem": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-2.0.4.tgz", - "integrity": "sha512-S4blHBQWZRnEW44OcR7TL9WR+QCqByRvhNDZ/uuQfpxywfupikf/miba8js1jZi6ZOGv5slgSuoshCWh6EMDzg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.0.1.tgz", + "integrity": "sha512-VlQgtozgNVVVcYTXS36eQz4PXPt9gIPqLOhHN0QiV6W6h4qSCNVKPtKC5INtJsaHHF2r7+nOIa26MJeJMTaZEQ==", "optional": true, "requires": { "node-forge": "^0.9.0" @@ -3986,9 +4571,9 @@ } }, "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==" + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" }, "growly": { "version": "1.3.0", @@ -3998,13 +4583,13 @@ "optional": true }, "gtoken": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-4.1.4.tgz", - "integrity": "sha512-VxirzD0SWoFUo5p8RDP8Jt2AGyOmyYcT/pOUgDKJCK+iSw0TMqwrVfY37RXTNmoKwrzmDHSk0GMT9FsgVmnVSA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.0.1.tgz", + "integrity": "sha512-33w4FNDkUcyIOq/TqyC+drnKdI4PdXmWp9lZzssyEQKuvu9ZFN3KttaSnDKo52U3E51oujVGop93mKxmqO8HHg==", "optional": true, "requires": { - "gaxios": "^2.1.0", - "google-p12-pem": "^2.0.0", + "gaxios": "^3.0.0", + "google-p12-pem": "^3.0.0", "jws": "^4.0.0", "mime": "^2.2.0" }, @@ -4041,16 +4626,30 @@ "function-bind": "^1.1.1" } }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.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=" + } + } + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "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==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" }, "has-value": { "version": "1.0.0", @@ -4128,6 +4727,15 @@ "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==", + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, "through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -4149,6 +4757,11 @@ "minimalistic-assert": "^1.0.1" } }, + "highlight.js": { + "version": "9.18.1", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.18.1.tgz", + "integrity": "sha512-OrVKYz70LHsnCgmbXctv/bfuvntIKDz177h0Co37DQ5jamGZLVmoCVMtjMtNZY3X9DrCcKfklHPNeA0uPZhSJg==" + }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -4160,9 +4773,9 @@ } }, "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.4.tgz", + "integrity": "sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==", "dev": true }, "html-encoding-sniffer": { @@ -4277,6 +4890,11 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -4290,72 +4908,27 @@ "dev": true, "requires": { "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "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 - } - } - }, - "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": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.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": { + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true - }, - "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": { - "find-up": "^4.0.0" - } } } }, + "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": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -4365,7 +4938,6 @@ "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" @@ -4573,9 +5145,9 @@ "dev": true }, "is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==" + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" }, "is-ci": { "version": "2.0.0", @@ -4607,9 +5179,9 @@ } }, "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==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" }, "is-descriptor": { "version": "0.1.6", @@ -4652,8 +5224,7 @@ "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 + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "is-generator-fn": { "version": "2.1.0", @@ -4710,11 +5281,11 @@ "dev": true }, "is-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", - "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", "requires": { - "has-symbols": "^1.0.1" + "has": "^1.0.3" } }, "is-set": { @@ -4740,11 +5311,11 @@ "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==" }, "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==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", "requires": { - "has-symbols": "^1.0.1" + "has-symbols": "^1.0.0" } }, "is-typed-array": { @@ -4757,6 +5328,14 @@ "es-abstract": "^1.17.4", "foreach": "^2.0.5", "has-symbols": "^1.0.1" + }, + "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==", + "optional": true + } } }, "is-typedarray": { @@ -4980,6 +5559,12 @@ "path-exists": "^4.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 + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -5267,6 +5852,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "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 + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -5485,6 +6076,12 @@ "which": "^2.0.2" }, "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==", + "dev": true + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -5698,6 +6295,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "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 + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -5788,15 +6391,11 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "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" - } + "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 }, "has-flag": { "version": "4.0.0", @@ -5804,73 +6403,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "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" - } - }, - "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" - } - }, - "parse-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", - "lines-and-columns": "^1.1.6" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "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" - } - }, "resolve": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", @@ -5964,6 +6496,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "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 + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -6077,6 +6615,12 @@ "path-exists": "^4.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 + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -6197,6 +6741,14 @@ "dev": true, "requires": { "graceful-fs": "^4.2.4" + }, + "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==", + "dev": true + } } }, "jest-snapshot": { @@ -6257,6 +6809,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "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 + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -6328,6 +6886,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "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 + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -6514,7 +7078,6 @@ "version": "3.13.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -6523,8 +7086,7 @@ "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" } } }, @@ -6614,12 +7176,12 @@ "dev": true }, "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", "dev": true, "requires": { - "minimist": "^1.2.0" + "minimist": "^1.2.5" } }, "jsonwebtoken": { @@ -6778,7 +7340,6 @@ "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" @@ -6992,7 +7553,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -7025,20 +7585,12 @@ } }, "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "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": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } + "minimist": "^1.2.5" } }, "ms": { @@ -7052,6 +7604,16 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -7332,9 +7894,9 @@ "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==", + "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==", "requires": { "p-try": "^2.0.0" } @@ -7343,7 +7905,6 @@ "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" } @@ -7353,6 +7914,11 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, + "packet-reader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", + "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -7362,6 +7928,11 @@ "callsites": "^3.0.0" } }, + "parent-require": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parent-require/-/parent-require-1.0.0.tgz", + "integrity": "sha1-dGoWdjgIOoYLDu9nMssn7UbDKXc=" + }, "parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", @@ -7378,6 +7949,21 @@ "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", "dev": true }, + "parse5-htmlparser2-tree-adapter": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-5.1.1.tgz", + "integrity": "sha512-CF+TKjXqoqyDwHqBhFQ+3l5t83xYi6fVT1tQNg+Ye0JRLnTxWvIroCjEp1A0k4lneHNBGnICUf0cfYVYGEazqw==", + "requires": { + "parse5": "^5.1.1" + }, + "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==" + } + } + }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -7392,14 +7978,12 @@ "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 + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" }, "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 + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-key": { "version": "2.0.1", @@ -7441,6 +8025,68 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, + "pg": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.2.1.tgz", + "integrity": "sha512-DKzffhpkWRr9jx7vKxA+ur79KG+SKw+PdjMb1IRhMiKI9zqYUGczwFprqy+5Veh/DCcFs1Y6V8lRLN5I1DlleQ==", + "requires": { + "buffer-writer": "2.0.0", + "packet-reader": "1.0.0", + "pg-connection-string": "^2.2.3", + "pg-pool": "^3.2.1", + "pg-protocol": "^1.2.4", + "pg-types": "^2.1.0", + "pgpass": "1.x", + "semver": "4.3.2" + }, + "dependencies": { + "semver": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.2.tgz", + "integrity": "sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c=" + } + } + }, + "pg-connection-string": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.2.3.tgz", + "integrity": "sha512-I/KCSQGmOrZx6sMHXkOs2MjddrYcqpza3Dtsy0AjIgBr/bZiPJRK9WhABXN1Uy1UDazRbi9gZEzO2sAhL5EqiQ==" + }, + "pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==" + }, + "pg-pool": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.2.1.tgz", + "integrity": "sha512-BQDPWUeKenVrMMDN9opfns/kZo4lxmSWhIqo+cSAF7+lfi9ZclQbr9vfnlNaPr8wYF3UYjm5X0yPAhbcgqNOdA==" + }, + "pg-protocol": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.2.4.tgz", + "integrity": "sha512-/8L/G+vW/VhWjTGXpGh8XVkXOFx1ZDY+Yuz//Ab8CfjInzFkreI+fDG3WjCeSra7fIZwAFxzbGptNbm8xSXenw==" + }, + "pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "requires": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + } + }, + "pgpass": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.2.tgz", + "integrity": "sha1-Knu0G2BltnkH6R2hsHwYR8h3swY=", + "requires": { + "split": "^1.0.0" + } + }, "picomatch": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", @@ -7463,55 +8109,46 @@ } }, "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "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": { - "find-up": "^2.1.0" + "find-up": "^4.0.0" }, "dependencies": { "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "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": "^2.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.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" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "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-try": "^1.0.0" + "p-locate": "^4.1.0" } }, "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "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": "^1.1.0" + "p-limit": "^2.2.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=", + "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 } } @@ -7528,6 +8165,29 @@ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", "dev": true }, + "postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==" + }, + "postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=" + }, + "postgres-date": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.5.tgz", + "integrity": "sha512-pdau6GRPERdAYUQwkBnGKxEfPyhVZXG/JiS44iZWiNdSOWE09N2lUgN6yshuq6fVSon4Pm0VMXd1srUUkLe9iA==" + }, + "postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "requires": { + "xtend": "^4.0.0" + } + }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -7617,9 +8277,9 @@ }, "dependencies": { "@types/node": { - "version": "13.13.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.12.tgz", - "integrity": "sha512-zWz/8NEPxoXNT9YyF2osqyA9WjssZukYpgI4UYZpOjcyqwIUqWGkcCionaEb9Ki+FULyPyvNFpg/329Kd2/pbw==", + "version": "13.13.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.9.tgz", + "integrity": "sha512-EPZBIGed5gNnfWCiwEIwTE2Jdg4813odnG8iNPMQGrqVxrI+wL68SPtPeCX+ZxGBaA6pKAVc6jaKgP/Q0QzfdQ==", "optional": true } } @@ -7665,10 +8325,36 @@ "integrity": "sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA==", "optional": true, "requires": { - "end-of-stream": "^1.4.1", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1", - "stream-shift": "^1.0.0" + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.0" + } + }, + "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==", + "optional": 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==", + "optional": 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==", + "optional": true, + "requires": { + "safe-buffer": "~5.2.0" } } } @@ -7684,6 +8370,11 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" }, + "querystringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==" + }, "random-bytes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", @@ -7723,80 +8414,100 @@ } }, "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=", + "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": "^2.0.0", - "read-pkg": "^2.0.0" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" }, "dependencies": { "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "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": "^2.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "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": "^2.0.0", - "path-exists": "^3.0.0" + "p-locate": "^4.1.0" } }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "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-try": "^1.0.0" + "p-limit": "^2.2.0" } }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", "dev": true, "requires": { - "p-limit": "^1.1.0" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" } }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "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 }, "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^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 + } } } } }, "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==", - "optional": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } } }, "realpath-native": { @@ -7805,6 +8516,11 @@ "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==", "dev": true }, + "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==" + }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", @@ -7936,14 +8652,17 @@ "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 + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, "resolve": { "version": "1.11.1", @@ -8211,6 +8930,11 @@ } } }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, "saxes": { "version": "3.1.11", "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", @@ -8267,8 +8991,7 @@ "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, "set-value": { "version": "2.0.1", @@ -8298,6 +9021,15 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -8519,9 +9251,9 @@ "dev": true }, "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", @@ -8529,15 +9261,15 @@ } }, "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==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", "dev": true }, "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "dev": true, "requires": { "spdx-exceptions": "^2.1.0", @@ -8550,6 +9282,14 @@ "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", "dev": true }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "requires": { + "through": "2" + } + }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -8562,8 +9302,7 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "sshpk": { "version": "1.16.1", @@ -8654,7 +9393,6 @@ "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", @@ -8662,12 +9400,60 @@ } }, "string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", - "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.0.tgz", + "integrity": "sha512-EEJnGqa/xNfIg05SxiPSqRS7S9qwDhYts1TSLR1BQfYUfPe1stofgGKvwERK9+9yf+PpfBMlpBaCHucXGPQfUA==", "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.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==", + "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==" + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "requires": { + "has": "^1.0.3" + } + } } }, "string.prototype.trimleft": { @@ -8678,6 +9464,54 @@ "define-properties": "^1.1.3", "es-abstract": "^1.17.5", "string.prototype.trimstart": "^1.0.0" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.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==", + "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==" + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "requires": { + "has": "^1.0.3" + } + } } }, "string.prototype.trimright": { @@ -8688,31 +9522,122 @@ "define-properties": "^1.1.3", "es-abstract": "^1.17.5", "string.prototype.trimend": "^1.0.0" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.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==", + "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==" + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "requires": { + "has": "^1.0.3" + } + } } }, "string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", - "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.0.tgz", + "integrity": "sha512-iCP8g01NFYiiBOnwG1Xc3WZLyoo+RuBymwIlWncShXDDJYWN6DbnM3odslBJdgCdRlq94B5s63NWAZlcn2CS4w==", "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.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==", + "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==" + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "requires": { + "has": "^1.0.3" + } + } } }, "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==", - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" }, "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" }, @@ -8720,8 +9645,7 @@ "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 + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" } } }, @@ -8759,7 +9683,6 @@ "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" } @@ -8877,6 +9800,22 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, + "thenify": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", + "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, "throat": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", @@ -8886,8 +9825,7 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "through2": { "version": "3.0.1", @@ -8896,6 +9834,34 @@ "optional": true, "requires": { "readable-stream": "2 || 3" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "optional": 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==", + "optional": 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==", + "optional": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } } }, "tmp": { @@ -9009,15 +9975,6 @@ "yargs-parser": "18.x" }, "dependencies": { - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -9046,13 +10003,23 @@ "json5": "^1.0.1", "minimist": "^1.2.0", "strip-bom": "^3.0.0" + }, + "dependencies": { + "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" + } + } } }, "tslib": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", - "dev": true + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" }, "tsutils": { "version": "3.17.1", @@ -9122,6 +10089,48 @@ "is-typedarray": "^1.0.0" } }, + "typeorm": { + "version": "0.2.25", + "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.2.25.tgz", + "integrity": "sha512-yzQ995fyDy5wolSLK9cmjUNcmQdixaeEm2TnXB5HN++uKbs9TiR6Y7eYAHpDlAE8s9J1uniDBgytecCZVFergQ==", + "requires": { + "app-root-path": "^3.0.0", + "buffer": "^5.1.0", + "chalk": "^2.4.2", + "cli-highlight": "^2.0.0", + "debug": "^4.1.1", + "dotenv": "^6.2.0", + "glob": "^7.1.2", + "js-yaml": "^3.13.1", + "mkdirp": "^1.0.3", + "reflect-metadata": "^0.1.13", + "sha.js": "^2.4.11", + "tslib": "^1.9.0", + "xml2js": "^0.4.17", + "yargonaut": "^1.1.2", + "yargs": "^13.2.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, "typescript": { "version": "3.9.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.5.tgz", @@ -9217,6 +10226,15 @@ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "dev": true }, + "url-parse": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -9348,9 +10366,9 @@ } }, "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==" }, "whatwg-encoding": { "version": "1.0.5", @@ -9415,8 +10433,7 @@ "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 + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, "which-typed-array": { "version": "1.1.2", @@ -9430,6 +10447,14 @@ "function-bind": "^1.1.1", "has-symbols": "^1.0.1", "is-typed-array": "^1.1.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==", + "optional": true + } } }, "word-wrap": { @@ -9442,7 +10467,6 @@ "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", @@ -9492,6 +10516,20 @@ "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", "dev": true }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" + }, "xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", @@ -9506,8 +10544,7 @@ "y18n": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" }, "yallist": { "version": "3.1.1", @@ -9515,11 +10552,57 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "optional": true }, + "yargonaut": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/yargonaut/-/yargonaut-1.1.4.tgz", + "integrity": "sha512-rHgFmbgXAAzl+1nngqOcwEljqHGG9uUZoPjsdZEs1w5JW9RXYzrSvH/u70C1JE5qFi0qjsdhnUX/dJRpWqitSA==", + "requires": { + "chalk": "^1.1.1", + "figlet": "^1.1.1", + "parent-require": "^1.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=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, "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", @@ -9537,7 +10620,6 @@ "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" diff --git a/notification/package.json b/notification/package.json index 6e9837287..bd650c026 100644 --- a/notification/package.json +++ b/notification/package.json @@ -11,6 +11,7 @@ "test": "jest" }, "dependencies": { + "amqplib": "^0.5.6", "axios": "^0.19.2", "body-parser": "^1.19.0", "cors": "^2.8.5", @@ -18,9 +19,14 @@ "express-session": "^1.17.1", "firebase-admin": "^8.12.1", "keycloak-connect": "^7.0.0", - "vm2": "^3.8.3" + "pg": "^8.2.1", + "reflect-metadata": "^0.1.13", + "typeorm": "^0.2.25", + "vm2": "^3.9.2" }, "devDependencies": { + "@types/pg": "^7.14.3", + "@types/amqplib": "^0.5.13", "@types/cors": "^2.8.6", "@types/express": "^4.17.6", "@types/express-session": "^1.17.0", diff --git a/notification/src/api/amqp/amqpHandler.ts b/notification/src/api/amqp/amqpHandler.ts new file mode 100644 index 000000000..ed859e464 --- /dev/null +++ b/notification/src/api/amqp/amqpHandler.ts @@ -0,0 +1,114 @@ +import { connect, Connection, ConsumeMessage, Channel } from "amqplib/callback_api" +import { TriggerEventHandler } from "../triggerEventHandler"; +import { TransformationEvent } from '../transformationEvent'; + +/** + * This class handles the communication with the AMQP service (rabbitmq) + * It interacts with these channels: + * + * * Notification Channel: + * ---------------------- + * A channel to notify the notification service that a transformation is done. + * (see TransformationEvent for details of the event). + * + */ +export class AmqpHandler{ + notifQueueName = process.env.AMQP_NOTIFICATION_QUEUE! + + triggerEventHandler: TriggerEventHandler + + constructor(triggerEventHandler: TriggerEventHandler) { + this.triggerEventHandler = triggerEventHandler + } + + /** + * Connects to Amqp Service and initializes a channel + * + * @param retries Number of retries to connect to the notification-config db + * @param backoff Time to wait until the next retry + */ + public async connect(retries: number, backoff: number) { + const rabbit_url = process.env.AMQP_SERVICE_HOST; + const rabbit_usr = process.env.AMQP_SERVICE_USER; + const rabbit_password = process.env.AMQP_SERVICE_PWD; + const rabit_amqp_url = 'amqp://' + rabbit_usr + ':' + rabbit_password + '@' + rabbit_url; + + console.log("URL: " + rabit_amqp_url) + + let established: boolean = false // amqp service connection result + const handler: AmqpHandler = this // for ability to access methods and members in callback + let errMsg: string = '' // Error message to be shown after final retry + + for (let i = 1; i <= retries; i++) { + await this.backOff(backoff) + await connect(rabit_amqp_url, async function (error0: any, connection: Connection) { + if (error0) { + errMsg = `Error connecting to RabbitMQ: ${error0}.Retrying in ${backoff} seconds` + console.info(`Connecting to Amqp handler (${i}/${retries})`); + return + } + established = true + + // create the channel + await handler.initChannel(connection) + }) + + if (established) { + break + } + } + + if (!established) { + console.error(`Could not establish connection to Amqp handler: ${errMsg}`) + } else { + console.info('Connected to amqpHandler') + } + } + + /** + * Waits for a specific time period. + * + * @param backOff Period to wait in seconds + */ + private backOff(backOff: number): Promise { + return new Promise(resolve => setTimeout(resolve, backOff * 1000)); + } + + private initChannel(connection: Connection) { + console.log(`Initializing transformation channel "${this.notifQueueName}"`) + + connection.createChannel((error1: Error, channel: Channel) => { + if (error1) { + throw error1; + } + + channel.assertQueue(this.notifQueueName, { + durable: false, + }); + + // Consume from channel + channel.consume( + this.notifQueueName, + async (msg: ConsumeMessage | null) => await this.handleEvent(msg), + { noAck: true } + ); + }); + console.info(`Successfully initialized transformation channel "${this.notifQueueName}"`) + } + + private async handleEvent(msg: ConsumeMessage | null): Promise { + if (!msg) { + return Promise.reject('Could not receive notification event: Message is not set') + } + + const eventMessage = JSON.parse(msg.content.toString()) + const transformationEvent = eventMessage as TransformationEvent + + console.log(`Received event from channel: Pipeline id: "${transformationEvent.pipelineId}", + pipeline name: "${transformationEvent.pipelineName}`) + + return this.triggerEventHandler.handleEvent(transformationEvent) + } +} + + diff --git a/notification/src/api/notificationMessageFactory.ts b/notification/src/api/notificationMessageFactory.ts new file mode 100644 index 000000000..12c5e047b --- /dev/null +++ b/notification/src/api/notificationMessageFactory.ts @@ -0,0 +1,25 @@ +import { TransformationEvent } from "./transformationEvent" + +export namespace NotificationMessageFactory { + + /** + * Builds the notification message to be sent, + * by composing the contents of the transformation event to readable + * message + * + * @param event event to extract transformation results from + * @returns message to be sent as notification + */ + export const buildMessage = (event: TransformationEvent): string => { + let message: string + if (!event.error) { + message = `Pipeline ${event.pipelineName} (Pipeline id:${event.pipelineId}) ` + + `has new data available. Fetch at ${event.dataLocation}.` + } else { + message = `Pipeline ${event.pipelineName}(Pipeline ID:${event.pipelineId}) failed. \n` + + `${JSON.stringify(event.error)}` + } + + return message + } +} diff --git a/notification/src/api/rest/notificationConfigEndpoint.ts b/notification/src/api/rest/notificationConfigEndpoint.ts new file mode 100644 index 000000000..b9f26943d --- /dev/null +++ b/notification/src/api/rest/notificationConfigEndpoint.ts @@ -0,0 +1,559 @@ + +import * as express from 'express'; +import { DeleteResult } from 'typeorm'; + +import { SlackConfig, WebhookConfig, NotificationConfig, FirebaseConfig, NotificationConfigRequest, CONFIG_TYPE } from '../../notification-config/notificationConfig'; +import { NotificationRepository } from '../../notification-config/notificationRepository' + +export class NotificationConfigEndpoint { + + storageHandler: NotificationRepository + + constructor(storageHandler: NotificationRepository, app: express.Application) { + this.storageHandler = storageHandler + + // Create Configs + app.post('/config/:configType', this.handleConfigCreation) + + // Update of Configs + app.put('/config/:configType/:id', this.handleConfigUpdate) + + // Deletion of Configs + app.delete('/config/:configType/:id', this.handleConfigDeletion) + + // Request Configs + app.get('/config/:configType/:id', this.handleConfigRequest) + + // Summary for pipeline + app.get('/config/pipeline/:id', this.handleConfigSummaryRequest) + } + + /** + * Gets all Configs corresponding to Pipeline-ID + * (identified by param id) as json list + */ + handleConfigSummaryRequest = async (req: express.Request, res: express.Response) => { + + const pipelineId = parseInt(req.params.id) + console.log(`Received request for configs with pipeline id ${pipelineId} from Host ${req.connection.remoteAddress}`) + + if (!pipelineId) { + console.error("Request for config: ID not set") + res.status(400).send('Pipeline ID is not set.') + return + } + + // Get configs from database + const configSummary = await this.storageHandler.getConfigsForPipeline(pipelineId) + res.status(200).send(configSummary) + } + + /** + * Gets all Slack Configs corresponding to config id + * (identified by param id) as json list + */ + handleSlackRequest = async (req: express.Request, res: express.Response) => { + + const id = parseInt(req.params.id) + console.log(`Received request for slack config with id ${id} from Host ${req.connection.remoteAddress}`) + + if (!id) { + console.error("Request for config: ID not set") + res.status(400).send('Slack ID is not set.') + return + } + + // Get config from database + try { + const configs = await this.storageHandler.getSlackConfig(id) + res.status(200).send(configs) + } catch(e) { + res.status(404).send(`Could not find slack config with id ${id}`) + res.end() + return + } + } + + /** + * Gets all Webhook Configs corresponding to config id + * (identified by param id) as json list + */ + handleWebhookRequest = async (req: express.Request, res: express.Response) => { + + const id = parseInt(req.params.id) + console.log(`Received request for webhook config with id ${id} from Host ${req.connection.remoteAddress}`) + + if (!id) { + console.error("Request for config: ID not set") + res.status(400).send('webhook ID is not set.') + return + } + + // Get config from database + try { + const configs = await this.storageHandler.getWebhookConfig(id) + res.status(200).send(configs) + } catch(e) { + res.status(404).send(`Could not find webhook config with id ${id}`) + res.end() + return + } + } + + /** + * Gets all Firebase Configs corresponding to config id + * (identified by param id) as json list + */ + handleFCMRequest = async (req: express.Request, res: express.Response) => { + + const id = parseInt(req.params.id) + console.log(`Received request for firebase config with id ${id} from Host ${req.connection.remoteAddress}`) + + if (!id) { + console.error("Request for config: ID not set") + res.status(400).send('Firebase ID is not set.') + return + } + + // Get config from database + try { + const configs = await this.storageHandler.getFirebaseConfig(id) + res.status(200).send(configs) + } catch(e) { + res.status(404).send(`Could not find firebase config with id ${id}`) + res.end() + return + } + } + + /** + * Handles a request to save a NotificationConfig + * This is done by checking the validity of the config and then save + * it to the database on success + */ + handleConfigCreation = async (req: express.Request, res: express.Response): Promise => { + console.log(`Received request to create notification config from host ${req.connection.remoteAddress}`) + + const notificationType = req.params.configType + if (!notificationType) { + res.status(400).send('No notification type provided') + res.end() + return + } + + const configRequest = req.body as NotificationConfig + if (!NotificationConfigEndpoint.isValidNotificationConfig(configRequest)) { + res.status(400).send('Malformed notification request.') + return + } + + switch(notificationType) { + case CONFIG_TYPE.WEBHOOK: + this.handleWebhookCreation(req, res) + break + case CONFIG_TYPE.FCM: + this.handleFCMCreation(req, res) + break + case CONFIG_TYPE.SLACK: + this.handleSlackCreation(req, res) + break + default: + res.status(400).send(`Notification type ${notificationType} not supported!`) + return + } + } + + /** + * Handles a request to save a WebhookConfig + * This is done by checking the validity of the config and then save + * it to the database on success + */ + handleWebhookCreation = async (req: express.Request, res: express.Response): Promise => { + const webhookConfig = req.body as WebhookConfig + let savedConfig: WebhookConfig + + // Check for validity of the request + if (!NotificationConfigEndpoint.isValidWebhookConfig(webhookConfig)) { + res.status(400).send('Malformed webhook request.') + } + console.log(`Creation of webhook config for pipeline ${webhookConfig.pipelineId} requested.`) + + // Persist Config + try { + savedConfig = await this.storageHandler.saveWebhookConfig(webhookConfig) + } catch(error) { + console.error(`Could not create webhookConfig Object: ${error}`) + res.status(500).send('Internal Server Error.') + return + } + + // return saved post back + res.status(201).send(savedConfig); + } + + + /** + * Persists a posted Slack Config to the Database + * + * @param req Request for config creation + * @param res Response for config creation + */ + handleSlackCreation = async (req: express.Request, res: express.Response): Promise => { + const slackConfig: SlackConfig = req.body as SlackConfig + let savedConfig: SlackConfig + + // Check for validity of the request + if (!NotificationConfigEndpoint.isValidSlackConfig(slackConfig)) { + res.status(400).send('Malformed slack request.') + return + } + console.log(`Creation of webhook config for pipeline ${slackConfig.pipelineId} requested.`) + + // Persist Config + try { + savedConfig = await this.storageHandler.saveSlackConfig(slackConfig) + } catch(error) { + console.error(`Could not create slackConfig Object: ${error}`) + res.status(500).send('Internal Server Error.') + return + + } + + // return saved post back + res.status(201).send(savedConfig); + } + + /** + * Persists a posted Firebase Config to the notification database service. + */ + handleFCMCreation = async (req: express.Request, res: express.Response) => { + const firebaseConfig : FirebaseConfig = req.body as FirebaseConfig + let savedConfig: FirebaseConfig + + // Check for validity of the request + if (!NotificationConfigEndpoint.isValidFirebaseConfig(firebaseConfig)) { + res.status(400).send('Malformed firebase request.') + } + console.log(`Creation of webhook config for pipeline ${firebaseConfig.pipelineId} requested.`) + + try { + savedConfig = await this.storageHandler.saveFirebaseConfig(firebaseConfig) + } catch (error) { + console.error(`Could not create firebase Object: ${error}`) + res.status(500).send('Internal Server Error.') + return + } + + // return saved post back + res.status(201).send(savedConfig); + } + + + /** + * Handles a request for config deletion. + * Depending on the parameter :configType in the URL it either deletes a config + * of a specific config type (such as slack) or deletes all configs + * for a specific pipeline + * + * @param req request containing the parameter :configType and the :id of the config + * or respectively the pipeline id for the configs to be deleted + * + * @param res HTTP-Response that is sent back to the requester + * + */ + handleConfigDeletion = (req: express.Request, res: express.Response): void => { + + const configType = req.params.configType + + if (!configType) { + console.warn(`Cannot delete notification: Not valid config type provided`) + res.status(400).send(`Cannot delete notification: Not valid config type provided`) + res.end() + return + } + + try { + switch (configType) { + case CONFIG_TYPE.WEBHOOK: + this.deleteWebhook(req, res) + break + case CONFIG_TYPE.FCM: + this.deleteFCM(req, res) + break + case CONFIG_TYPE.SLACK: + this.deleteSlack(req, res) + break + case 'pipeline': + this.handlePipelineDelete(req, res) + default: + res.status(400).send(`Notification type ${configType} not supported!`) + return + } + } catch (e) { + res.status(404).send('Config not found.') + } + } + + /** + * Handles a request for configs and returns the configs corresponding to the parameter :configType + * as a HTTP- Response + * + * @param req Request for a config. + * @param res Response containing specific configs, such as slack or all configs for a pipeline + */ + handleConfigRequest = (req: express.Request, res: express.Response): void => { + + const configType = req.params.configType + + if (!configType) { + console.warn(`Cannot request config(s): Not valid config type provided`) + res.status(400).send(`Cannot request config(s): Not valid config type provided`) + res.end() + return + } + + switch (configType) { + case CONFIG_TYPE.WEBHOOK: + this.handleWebhookRequest(req, res) + break + + case CONFIG_TYPE.FCM: + this.handleFCMRequest(req, res) + break + + case CONFIG_TYPE.SLACK: + this.handleSlackRequest(req, res) + break + + case 'pipeline': + this.handleConfigSummaryRequest(req, res) + break + + default: + res.status(400).send(`Notification type ${configType} not suppoerted!`) + return + } + + } + + handlePipelineDelete = (req: express.Request, res: express.Response): void => { + + const pipelineId = parseInt(req.params.id) + + if (!pipelineId) { + console.warn(`Cannot delete Pipeline: Not valid id provided`) + res.status(400).send(`Cannot delete Pipeline: Not valid id provided`) + res.end() + return + } + + console.log(`Received config-deletion-request for pipeline with id "${pipelineId}" from Host ${req.connection.remoteAddress}`) + + // Delete All Configs with given pipelineId + try { + this.storageHandler.deleteConfigsForPipelineID(pipelineId) + } catch (error) { + console.error(`Could not delete configs with pipelineID ${pipelineId}: ${error}`) + res.status(500).send('Internal Server Error.') + res.end() + return + } + + // return saved post back + res.status(200).send('Configs have been deleted.'); + res.end() + } + + /** + * Handles slack config deletion requests. + * + * @param req Deletion Request containing parameter id (id to be deleted) + * @param res Response to the Deletion request + */ + deleteSlack = async (req: express.Request, res: express.Response): Promise => { + const configId = parseInt(req.params.id) + let deleteResult : DeleteResult + + console.log(`Received deletion request for slack config with id ${configId} from Host ${req.connection.remoteAddress}`) + + if (!configId) { + console.error("Request for config: ID not set") + res.status(400).send('Pipeline ID is not set.') + res.end() + return + } + + // Delete Config + await this.storageHandler.deleteSlackConfig(configId) + res.status(200).send('DELETED'); + res.end() + } + + + /** + * Handles Firebase config deletion requests. + * + * @param req Deletion Request containing parameter id (id to be deleted) + * @param res Response to the Deletion request + */ + deleteFCM = async (req: express.Request, res: express.Response): Promise => { + const configId = parseInt(req.params.id) + let deleteResult: DeleteResult + + console.log(`Received deletion request for firebase configs with id ${configId} from Host ${req.connection.remoteAddress}`) + + if (!configId) { + console.error("Request for config: ID not set") + res.status(400).send('Pipeline ID is not set.') + res.end() + return + } + + // Delete Config + await this.storageHandler.deleteFirebaseConfig(configId) + res.status(200).send('DELETED'); + res.end() + } + + + /** + * Handles Webhook deletion requests. + * + * @param req Deletion Request containing parameter id (id to be deleted) + * @param res Response to the Deletion request + */ + deleteWebhook = async (req: express.Request, res: express.Response): Promise => { + const configId = parseInt(req.params.id) + let deleteResult: DeleteResult + + console.log(`Received deletion request for webhook configs with id ${configId} from Host ${req.connection.remoteAddress}`) + + if (!configId) { + console.error("Request for config: ID not set") + res.status(400).send('Pipeline ID is not set.') + res.end() + return + } + + // Delete Config + await this.storageHandler.deleteWebhookConfig(configId) + res.status(200).send('DELETED'); + res.end() + } + + /* + * Handles a request to update a NotificationConfig + * This is done by checking the validity of the config and then save + * it to the database on success + */ + handleConfigUpdate = async (req: express.Request, res: express.Response): Promise => { + console.log(`Received notification config update request from Host ${req.connection.remoteAddress}`) + const configType = req.params.configType + const id = parseInt(req.params.id) + const config = req.body as NotificationConfig + + if (!id) { + console.warn(`No valid id for notification update request provided`) + res.send(400).send(`No valid id for notification update request provided`) + res.end() + return + } + + if (!configType) { + console.warn(`No valid notification Type for notification update request provided`) + res.send(400).send(`No valid id for notification update request provided`) + res.end() + return + } + + if (!NotificationConfigEndpoint.isValidNotificationConfig(config)) { + console.error("Received malformed notificationUpdate request") + res.status(400).send('Malformed notification config.') + res.end() + return + } + + let updatedConfig: NotificationConfig + try { + switch (configType) { + case 'webhook': + updatedConfig = await this.storageHandler.updateWebhookConfig(id, req.body as WebhookConfig) + break + case 'fcm': + updatedConfig = await this.storageHandler.updateFirebaseConfig(id, req.body as FirebaseConfig) + break + case 'slack': + updatedConfig = await this.storageHandler.updateSlackConfig(id, req.body as SlackConfig) + break + default: + res.status(400).send(`Notification type ${configType} not supported!`) + return + } + res.status(200).send(updatedConfig) + } catch (e) { + res.status(404).send(`Could not find ${configType} config with id ${id}`) + } + } + + /** + * Evaluates the validity of the WebHookConfig (provided by argument), + * by checking for the field variables. + * + * @param conf WebHookConfig to be validated + * + * @returns true, if conf is a valid, false else + */ + private static isValidWebhookConfig(conf: WebhookConfig): boolean { + return this.isValidNotificationConfig(conf) && !!conf.url + } + + /** + * Evaluates the validity of the SlackConfig (provided by argument), + * by checking for the field variables. + * + * @param conf SlackConfig to be validated + * + * @returns true, if conf is a valid, false else + */ + private static isValidSlackConfig(conf: SlackConfig): boolean { + return this.isValidNotificationConfig(conf) && !!conf.channelId && !!conf.secret && !!conf.workspaceId + } + + + /** + * Evaluates the validity of the FirebaseConfig (provided by argument), + * by checking for the field variables. + * + * @param conf FirebaseConfig to be validated + * + * @returns true, if conf is a valid, false else + */ + private static isValidFirebaseConfig(conf: FirebaseConfig): boolean { + return this.isValidNotificationConfig(conf) && !!conf.clientEmail && !!conf.privateKey || !conf.projectId || !conf.topic + } + + + /** + * Evaluates the validity of the NotificationConfig (provided by argument), + * by checking for the field variables. + * + * @param obj NotificationConfig to be validated + * + * @returns true, if conf is a valid, false else + */ + private static isValidNotificationConfig (obj: NotificationConfig): boolean { + return !!obj.pipelineId && !!obj.condition + } + + /** + * Evaluates the validity of the NotificationConfigRequest (provided by argument), + * by checking for the field variables. + * + * @param obj NotificationConfigRequest to be validated + * + * @returns true, if conf is a valid, false else + */ + private static isValidNotificationConfigRequest(obj: NotificationConfigRequest): boolean { + return !!obj.pipelineId && !!obj.condition && !!obj.type + } +} diff --git a/notification/src/api/rest/notificationExecutionEndpoint.ts b/notification/src/api/rest/notificationExecutionEndpoint.ts new file mode 100644 index 000000000..e1221cf3d --- /dev/null +++ b/notification/src/api/rest/notificationExecutionEndpoint.ts @@ -0,0 +1,26 @@ +import * as express from 'express' + +import { TransformationEvent } from '../transformationEvent' +import { TriggerEventHandler } from '../triggerEventHandler' + +export class NotificationExecutionEndpoint { + + triggerEventHandler: TriggerEventHandler + + constructor (triggerEventHandler: TriggerEventHandler, app: express.Application) { + this.triggerEventHandler = triggerEventHandler + + app.post('/trigger', this.triggerNotification) + } + + triggerNotification = async (req: express.Request, res: express.Response): Promise => { + const triggerEvent = req.body as TransformationEvent + if (!this.triggerEventHandler.isValidTransformationEvent(triggerEvent)) { + res.status(400).send('Malformed notification trigger request.') + return + } + + await this.triggerEventHandler.handleEvent(triggerEvent) + res.status(200).send(`Successfully sent all notifications for pipeline ${triggerEvent.pipelineId}`) + } +} diff --git a/notification/src/interfaces/notificationRequest.ts b/notification/src/api/rest/notificationRequest.ts similarity index 77% rename from notification/src/interfaces/notificationRequest.ts rename to notification/src/api/rest/notificationRequest.ts index 21fae4bcb..2b91ac1f7 100644 --- a/notification/src/interfaces/notificationRequest.ts +++ b/notification/src/api/rest/notificationRequest.ts @@ -7,7 +7,7 @@ export interface NotificationRequest { type: string; } -export interface Webhook extends NotificationRequest{ +export interface Webhook extends NotificationRequest { url: string; } @@ -17,7 +17,7 @@ export interface Slack extends NotificationRequest { secret: string; } -export interface Firebase extends NotificationRequest{ +export interface Firebase extends NotificationRequest { projectId: string; clientEmail: string; privateKey: string; diff --git a/notification/src/api/transformationEvent.ts b/notification/src/api/transformationEvent.ts new file mode 100644 index 000000000..8f82ebbd1 --- /dev/null +++ b/notification/src/api/transformationEvent.ts @@ -0,0 +1,13 @@ + +/** + * Event sent by the transformation service upon transformation finish + */ +export interface TransformationEvent { + pipelineId: number + pipelineName: string + + dataLocation: string // url (location) of the queryable data + + data?: object + error?: object +} diff --git a/notification/src/api/triggerEventHandler.ts b/notification/src/api/triggerEventHandler.ts new file mode 100644 index 000000000..dc0046ae6 --- /dev/null +++ b/notification/src/api/triggerEventHandler.ts @@ -0,0 +1,67 @@ +import { TransformationEvent } from "./transformationEvent" +import { NotificationMessageFactory } from "./notificationMessageFactory" +import { NotificationRepository } from "../notification-config/notificationRepository" +import NotificationExecutor from "../notification-execution/notificationExecutor" +import { CONFIG_TYPE } from "../notification-config/notificationConfig" + +export class TriggerEventHandler { + + notificationRepository: NotificationRepository + notificationExecutor: NotificationExecutor + + constructor(notificationRepository: NotificationRepository, notificationExecutor: NotificationExecutor) { + this.notificationRepository = notificationRepository + this.notificationExecutor = notificationExecutor + } + + /** + * Handles an event message + * @param transformationEvent Message received from the message queue + * + * @returns true on success, else false + */ + public async handleEvent(transformationEvent: TransformationEvent): Promise { + const isValid = this.isValidTransformationEvent(transformationEvent) + if (!isValid) { + return Promise.reject('Trigger event is not valid') + } + + const message = NotificationMessageFactory.buildMessage(transformationEvent) + const data = transformationEvent.data + const configs = await this.notificationRepository.getConfigsForPipeline(transformationEvent.pipelineId) + + const notificationJobs: Promise[] = [] + for (const webhookConfig of configs.webhook) { + notificationJobs.push( + this.notificationExecutor.handleNotification(webhookConfig, CONFIG_TYPE.WEBHOOK, transformationEvent.dataLocation, message, data) + ) + } + + for (const slackConfig of configs.slack) { + notificationJobs.push( + this.notificationExecutor.handleNotification(slackConfig, CONFIG_TYPE.SLACK, transformationEvent.dataLocation, message, data) + ) + } + + + for (const firebaseConfig of configs.firebase) { + notificationJobs.push( + this.notificationExecutor.handleNotification(firebaseConfig, CONFIG_TYPE.FCM, transformationEvent.dataLocation, message, data) + ) + } + + await Promise.all(notificationJobs) + return Promise.resolve() + } + + + /** + * Checks if this event is a valid transformation event, + * by checking if all field variables exist and are set. + * + * @returns true, if param event is a TransformationEvent, else false + */ + public isValidTransformationEvent(event: TransformationEvent): boolean { + return !!event.dataLocation && !!event.pipelineId && !!event.pipelineName && (!!event.data || !!event.error) + } +} diff --git a/notification/src/index.ts b/notification/src/index.ts index ba7998f41..1261d7a3e 100644 --- a/notification/src/index.ts +++ b/notification/src/index.ts @@ -1,17 +1,54 @@ -import { NotificationEndpoint } from './notificationEndpoint'; -import VM2SandboxExecutor from './vm2SandboxExecutor' -import JSNotificationService from './jsNotificationService' +import express from 'express' +import cors from 'cors' +import bodyParser from 'body-parser' + +import "reflect-metadata"; // once required for orm + +import NotificationExecutor from './notification-execution/notificationExecutor' +import VM2SandboxExecutor from './notification-execution/condition-evaluation/vm2SandboxExecutor' +import { NotificationConfigEndpoint } from './api/rest/notificationConfigEndpoint'; +import { NotificationExecutionEndpoint } from './api/rest/notificationExecutionEndpoint'; +import { StorageHandler } from './notification-config/storageHandler'; +import { AmqpHandler } from './api/amqp/amqpHandler'; +import { TriggerEventHandler } from './api/triggerEventHandler'; const port = 8080 // authEnabled defaults to false const authEnabled: boolean = process.env.AUTH_ENABLED === 'true' -if (authEnabled === false) { +if (!authEnabled) { console.warn('WARNING: Authentication is disabled! Make sure this option turned off in production!\n') } const sandboxExecutor = new VM2SandboxExecutor() -const notificationService = new JSNotificationService(sandboxExecutor) -const notificationEndpoint = new NotificationEndpoint(notificationService, port, authEnabled) +const notificationExecutor = new NotificationExecutor(sandboxExecutor) +const storageHandler = new StorageHandler() +const triggerEventHandler = new TriggerEventHandler(storageHandler, notificationExecutor) +const amqpHandler = new AmqpHandler(triggerEventHandler) + +const app = express() + +app.use(cors()) +app.use(bodyParser.json({ limit: '50mb' })) +app.use(bodyParser.urlencoded({ extended: false })) + +const notificationConfigEndpoint = new NotificationConfigEndpoint(storageHandler, app) +const notificationExecutionEndpoint = new NotificationExecutionEndpoint(triggerEventHandler, app) + +app.listen(port, async () => { + + await storageHandler.init(30, 5) + await amqpHandler.connect(30,5) + + console.log('listening on port ' + port) + + app.get("/", (req: express.Request, res: express.Response): void => { + res.send('I am alive!') + }) -notificationEndpoint.listen() + app.get("/version", (req: express.Request, res: express.Response): void => { + res.header('Content-Type', 'text/plain') + res.send(notificationExecutor.getVersion()) + res.end() + }) +}) diff --git a/notification/src/interfaces/notificationService.ts b/notification/src/interfaces/notificationService.ts deleted file mode 100644 index c8fe1337b..000000000 --- a/notification/src/interfaces/notificationService.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { NotificationRequest } from './notificationRequest' - -export default interface NotificationService { - getVersion(): string; - handleNotification(notifiactionRequest: NotificationRequest): Promise; -} diff --git a/notification/src/interfaces/sandboxExecutor.ts b/notification/src/interfaces/sandboxExecutor.ts deleted file mode 100644 index 00e4eeb42..000000000 --- a/notification/src/interfaces/sandboxExecutor.ts +++ /dev/null @@ -1,3 +0,0 @@ -export default interface SandboxExecutor { - evaluate(expression: string, data: object): boolean; -} diff --git a/notification/src/jsNotificationService.test.ts b/notification/src/jsNotificationService.test.ts deleted file mode 100644 index dbd00f400..000000000 --- a/notification/src/jsNotificationService.test.ts +++ /dev/null @@ -1,114 +0,0 @@ -/* eslint-env jest */ -import axios from 'axios' - -import VM2SandboxExecutor from './vm2SandboxExecutor' -import SlackCallback from './interfaces/slackCallback' -import { Webhook, Slack } from './interfaces/notificationRequest' -import NotificationService from './interfaces/notificationService'; -import JSNotificationService from './jsNotificationService'; - -jest.mock('axios') - -describe('JSTransformationService', () => { - - - describe('notification system', () => { - const data = { - value1: 5 - } - - const post = axios.post as jest.Mock - - let notificationService: NotificationService - - beforeEach(() => { - notificationService = new JSNotificationService(new VM2SandboxExecutor()) // TODO: replace with mock - }) - - afterEach(() => { - jest.clearAllMocks() - }) - - it('should trigger notification when condition is met', async () => { - post.mockReturnValue(Promise.resolve()) - - const notificationRequest: Webhook = { - pipelineName: 'nordstream', - pipelineId: 1, - dataLocation: 'data', - data: data, - condition: 'data.value1 > 0', - type: 'WEBHOOK', - url: 'callback' - } - - await notificationService.handleNotification(notificationRequest) - - expect(post).toHaveBeenCalledTimes(1) - // check arguments for axios post - expect(post.mock.calls[0][0]).toEqual(notificationRequest.url) - expect(post.mock.calls[0][1].location).toEqual(notificationRequest.dataLocation) - }) - - test('Notification does not trigger when condition is not met', async () => { - const notificationRequest: Webhook = { - pipelineName: 'southstream', - pipelineId: 2, - dataLocation: 'data', - data: data, - condition: 'data.value1 < 0', - type: 'WEBHOOK', - url: 'callback' - } - - await notificationService.handleNotification(notificationRequest) - - expect(post).not.toHaveBeenCalled() - }) - - test('Notification does not trigger when condition is malformed', async () => { - const notificationRequest: Webhook = { - pipelineName: 'weststream', - pipelineId: 3, - dataLocation: 'data', - data: data, - condition: 'asdfa;', - type: 'WEBHOOK', - url: 'callback' - } - - - try { - await notificationService.handleNotification(notificationRequest) - fail() - } catch (err) { - expect(err.message).toEqual("Malformed expression received: asdfa;\n Error message: ReferenceError: asdfa is not defined") - } - - expect(post).not.toHaveBeenCalled() - }) - - test('SLACK request', async () => { - const request: Slack = { - condition: 'data.value1 > 0', - data, - dataLocation: 'data', - pipelineId: 42, - pipelineName: 'AnswerToEverything-Pipeline', - type: 'SLACK', - workspaceId: '012', - channelId: '123', - secret: '42' - } - await notificationService.handleNotification(request) - - const expectedObject: SlackCallback = { - text: `Pipeline ${request.pipelineName}(${request.pipelineId}) has new data available. Fetch at ${request.dataLocation}.` - } - expect(post).toHaveBeenCalledTimes(1) - const expectedUrl = `https://hooks.slack.com/services/${request.workspaceId}/${request.channelId}/${request.secret}` - expect(post.mock.calls[0][0]).toEqual(expectedUrl) - expect(post.mock.calls[0][1]).toEqual(expectedObject) - }) - }) -}) diff --git a/notification/src/jsNotificationService.ts b/notification/src/jsNotificationService.ts deleted file mode 100644 index 7613a86ff..000000000 --- a/notification/src/jsNotificationService.ts +++ /dev/null @@ -1,110 +0,0 @@ -import App = firebase.app.App; -import axios from 'axios' -import * as firebase from 'firebase-admin' -import NotificationService from './interfaces/notificationService'; - -import { Firebase, NotificationRequest, Slack, Webhook } from '@/interfaces/notificationRequest' - -import SlackCallback from './interfaces/slackCallback'; -import WebhookCallback from './interfaces/webhookCallback'; -import FcmCallback from './interfaces/fcmCallback'; -import SandboxExecutor from './interfaces/sandboxExecutor'; - -const VERSION = '0.0.1' - -export default class JSNotificationService implements NotificationService { - - - executor: SandboxExecutor - - constructor (executor: SandboxExecutor) { - this.executor = executor - } - - - getVersion (): string { - return VERSION - } - - - async handleNotification (notification: NotificationRequest): Promise { - console.log(`NotificationRequest received for pipeline: ${notification.pipelineId}.`) - const conditionHolds = this.executor.evaluate(notification.condition, notification.data) - console.log('Condition is ' + conditionHolds) - if (!conditionHolds) { // no need to trigger notification - return Promise.resolve() - } - - const message = `Pipeline ${notification.pipelineName}(${notification.pipelineId}) ` + - `has new data available. Fetch at ${notification.dataLocation}.` - - switch (notification.type) { - case 'WEBHOOK': - await this.handleWebhook(notification as Webhook) - break - case 'FCM': - await this.handleFCM(notification as Firebase, message) - break - case 'SLACK': - await this.handleSlack(notification as Slack, message) - break - default: - throw new Error('Notification type not implemented.') - } - } - - - private async handleWebhook (webhook: Webhook): Promise { - const callbackObject: WebhookCallback = { - location: webhook.dataLocation, - timestamp: new Date(Date.now()) - } - console.log(`Posting webhook to ${webhook.url}, callback object: ${JSON.stringify(callbackObject)}.`) - await axios.post(webhook.url, callbackObject) - } - - private async handleSlack (slack: Slack, message: string): Promise { - let slackBaseUri = 'https://hooks.slack.com/services' - if (process.env.MOCK_RECEIVER_HOST && process.env.MOCK_RECEIVER_PORT) { - slackBaseUri = `http://${process.env.MOCK_RECEIVER_HOST}:${process.env.MOCK_RECEIVER_PORT}/slack` - } - const callbackObject: SlackCallback = { - text: message - } - const url = `${slackBaseUri}/${slack.workspaceId}/${slack.channelId}/${slack.secret}` - console.log(`Posting slack notification to ${url}, callbackObject: ${JSON.stringify(callbackObject)}`) - await axios.post(url, callbackObject) - } - - private async handleFCM (firebaseRequest: Firebase, message: string): Promise { - let app: App - try { - app = firebase.app(firebaseRequest.clientEmail) - } catch (e) { // app does not exist yet - app = firebase.initializeApp({ - credential: firebase.credential.cert({ - projectId: firebaseRequest.projectId, - clientEmail: firebaseRequest.clientEmail, - privateKey: firebaseRequest.privateKey.replace(/\\n/g, '\n') - }), - databaseURL: `https://${firebaseRequest.projectId}.firebaseio.com` - }, - firebaseRequest.clientEmail) - } - const firebaseMessage: FcmCallback = { - notification: { - title: 'New Data Available', - body: message - }, - data: { - textfield: 'textvalue' - }, - topic: firebaseRequest.topic - } - console.log(`Sending firebase message, callback object: ${JSON.stringify(firebaseMessage)}.`) - const firebaseResponse = await firebase.messaging(app).send(firebaseMessage) - console.log(`Firebase message sent to: ${firebaseResponse}`) - } - - -} \ No newline at end of file diff --git a/notification/src/notification-config/notificationConfig.ts b/notification/src/notification-config/notificationConfig.ts new file mode 100644 index 000000000..7c662af9a --- /dev/null +++ b/notification/src/notification-config/notificationConfig.ts @@ -0,0 +1,65 @@ +import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm' + +export enum CONFIG_TYPE{ + WEBHOOK = "webhook", + SLACK = "slack", + FCM = "fcm" +} + + +export class NotificationConfig{ + @Column() + pipelineId!: number; + + @Column() + condition!: string; +} + +export class NotificationConfigRequest extends NotificationConfig{ + type!: CONFIG_TYPE +} + +@Entity() +export class SlackConfig extends NotificationConfig{ + + @PrimaryGeneratedColumn() + id!: number + + @Column() + workspaceId!: string; + + @Column() + channelId!: string; + + @Column() + secret!: string; +} + + +@Entity() +export class WebhookConfig extends NotificationConfig{ + + @PrimaryGeneratedColumn() + id!: number + + @Column() + url!: string; +} + +@Entity() +export class FirebaseConfig extends NotificationConfig { + @PrimaryGeneratedColumn() + id!: number + + @Column() + projectId!: string; + + @Column() + clientEmail!: string; + + @Column() + privateKey!: string; + + @Column() + topic!: string; +} diff --git a/notification/src/notification-config/notificationRepository.ts b/notification/src/notification-config/notificationRepository.ts new file mode 100644 index 000000000..6ec61542d --- /dev/null +++ b/notification/src/notification-config/notificationRepository.ts @@ -0,0 +1,24 @@ +import { NotificationSummary } from "./notificationSummary"; +import { FirebaseConfig, SlackConfig, WebhookConfig } from "./notificationConfig"; + +export interface NotificationRepository { + init(retries: number, backoff: number):void + getConfigsForPipeline(pipelineId: number): Promise + deleteConfigsForPipelineID(pipelineId: number): void + + getSlackConfig(id: number): Promise + getWebhookConfig(id: number): Promise + getFirebaseConfig(id: number): Promise + + saveWebhookConfig(webhookConfig: WebhookConfig): Promise + saveSlackConfig(slackConfig: SlackConfig): Promise + saveFirebaseConfig(firebaseConfig: FirebaseConfig): Promise + + updateSlackConfig(id: number, slackConfig: SlackConfig): Promise + updateWebhookConfig(id: number, webhookConfig: WebhookConfig): Promise + updateFirebaseConfig(id: number, firebaseConfig: FirebaseConfig): Promise + + deleteSlackConfig(id: number): Promise + deleteWebhookConfig(id: number): Promise + deleteFirebaseConfig(id: number): Promise +} diff --git a/notification/src/notification-config/notificationSummary.ts b/notification/src/notification-config/notificationSummary.ts new file mode 100644 index 000000000..111a1a112 --- /dev/null +++ b/notification/src/notification-config/notificationSummary.ts @@ -0,0 +1,20 @@ +import { WebhookConfig, SlackConfig, FirebaseConfig } from './notificationConfig'; + + +/** + * NotificationSummary will be returned upon a request for + * configs for a specific pipeline id + * + * @field webhook All WebHookConfigs for a specific pipeline id + * @field slack All SlackConfigs for a specific pipeline id + * @field firebase All FirebaseConfigs for a specific pipeline id + */ +export interface NotificationSummary { + + webhook: WebhookConfig[] + + slack: SlackConfig[] + + firebase: FirebaseConfig[] + +} diff --git a/notification/src/notification-config/storageHandler.ts b/notification/src/notification-config/storageHandler.ts new file mode 100644 index 000000000..bbbf8ee3a --- /dev/null +++ b/notification/src/notification-config/storageHandler.ts @@ -0,0 +1,483 @@ +import { Connection, ConnectionOptions, createConnection, Repository } from 'typeorm'; + +import { NotificationRepository } from './notificationRepository'; +import { NotificationSummary } from './notificationSummary'; +import { SlackConfig, WebhookConfig, FirebaseConfig } from './notificationConfig'; + +/** + * This class handles Requests to the notification database + * in order to store and get notification configurations. + */ +export class StorageHandler implements NotificationRepository { + + slackRepository!: Repository + webhookRepository!: Repository + firebaseRepository!: Repository + + private dbConnection!: Connection | null + + + private connectionOptions: ConnectionOptions = { + type: "postgres", + host: process.env.PGHOST, + port: +process.env.PGPORT!, + username: process.env.PGUSER, + password: process.env.PGPASSWORD, + database: process.env.PGUSER, + synchronize: true, + // logging: true, + entities: [ + WebhookConfig, + SlackConfig, + FirebaseConfig + ] + } + + + /** + * Initializes the components of the notification storage handler. + * This is done by establishing a connection to the notification database + * and initializing a repository for the notification config + * + * @param retries: Number of retries to connect to the database + * @param backoff: Time in seconds to backoff before next connection retry + */ + public async init(retries: number, backoff: number): Promise { + console.debug('Initializing storageHandler.') + const handler: StorageHandler = this + + this.dbConnection = await this.initConnection(retries, backoff) + + if (!this.dbConnection) { + console.error('Could not initialize storageHandler.') + return Promise.reject() + } + + this.slackRepository = this.dbConnection.getRepository(SlackConfig); + this.webhookRepository = this.dbConnection.getRepository(WebhookConfig); + this.firebaseRepository = this.dbConnection.getRepository(FirebaseConfig); + + if (!this.checkClassInvariant()) { + return Promise.reject() + } + return Promise.resolve() + } + + /** + * Initializes a Database Connection to the notification-db service (postgres) + * by using the environment vars: + * - PGHOST: IP/hostname of the storage service + * - PGPORT: PORT of the storage service + * - PGPASSWORD: PASSWORD to connect to the stprage db + * - PGUSER: USER to connect to the storage db + * + * @param retries: Number of retries to connect to the database + * @param backoff: Time in seconds to backoff before next connection retry + * + * @returns a Promise, containing either a Connection on success or null on failure + */ + private async initConnection(retries: number, backoff: number): Promise { + let dbCon: null | Connection = null + let connected: boolean = false + + // try to establish connection + for (let i = 1; i <= retries; i++) { + dbCon = await createConnection(this.connectionOptions).catch(() => { return null }) + if (!dbCon) { + console.info(`Initializing database connection (${i}/${retries})`) + await this.backOff(backoff); + } else { + connected = true + break; + } + } + + if (!connected) { + return Promise.reject("Connection to database could not be established.") + } + + console.info('Connected to notification config database successful.') + return Promise.resolve(dbCon) + } + + /** + * Waits for a specific time period (in seconds) + * + * @param backOff Period to wait in seconds + */ + private backOff(backOff: number): Promise { + return new Promise(resolve => setTimeout(resolve, backOff * 1000)); + } + + public async getSlackConfig(id: number): Promise { + const config = await this.slackRepository.findOne(id) + if(!config) { + return Promise.reject(`Could not find slack config with id ${id}`) + } + + return Promise.resolve(config) + } + + public async getWebhookConfig(id: number): Promise { + const config = await this.webhookRepository.findOne(id) + if(!config) { + return Promise.reject(`Could not find webhook config with id ${id}`) + } + + return Promise.resolve(config) + } + + public async getFirebaseConfig(id: number): Promise { + const config = await this.firebaseRepository.findOne(id) + if(!config) { + return Promise.reject(`Could not find firebase config with id ${id}`) + } + + return Promise.resolve(config) + } + + + /** + * This function returns all available Configs in the Database for given pipeline id. + * + * @param pipelineId Id of the pipeline to search configs for + * @returns Promise containing NotificationSummary (config that contains all configs) + */ + public async getConfigsForPipeline(pipelineId: number): Promise { + console.debug(`Getting ConfigSummary for pipeline with id ${pipelineId}.`) + if (!this.checkClassInvariant()) { + return Promise.reject() + } + + // Get the configs for given pipeline id + const slackConfigs = await this.getSlackConfigs(pipelineId) + const webhookConfigs = await this.getWebhookConfigs(pipelineId) + const firebaseConfig = await this.getFirebaseConfigs(pipelineId) + + // build the summary + const notificationSummary: NotificationSummary = { + slack: slackConfigs, + webhook: webhookConfigs, + firebase: firebaseConfig + } + + console.debug(`Successfully got the all configs for pipeline with id ${pipelineId}`) + return notificationSummary + } + + /** + * Deletes all configs in the database referring to given pipeline id. + * If one of the deletions fails all changes will be rolled back. + * + * @param pipelineId Id of the pipeline to delete the configs for + */ + public deleteConfigsForPipelineID(pipelineId: number): Promise { + console.debug(`Deleting all configs for pipeline id "${pipelineId}"`) + if (!this.checkClassInvariant()) { + return Promise.reject() + } + + let condition = { "pipelineId": pipelineId } + + if (!this.dbConnection) { + console.error(`Could not delete configs for pipeline id "${pipelineId}": Connection has not been established to config database`) + return Promise.reject() + } + + let transaction =this.dbConnection.transaction(async transactionalEntityManager => { + await transactionalEntityManager.delete(SlackConfig, condition) + await transactionalEntityManager.delete(WebhookConfig, condition) + await transactionalEntityManager.delete(FirebaseConfig, condition) + }).catch(error => { console.error(`Could not delete configs with pipelineId ${pipelineId}`)}) + + return Promise.resolve() + } + + /** + * Gets all slack config from the database for a specific pipeline id + * + * @param pipelineId Pipeline ID to get the slack configs for + * @returns Promise containing a list of slack configs with given pipeline id + */ + public async getSlackConfigs(pipelineId: number): Promise { + console.debug(`Getting slack configs with pipelineId ${pipelineId} from database`) + if (!this.checkClassInvariant()) { + return Promise.reject() + } + let slackConfigList: SlackConfig[] = [] + + try { + slackConfigList = await this.slackRepository.find({ pipelineId: pipelineId }) + } catch (error) { + return Promise.reject(error) + } + + console.debug(`Sucessfully got ${slackConfigList.length} Slack config(s) from Database`) + return slackConfigList + } + + /** + * Gets all WebHook Configs from the database for a specific pipeline id + * + * @param pipelineId Pipeline ID to get the WebHook Configs for + * @returns Promise, containing a list of slack configs with given pipeline id + */ + public async getWebhookConfigs(pipelineId: number): Promise { + console.debug(`Getting webhook configs with pipelineId ${pipelineId} from database`) + + if (!this.checkClassInvariant()) { + return Promise.reject() + } + let webhookConfigs: WebhookConfig[] = [] + + try { + webhookConfigs = await this.webhookRepository.find({ pipelineId: pipelineId }) + } catch (error) { + return Promise.reject(error) + } + + console.debug(`Successfully got ${webhookConfigs.length} webhookConfigs from Database`) + return webhookConfigs + } + + /** + * Gets all firebase configs from the database for a specific pipeline id + * + * @param pipelineId Pipeline ID to get the firebase configs for + * @returns Promise containing a list of firebase configs with given pipeline id + */ + public async getFirebaseConfigs(pipelineId: number): Promise { + console.debug(`Getting firebase configs with pipelineId ${pipelineId} from database`) + if (!this.checkClassInvariant()) { + return Promise.reject() + } + let firebaseConfigs: FirebaseConfig[] = [] + + try { + firebaseConfigs = await this.firebaseRepository.find({ pipelineId: pipelineId }) + } catch (error) { + return Promise.reject(error) + } + + console.debug(`Successfully got ${firebaseConfigs.length} firebase configs from database`) + return firebaseConfigs + } + + /** + * Persists a webhook config (provided by argument) to the config database + * + * @param webhookConfig webhook config to persist + * @returns Promise containing the stored webhook config + */ + public saveWebhookConfig(webhookConfig: WebhookConfig): Promise { + console.debug('Saving webhook config to database') + if (!this.checkClassInvariant()) { + return Promise.reject() + } + + const config = this.webhookRepository.create(webhookConfig) + + let webhookPromise = this.webhookRepository.save(config) + + console.debug('Successfully persisted webhook config.') + return webhookPromise; + } + + /** + * Persists a slack config (provided by argument) to the config database + * + * @param slackConfig slack config to persist + * @returns Promise containing the stored slack config + */ + public saveSlackConfig(slackConfig: SlackConfig): Promise { + console.debug('Saving slack config to database.') + if (!this.checkClassInvariant()) { + return Promise.reject() + } + const config = this.slackRepository.create(slackConfig) + + let slackPromise = this.slackRepository.save(config) + + console.debug('Successfully persisted slack config') + return slackPromise; + } + + /** + * Persists a firebase config (provided by argument) to the config database + * + * @param firebaseConfig firebase config to persist + * @returns Promise containing the stored firebase config + */ + public saveFirebaseConfig(firebaseConfig: FirebaseConfig): Promise { + console.debug('Saving firebase config to database') + + if (!this.checkClassInvariant()) { + return Promise.reject() + } + + const config = this.firebaseRepository.create(firebaseConfig) + let firebasePromise = this.firebaseRepository.save(config) + + console.debug('Successfully persisted firebase config') + return firebasePromise; + } + + /** + * Updates a slack config for given id + * + * @param id id for the config to be updated + * @param slackConfig slack config to be written to database + * @returns Promise containing the result of the update operation + */ + public async updateSlackConfig(id: number, slackConfig: SlackConfig): Promise{ + console.debug('Updating slack config to database') + + if (!this.checkClassInvariant()) { + return Promise.reject() + } + + const updateResult = await this.slackRepository.update(id, slackConfig) + console.debug('Successfully updated slack config') + return this.getSlackConfig(id) + } + + /** + * Updates a webhook config for given id + * + * @param id id for the config to be updated + * @param webhookConfig webhook config to be written to database + * @returns Promise containing the result of the update operation + */ + public async updateWebhookConfig(id: number, webhookConfig: WebhookConfig): Promise { + console.debug('Updating webhook config to database') + + if (!this.checkClassInvariant()) { + return Promise.reject() + } + + const updateResult = await this.webhookRepository.update(id, webhookConfig) + console.debug('Succesfully updated webhook config') + return this.getWebhookConfig(id) + } + + /** + * Updates a Firebase config for given id + * + * @param id id for the config to be updated + * @param firebaseConfig firebase config to be written to database + * @returns Promise containing the result of the update operation + */ + public async updateFirebaseConfig(id: number, firebaseConfig: FirebaseConfig): Promise{ + console.debug('Updating firebase config to database') + + if (!this.checkClassInvariant()) { + return Promise.reject() + } + + const updatePromise = await this.firebaseRepository.update(id, firebaseConfig) + console.debug('Successfully updated firebase config') + return this.getFirebaseConfig(id) + } + + + /** + * Deletes a slack config for given id + * + * @param id id for the config to be deleted + * @returns result of the deletion execution + */ + public async deleteSlackConfig(id: number): Promise { + console.debug(`Deleting slack config with id ${id}`) + + if (!this.checkClassInvariant()) { + return Promise.reject() + } + + const deleteResult = await this.slackRepository.delete(id) + if(!deleteResult.affected) { + return Promise.reject(`Something went wrong deleting slack config with id ${id}`) + } + console.debug(`Successfully deleted slack config with id ${id}`) + return Promise.resolve() + } + + /** + * Deletes a webhook config for given id + * + * @param id id for the config to be deleted + * @returns result of the deletion execution + */ + public async deleteWebhookConfig(id: number): Promise { + console.debug(`Deleting webhook config with id ${id}`) + + if (!this.checkClassInvariant()) { + return Promise.reject() + } + + const deleteResult = await this.webhookRepository.delete(id) + if(!deleteResult.affected) { + return Promise.reject(`Something went wrong deleting webhook config with id ${id}`) + } + console.debug(`Successfully deleted webhook config with id ${id}`) + return Promise.resolve() + } + + /** + * Deletes a firebase config for given id + * + * @param id id for the config to be deleted + * @returns result of the deletion execution + */ + public async deleteFirebaseConfig(id: number): Promise { + console.debug(`Deleting firebase config with id ${id}`) + + if (!this.checkClassInvariant()) { + return Promise.reject() + } + + const deleteResult = await this.firebaseRepository.delete(id) + if(!deleteResult.affected) { + return Promise.reject(`Something went wrong deleting firebase config with id ${id}`) + } + console.debug(`Successfully deleted firebase config with id ${id}`) + return Promise.resolve() + } + + /** + * This function ensures that all objects are initialized + * for further interaction with the config database + * + * @returns true, if invariant correct, else false + */ + private checkClassInvariant(): boolean { + let result: boolean = true + let msg: string[] = [] + + + if (!this.dbConnection) { + msg.push('Config database connection') + result = false + } + + if (!this.slackRepository) { + msg.push('Slack config repository') + result = false + } + + if (!this.webhookRepository) { + msg.push('Webhook config repository') + result = false + } + + if (!this.firebaseRepository) { + msg.push('Firebase config repository.') + result = false + } + + if (!result) { + console.error(`Error the following member variables are not set: ${msg}`) + } + + return result + } +} diff --git a/notification/src/notification-execution/condition-evaluation/sandboxExecutor.ts b/notification/src/notification-execution/condition-evaluation/sandboxExecutor.ts new file mode 100644 index 000000000..78e36c38c --- /dev/null +++ b/notification/src/notification-execution/condition-evaluation/sandboxExecutor.ts @@ -0,0 +1,3 @@ +export default interface SandboxExecutor { + evaluate(expression: string, data?: object): boolean; +} diff --git a/notification/src/vm2SandboxExecutor.test.ts b/notification/src/notification-execution/condition-evaluation/vm2SandboxExecutor.test.ts similarity index 71% rename from notification/src/vm2SandboxExecutor.test.ts rename to notification/src/notification-execution/condition-evaluation/vm2SandboxExecutor.test.ts index 5e4641e64..4729dce8f 100644 --- a/notification/src/vm2SandboxExecutor.test.ts +++ b/notification/src/notification-execution/condition-evaluation/vm2SandboxExecutor.test.ts @@ -1,5 +1,5 @@ /* eslint-env jest */ -import SandboxExecutor from './interfaces/sandboxExecutor' +import SandboxExecutor from './sandboxExecutor' import VM2SandboxExecutor from './vm2SandboxExecutor' describe('VM2SandboxExecutor', () => { @@ -48,5 +48,23 @@ describe('VM2SandboxExecutor', () => { expect(result).toBe(true) }) + + it('should evaluate expression "data === undefined" on undefined data', () => { + const object = undefined + const expression = 'data === undefined' + + const result = e.evaluate(expression, object) + + expect(result).toBe(true) + }) + + it('should evaluate expression "data === undefined" on undefined data', () => { + const object = undefined + const expression = '!data' + + const result = e.evaluate(expression, object) + + expect(result).toBe(true) + }) }) }) diff --git a/notification/src/vm2SandboxExecutor.ts b/notification/src/notification-execution/condition-evaluation/vm2SandboxExecutor.ts similarity index 77% rename from notification/src/vm2SandboxExecutor.ts rename to notification/src/notification-execution/condition-evaluation/vm2SandboxExecutor.ts index eefbad721..1ff9fa32b 100644 --- a/notification/src/vm2SandboxExecutor.ts +++ b/notification/src/notification-execution/condition-evaluation/vm2SandboxExecutor.ts @@ -1,9 +1,6 @@ import { VM } from 'vm2' -import SandboxExecutor from './interfaces/sandboxExecutor'; - - -const FUNCTION_WRAP_PREFIX_LENGTH = 1 +import SandboxExecutor from './sandboxExecutor'; export default class VM2SandboxExecutor implements SandboxExecutor { vm: VM; @@ -14,13 +11,14 @@ export default class VM2SandboxExecutor implements SandboxExecutor { }) } - evaluate (expression: string, data: object): boolean { + evaluate(expression: string, data: object): boolean { + console.log(`Evaluating expression: "${expression}" on data`) const wrapper = 'f=function(data){' + 'return ' + expression + '};f(' + - JSON.stringify(data) + + JSON.stringify(data) + ');' let result = false diff --git a/notification/src/interfaces/fcmCallback.ts b/notification/src/notification-execution/notificationCallbacks/fcmCallback.ts similarity index 100% rename from notification/src/interfaces/fcmCallback.ts rename to notification/src/notification-execution/notificationCallbacks/fcmCallback.ts diff --git a/notification/src/interfaces/slackCallback.ts b/notification/src/notification-execution/notificationCallbacks/slackCallback.ts similarity index 100% rename from notification/src/interfaces/slackCallback.ts rename to notification/src/notification-execution/notificationCallbacks/slackCallback.ts diff --git a/notification/src/interfaces/webhookCallback.ts b/notification/src/notification-execution/notificationCallbacks/webhookCallback.ts similarity index 81% rename from notification/src/interfaces/webhookCallback.ts rename to notification/src/notification-execution/notificationCallbacks/webhookCallback.ts index 9c414c6ad..abeacfd51 100644 --- a/notification/src/interfaces/webhookCallback.ts +++ b/notification/src/notification-execution/notificationCallbacks/webhookCallback.ts @@ -1,4 +1,5 @@ export default interface WebhookCallback { location: string; + message: string; timestamp: Date; } diff --git a/notification/src/notification-execution/notificationExecutor.test.ts b/notification/src/notification-execution/notificationExecutor.test.ts new file mode 100644 index 000000000..d6fef1787 --- /dev/null +++ b/notification/src/notification-execution/notificationExecutor.test.ts @@ -0,0 +1,151 @@ +/* eslint-env jest */ +import axios from 'axios' + +import VM2SandboxExecutor from './condition-evaluation/vm2SandboxExecutor' +import { WebhookConfig, CONFIG_TYPE, SlackConfig } from '../notification-config/notificationConfig'; +import NotificationExecutor from './notificationExecutor'; +import JSNotificationService from './notificationExecutor'; +import SlackCallback from '@/notification-execution/notificationCallbacks/slackCallback'; + +jest.mock('axios') + +describe('JSNotificationService', () => { + + + describe('notification system', () => { + + const post = axios.post as jest.Mock + + let notificationService: NotificationExecutor + + let data: object + + beforeEach(() => { + notificationService = new JSNotificationService(new VM2SandboxExecutor()) + console.log = jest.fn() + /*======================================================= + * An Event sent by the Transformation Service + * on successful transformation/pipeline + * =====================================================*/ + data ={ value1: 1, b: 2 } + }) + + afterEach(() => { + jest.clearAllMocks() + }) + + + it('should trigger notification when transformation failed and condition is "data == undefined', async () => { + post.mockReturnValue(Promise.resolve()) + + const notificationConfig: WebhookConfig = { + id: 1, + pipelineId: 1, + condition: 'data === undefined', + url: 'callback' + } + + const message = "message" + const dataLocation = "location" + await notificationService.handleNotification(notificationConfig, CONFIG_TYPE.WEBHOOK, dataLocation, message, undefined) + + + expect(post).toHaveBeenCalledTimes(1) + //check arguments for axios post + expect(post.mock.calls[0][0]).toEqual(notificationConfig.url) + expect(post.mock.calls[0][1].location).toEqual(dataLocation) + expect(post.mock.calls[0][1].message).toEqual(message) + }) + + + it('should trigger notification when transformation failed and condition is "!data', async () => { + post.mockReturnValue(Promise.resolve()) + + const notificationConfig: WebhookConfig = { + id: 1, + pipelineId: 1, + condition: '!data', + url: 'callback' + } + + const message = "message" + const dataLocation = "location" + await notificationService.handleNotification(notificationConfig, CONFIG_TYPE.WEBHOOK, dataLocation, message, undefined) + + expect(post).toHaveBeenCalledTimes(1) + //check arguments for axios post + expect(post.mock.calls[0][0]).toEqual(notificationConfig.url) + expect(post.mock.calls[0][1].location).toEqual(dataLocation) + expect(post.mock.calls[0][1].message).toEqual(message) + }) + + + it('should trigger notification when condition is met', async () => { + post.mockReturnValue(Promise.resolve()) + + const notificationConfig: WebhookConfig = { + id: 1, + pipelineId: 1, + condition: 'data.value1 > 0', + url: 'callback' + } + + const message = "message" + const dataLocation = "location" + await notificationService.handleNotification(notificationConfig, CONFIG_TYPE.WEBHOOK, dataLocation, message, data) + + expect(post).toHaveBeenCalledTimes(1) + //check arguments for axios post + expect(post.mock.calls[0][0]).toEqual(notificationConfig.url) + expect(post.mock.calls[0][1].location).toEqual(dataLocation) + expect(post.mock.calls[0][1].message).toEqual(message) + }) + + + test('Notification does not trigger when condition is malformed', async () => { + const notificationConfig: WebhookConfig = { + id: 1, + pipelineId: 3, + condition: 'asdfa;', + url: 'callback' + } + + try { + const message = "message" + const dataLocation = "location" + await notificationService.handleNotification(notificationConfig, CONFIG_TYPE.WEBHOOK, dataLocation, message, data) + fail() + } catch (err) { + expect(err.message).toEqual("Malformed expression received: asdfa;\n Error message: ReferenceError: asdfa is not defined") + } + + expect(post).not.toHaveBeenCalled() + }) + + + test('SLACK request', async () => { + + const request: SlackConfig = { + id:1, + condition: 'data.value1 > 0', + pipelineId: 42, + workspaceId: '012', + channelId: '123', + secret: '42' + } + + const message = "message" + const dataLocation = "location" + await notificationService.handleNotification(request, CONFIG_TYPE.SLACK, dataLocation, message, data) + + const expectedObject: SlackCallback = { + text: message + } + expect(post).toHaveBeenCalledTimes(1) + const expectedUrl = `https://hooks.slack.com/services/${request.workspaceId}/${request.channelId}/${request.secret}` + + expect(post.mock.calls[0][0]).toEqual(expectedUrl) + expect(post.mock.calls[0][1]).toEqual(expectedObject) + }) + }) +}) diff --git a/notification/src/notification-execution/notificationExecutor.ts b/notification/src/notification-execution/notificationExecutor.ts new file mode 100644 index 000000000..6f315ff39 --- /dev/null +++ b/notification/src/notification-execution/notificationExecutor.ts @@ -0,0 +1,104 @@ +import App = firebase.app.App; +import axios from 'axios' +import * as firebase from 'firebase-admin' + +import { CONFIG_TYPE, NotificationConfig, WebhookConfig, SlackConfig, FirebaseConfig } from '../notification-config/notificationConfig'; + +import SlackCallback from './notificationCallbacks/slackCallback'; +import WebhookCallback from './notificationCallbacks/webhookCallback'; +import FcmCallback from './notificationCallbacks/fcmCallback'; + +import SandboxExecutor from './condition-evaluation/sandboxExecutor'; + + +const VERSION = '0.0.1' + +export default class NotificationExecutor { + + executor: SandboxExecutor + + constructor (executor: SandboxExecutor) { + this.executor = executor + } + + getVersion (): string { + return VERSION + } + +async handleNotification(notification: NotificationConfig, type: CONFIG_TYPE, dataLocation: string, message: string, data?: object): Promise { + console.log(`NotificationRequest received for pipeline: ${notification.pipelineId}.`) + + const conditionHolds = this.executor.evaluate(notification.condition, data) + console.log('Condition is ' + conditionHolds) + if (!conditionHolds) { // no need to trigger notification + return Promise.resolve() + } + + switch (type) { + case CONFIG_TYPE.WEBHOOK: + await this.handleWebhook(notification as WebhookConfig, dataLocation, message) + break + case CONFIG_TYPE.FCM: + await this.handleFCM(notification as FirebaseConfig, dataLocation, message) + break + case CONFIG_TYPE.SLACK: + await this.handleSlack(notification as SlackConfig, dataLocation, message) + break + default: + throw new Error('Notification type not implemented.') + } + } + + private async handleWebhook (webhook: WebhookConfig, dataLocation: string, message: string): Promise { + const callbackObject: WebhookCallback = { + location: dataLocation, + message: message, + timestamp: new Date(Date.now()) + } + console.log(`Posting webhook to ${webhook.url}, callback object: ${JSON.stringify(callbackObject)}.`) + await axios.post(webhook.url, callbackObject) + } + + private async handleSlack (slack: SlackConfig, dataLocation: string, message: string): Promise { + let slackBaseUri = 'https://hooks.slack.com/services' + if (process.env.MOCK_RECEIVER_HOST && process.env.MOCK_RECEIVER_PORT) { + slackBaseUri = `http://${process.env.MOCK_RECEIVER_HOST}:${process.env.MOCK_RECEIVER_PORT}/slack` + } + const callbackObject: SlackCallback = { + text: message + } + const url = `${slackBaseUri}/${slack.workspaceId}/${slack.channelId}/${slack.secret}` + console.log(`Posting slack notification to ${url}, callbackObject: ${JSON.stringify(callbackObject)}`) + await axios.post(url, callbackObject) + } + + private async handleFCM (firebaseRequest: FirebaseConfig, dataLocation: string, message: string): Promise { + let app: App + try { + app = firebase.app(firebaseRequest.clientEmail) + } catch (e) { // app does not exist yet + app = firebase.initializeApp({ + credential: firebase.credential.cert({ + projectId: firebaseRequest.projectId, + clientEmail: firebaseRequest.clientEmail, + privateKey: firebaseRequest.privateKey.replace(/\\n/g, '\n') + }), + databaseURL: `https://${firebaseRequest.projectId}.firebaseio.com` + }, + firebaseRequest.clientEmail) + } + const firebaseMessage: FcmCallback = { + notification: { + title: 'New Data Available', + body: dataLocation + }, + data: { + message: message + }, + topic: firebaseRequest.topic + } + console.log(`Sending firebase message, callback object: ${JSON.stringify(firebaseMessage)}.`) + const firebaseResponse = await firebase.messaging(app).send(firebaseMessage) + console.log(`Firebase message sent to: ${firebaseResponse}`) + } +} diff --git a/notification/src/notificationEndpoint.ts b/notification/src/notificationEndpoint.ts deleted file mode 100644 index b2fc55791..000000000 --- a/notification/src/notificationEndpoint.ts +++ /dev/null @@ -1,126 +0,0 @@ -import bodyParser from 'body-parser' -import express, { Application, Request, Response } from 'express' -import session, { MemoryStore } from 'express-session' -import cors from 'cors' -import Keycloak from 'keycloak-connect' -import NotificationService from './interfaces/notificationService' - -import { Server } from 'http' - -import { Firebase, NotificationRequest, Slack, Webhook } from '@/interfaces/notificationRequest' - -export class NotificationEndpoint { - port: number - app: Application - store?: MemoryStore - keycloak?: Keycloak - - NotificationService: NotificationService - - constructor (NotificationService: NotificationService, port: number, auth: boolean) { - this.port = port - this.NotificationService = NotificationService - - this.app = express() - - this.app.use(cors()) - this.app.use(bodyParser.json({ limit: '50mb' })) - this.app.use(bodyParser.urlencoded({ extended: false })) - - this.store = undefined - if (auth) { - this.store = new session.MemoryStore() - this.keycloak = new Keycloak({ store: this.store }) - this.app.use(this.keycloak.middleware()) - } - - this.app.get('/', this.getHealthCheck) - this.app.get('/version', this.getVersion) - this.app.post('/webhook', this.determineAuth(), this.postWebhook) - this.app.post('/slack', this.determineAuth(), this.postSlack) - this.app.post('/fcm', this.determineAuth(), this.postFirebase) - } - - listen (): Server { - return this.app.listen(this.port, () => { - console.log('listening on port ' + this.port) - }) - } - - // The following methods need arrow syntax because of javascript 'this' shenanigans - - getHealthCheck = (req: Request, res: Response): void => { - res.send('I am alive!') - } - - getVersion = (req: Request, res: Response): void => { - res.header('Content-Type', 'text/plain') - res.send(this.NotificationService.getVersion()) - res.end() - } - - postWebhook = async (req: Request, res: Response): Promise => { - const webhookRequest = req.body as Webhook - if (!NotificationEndpoint.isValidWebhookRequest(webhookRequest)) { - res.status(400).send('Malformed webhook request.') - } - await this.processNotificationRequest(webhookRequest, res) - } - - postSlack = async (req: Request, res: Response): Promise => { - const slackRequest = req.body as Slack - if (!NotificationEndpoint.isValidSlackRequest(slackRequest)) { - res.status(400).send('Malformed webhook request.') - } - await this.processNotificationRequest(slackRequest, res) - } - - postFirebase = async (req: Request, res: Response): Promise => { - const firebaseRequest = req.body as Firebase - if (!NotificationEndpoint.isValidFirebaseRequest(firebaseRequest)) { - res.status(400).send('Malformed webhook request.') - } - await this.processNotificationRequest(firebaseRequest, res) - } - - processNotificationRequest = async (notification: NotificationRequest, res: Response): Promise => { - try { - await this.NotificationService.handleNotification(notification) - } catch (e) { - if (e instanceof Error) { - console.log(`Notification handling failed. Nested cause is: ${e.name}: ${e.message}`) - res.status(500).send(`Notification handling failed. Nested cause is: ${e.name}: ${e.message}`) - } else { - res.status(500).send() - } - } - res.status(200).send() - } - - determineAuth = (): express.RequestHandler | [] => { - if (this.keycloak !== undefined) { - return this.keycloak.protect() - } else { - return [] - } - } - - private static isValidWebhookRequest (obj: Webhook): boolean { - return this.isValidNotificationRequest(obj) && - obj.type === 'WEBHOOK' - } - - private static isValidSlackRequest (obj: Slack): boolean { - return this.isValidNotificationRequest(obj) && - obj.type === 'SLACK' && !!obj.channelId && !!obj.secret && !!obj.workspaceId - } - - private static isValidFirebaseRequest (obj: Firebase): boolean { - return this.isValidNotificationRequest(obj) && - obj.type === 'FCM' && !!obj.clientEmail && !!obj.privateKey && !!obj.projectId && !!obj.topic - } - - private static isValidNotificationRequest (obj: NotificationRequest): boolean { - return !!obj.data && !!obj.pipelineName && !!obj.pipelineId && !!obj.condition && !!obj.dataLocation - } -} diff --git a/notification/tsconfig.json b/notification/tsconfig.json index e3f2e9186..d8e98e009 100644 --- a/notification/tsconfig.json +++ b/notification/tsconfig.json @@ -1,5 +1,7 @@ { "compilerOptions": { + "emitDecoratorMetadata": true, + "experimentalDecorators": true, "target": "es5", "module": "commonjs", "strict": true, @@ -11,9 +13,9 @@ "allowJs": true, "baseUrl": ".", "paths": { - "@/*": ["src/*"] + "@/*": ["src/*", "tests/*"] }, - "lib": ["es5" , "dom"], + "lib": ["es5" , "es6", "dom"], "outDir": "dist" }, "include": [ diff --git a/scheduler/integration-test/src/mock.core.js b/scheduler/integration-test/src/mock.core.js index 355d8a6ca..17dfbdec1 100644 --- a/scheduler/integration-test/src/mock.core.js +++ b/scheduler/integration-test/src/mock.core.js @@ -12,8 +12,7 @@ const PIPELINES = [ func: 'return data;' // not performed in integration testing }, persistence: {}, - metadata: {}, - notifications: [] + metadata: {} }, { id: 125, @@ -24,24 +23,7 @@ const PIPELINES = [ persistence: {}, metadata: { displayName: 'nordstream' - }, - notifications: [ - { - type: 'SLACK', - condition: 'data.field2 === 123', - url: 'should-be-triggered' - }, - { - type: 'WEBHOOK', - condition: 'data.field2 < 0', - url: 'should-also-be-triggered' - }, - { - type: 'FCM', - condition: 'data.field2 === 123', - url: 'should-be-triggered' - } - ] + } } ] diff --git a/scheduler/integration-test/src/mock.notification.js b/scheduler/integration-test/src/mock.notification.js index 4684ceba5..6c16d12a1 100644 --- a/scheduler/integration-test/src/mock.notification.js +++ b/scheduler/integration-test/src/mock.notification.js @@ -9,46 +9,26 @@ const PORT = process.env.MOCK_NOTIFICATION_PORT || 8084 const app = new Koa() app.use(bodyParser()) -const webhooks = new Map() -const slacks = new Map() -const firebases = new Map() +const triggers = new Map() router.get('/', async ctx => { ctx.type = 'text/plain' ctx.body = 'ok' }) -router.post('/webhook', async ctx => { - webhooks.set(ctx.request.body.pipelineName, ctx.request.body) - ctx.status = 200 -}) - -router.post('/slack', async ctx => { - slacks.set(ctx.request.body.pipelineName, ctx.request.body) - ctx.status = 200 -}) - -router.post('/fcm', async ctx => { - firebases.set(ctx.request.body.pipelineName, ctx.request.body) - ctx.status = 200 +router.post('/trigger', async ctx => { + const pipelineId = ctx.request.body.pipelineId + triggers.set("" + pipelineId, ctx.request.body) + console.log(`[Notification Mock] Stored trigger reachable under '/trigger/${pipelineId}' ${JSON.stringify(ctx.request.body)}`) + ctx.status = 201 }) -router.get('/webhook/:url', async ctx => { - const url = ctx.params.url +router.get('/trigger/:pipelineId', async ctx => { + const pipelineId = ctx.params.pipelineId ctx.type = 'application/json' - ctx.body = webhooks.get(url) -}) - -router.get('/slack/:url', async ctx => { - const url = ctx.params.url - ctx.type = 'application/json' - ctx.body = slacks.get(url) -}) - -router.get('/fcm/:url', async ctx => { - const url = ctx.params.url - ctx.type = 'application/json' - ctx.body = firebases.get(url) + ctx.body = triggers.get("" + pipelineId) + console.log(`[Notification Mock] Requested trigger for pipeline ${pipelineId}: ${JSON.stringify(ctx.body)}`) + ctx.status = 200 }) app.use(router.routes()) diff --git a/scheduler/integration-test/src/mock.transformation.js b/scheduler/integration-test/src/mock.transformation.js index b56786221..7ec7b2760 100644 --- a/scheduler/integration-test/src/mock.transformation.js +++ b/scheduler/integration-test/src/mock.transformation.js @@ -9,10 +9,6 @@ const PORT = process.env.MOCK_TRANSFORMATION_PORT || 8083 const app = new Koa() app.use(bodyParser()) -const webhooks = new Map() -const slacks = new Map() -const firebases = new Map() - router.get('/', async ctx => { ctx.type = 'text/plain' ctx.body = 'ok' diff --git a/scheduler/integration-test/src/scheduler.test.js b/scheduler/integration-test/src/scheduler.test.js index 3a54fc6c3..cba1939ca 100644 --- a/scheduler/integration-test/src/scheduler.test.js +++ b/scheduler/integration-test/src/scheduler.test.js @@ -79,44 +79,14 @@ describe('Scheduler', () => { test('Pipeline triggers correct notifications', async () => { await sleep(10000) // pipeline should have been executing until now! - const triggered = await request(MOCK_NOTIFICATION_URL).get('/webhook/nordstream') + const triggered = await request(MOCK_NOTIFICATION_URL).get(`/trigger/125`) expect(triggered.status).toEqual(200) expect(triggered.body).toEqual( { pipelineId: 125, pipelineName: 'nordstream', - type: 'WEBHOOK', data, dataLocation: MOCK_STORAGE_URL + '/125', - condition: 'data.field2 < 0', - url: 'should-also-be-triggered' - }) - - const alsoTriggered = await request(MOCK_NOTIFICATION_URL).get('/slack/nordstream') - expect(alsoTriggered.status).toEqual(200) - expect(alsoTriggered.type).toEqual('application/json') - expect(alsoTriggered.body).toEqual( - { - pipelineId: 125, - pipelineName: 'nordstream', - type: 'SLACK', - data, - condition: 'data.field2 === 123', - dataLocation: MOCK_STORAGE_URL + '/125', - url: 'should-be-triggered' - }) - const alsoTriggeredToo = await request(MOCK_NOTIFICATION_URL).get('/fcm/nordstream') - expect(alsoTriggeredToo.status).toEqual(200) - expect(alsoTriggeredToo.type).toEqual('application/json') - expect(alsoTriggeredToo.body).toEqual( - { - pipelineId: 125, - pipelineName: 'nordstream', - type: 'FCM', - data, - condition: 'data.field2 === 123', - dataLocation: MOCK_STORAGE_URL + '/125', - url: 'should-be-triggered' }) }, 12000) diff --git a/scheduler/src/clients/notification-client.ts b/scheduler/src/clients/notification-client.ts index fdefdcd1c..3caf5d87a 100644 --- a/scheduler/src/clients/notification-client.ts +++ b/scheduler/src/clients/notification-client.ts @@ -1,5 +1,4 @@ import axios, { AxiosResponse } from 'axios' -import NotificationConfig from '@/interfaces/notification-config' const NOTIFICATION_SERVICE_URL = process.env.NOTIFICATION_SERVICE_URL || 'http://localhost:8084' @@ -9,9 +8,19 @@ const http = axios.create({ }) -export async function executeNotification (notificationConfig: NotificationConfig): Promise { - const response = await http.post(`${notificationConfig.type}`, notificationConfig) - if (response.status !== 200 && response.status !== 204) { +export async function executeNotification (triggerEvent: NotificationTriggerEvent): Promise { + const response = await http.post(`trigger`, triggerEvent) + if (response.status !== 200 && response.status !== 204 && response.status !== 201) { return Promise.reject(new Error(`Error contacting notification-service: Got status ${response.status} for triggering notification on URL ${NOTIFICATION_SERVICE_URL}.`)) } } + +export interface NotificationTriggerEvent { + pipelineId: number + pipelineName: string + + dataLocation: string // url (location) of the queryable data + + data?: object + error?: object +} diff --git a/scheduler/src/clients/transformation-client.ts b/scheduler/src/clients/transformation-client.ts index 36ab16bbb..a71fe897d 100644 --- a/scheduler/src/clients/transformation-client.ts +++ b/scheduler/src/clients/transformation-client.ts @@ -1,5 +1,4 @@ import axios, { AxiosResponse } from 'axios' -import NotificationConfig from '@/interfaces/notification-config' import TransformationConfig from '@/interfaces/transformation-config' const TRANSFORMATION_SERVICE_URL = process.env.TRANSFORMATION_SERVICE_URL || 'http://localhost:8083' @@ -9,7 +8,12 @@ const http = axios.create({ headers: { 'Content-Type': 'application/json' } }) -export async function executeTransformation (config: TransformationConfig): Promise { +export async function executeTransformation (config: TransformationConfig): Promise { const response = await http.post('/job', config) return response.data } + +export interface TransformationResult { + data?: object, + error?: object +} diff --git a/scheduler/src/interfaces/notification-config.ts b/scheduler/src/interfaces/notification-config.ts deleted file mode 100644 index 85328a332..000000000 --- a/scheduler/src/interfaces/notification-config.ts +++ /dev/null @@ -1,7 +0,0 @@ -export default interface NotificationConfig { - pipelineId?: number; - pipelineName?: string; - type: string; - data: object; - dataLocation: string; -} diff --git a/scheduler/src/interfaces/pipeline-config.ts b/scheduler/src/interfaces/pipeline-config.ts index deb45cda1..6e29b2e3a 100644 --- a/scheduler/src/interfaces/pipeline-config.ts +++ b/scheduler/src/interfaces/pipeline-config.ts @@ -1,4 +1,3 @@ -import NotificationConfig from './notification-config' import TransformationConfig from './transformation-config' export default interface PipelineConfig { @@ -6,7 +5,6 @@ export default interface PipelineConfig { datasourceId: number; transformation: TransformationConfig | undefined; metadata: PipelineMetadata; - notifications: NotificationConfig[]; } export interface PipelineMetadata { diff --git a/scheduler/src/workflow-execution.test.ts b/scheduler/src/workflow-execution.test.ts index a90eff3a8..7e0e6cc27 100644 --- a/scheduler/src/workflow-execution.test.ts +++ b/scheduler/src/workflow-execution.test.ts @@ -6,7 +6,6 @@ import * as TransformationClient from './clients/transformation-client' import * as NotificationClient from './clients/notification-client' import * as CoreClient from './clients/core-client' import PipelineConfig from './interfaces/pipeline-config' -import NotificationConfig from './interfaces/notification-config' import AdapterResponse from '@/interfaces/adapter-response' import DatasourceConfig from './interfaces/datasource-config' import TransformationConfig from './interfaces/transformation-config' @@ -43,7 +42,7 @@ afterEach(() => { test('Should execute pipeline once', async () => { const datasourceConfig = generateDatasourceConfig(false) const transformation = { dataLocation: '/data/42' } - const pipelineConfig = generatePipelineConfig(transformation, []) + const pipelineConfig = generatePipelineConfig(transformation) mockGetPipelinesForDatasource.mockReturnValue([pipelineConfig]) // register pipeline to follow datasource import @@ -65,7 +64,7 @@ test('Should execute pipeline once', async () => { test('Should execute pipeline periodic', async () => { const datasourceConfig = generateDatasourceConfig(true) const transformation = { dataLocation: 'data/42' } - const pipelineConfig = generatePipelineConfig(transformation, []) + const pipelineConfig = generatePipelineConfig(transformation) mockGetPipelinesForDatasource.mockReturnValue([pipelineConfig]) // register pipeline to follow datasource import @@ -81,46 +80,19 @@ test('Should execute pipeline periodic', async () => { expect(mockExecuteTransformation).toHaveBeenCalledWith(transformation) expect(mockExecuteStorage).toHaveBeenCalledWith(pipelineConfig, transformedData) }) - -test('Should not execute undefined transformation', async () => { - const datasourceConfig = generateDatasourceConfig(false) - const pipelineConfig = generatePipelineConfig(undefined, []) // transformation undefined - - mockExecuteAdapter.mockResolvedValue(adapterResponse) - - await PipelineExecution.execute(datasourceConfig) - - expect(mockExecuteNotification).not.toBeCalled() -}) - test('Should trigger notifications', async () => { - const notification1: NotificationConfig = { - type: 'WEBHOOK', - data: { value1: 1 }, - dataLocation: 'some.where/over/the/rainbow' - } - const notification2: NotificationConfig = { - type: 'SLACK', - data: { schtring: 'text' }, - dataLocation: 'way.up/high' - } - const notification3: NotificationConfig = { - type: 'FCM', - data: { schtring: 'text' }, - dataLocation: 'way.up/high' - } const transformation: TransformationConfig = { dataLocation: 'hier' } const datasourceConfig = generateDatasourceConfig(false) - const pipelineConfig = generatePipelineConfig(transformation, [notification1, notification2, notification3]) + const pipelineConfig = generatePipelineConfig(transformation) mockGetPipelinesForDatasource.mockReturnValue([pipelineConfig]) // register pipeline to follow datasource import mockExecuteAdapter.mockResolvedValue(adapterResponse) await PipelineExecution.execute(datasourceConfig) - expect(mockExecuteNotification).toHaveBeenCalledTimes(3) + expect(mockExecuteNotification).toHaveBeenCalledTimes(1) }) function generateDatasourceConfig (periodic = true): DatasourceConfig { @@ -149,8 +121,7 @@ function generateDatasourceConfig (periodic = true): DatasourceConfig { } } -function generatePipelineConfig ( - transformation: TransformationConfig | undefined, notifications: NotificationConfig[]): PipelineConfig { +function generatePipelineConfig (transformation: TransformationConfig | undefined): PipelineConfig { return { id: 555, datasourceId: 123, @@ -159,7 +130,6 @@ function generatePipelineConfig ( displayName: 'pipeline 555', creationTimestamp: new Date(Date.now() + 5000), license: 'license 555' - }, - notifications: notifications + } } } diff --git a/scheduler/src/workflow-execution.ts b/scheduler/src/workflow-execution.ts index e2cc7152b..e62e8e2e1 100644 --- a/scheduler/src/workflow-execution.ts +++ b/scheduler/src/workflow-execution.ts @@ -6,7 +6,6 @@ import * as StorageClient from './clients/storage-client' import DatasourceConfig from './interfaces/datasource-config' import PipelineConfig from './interfaces/pipeline-config' -import NotificationConfig from './interfaces/notification-config' import { AxiosError } from 'axios' import AdapterResponse from '@/interfaces/adapter-response' @@ -18,15 +17,18 @@ export async function execute (datasourceConfig: DatasourceConfig, maxRetries = // pipeline const followingPipelines = await CoreClient.getCachedPipelinesByDatasourceId(datasourceConfig.id) for (let pipelineConfig of followingPipelines) { - const transformedData = + const transformationResult = await retryableExecution(executeTransformation, { pipelineConfig: pipelineConfig, dataLocation: adapterResponse.location }, `Executing transformatins for pipeline ${pipelineConfig.id}`) + if(!!transformationResult.error) { + console.log(`Transformation for pipeline ${pipelineConfig.id} went wrong. Not storing data or sending notifications.`) + continue + } + const dataLocation = - await retryableExecution(executeStorage, { pipelineConfig: pipelineConfig, data: transformedData }, `Storing data for pipeline ${pipelineConfig.id}`) + await retryableExecution(executeStorage, { pipelineConfig: pipelineConfig, data: transformationResult.data! }, `Storing data for pipeline ${pipelineConfig.id}`) - pipelineConfig.notifications.map(async notificationConfig => { - await retryableExecution(executeNotification, { notificationConfig: notificationConfig, pipelineConfig: pipelineConfig, data: transformedData, dataLocation: dataLocation }, `Notifying clients for pipeline ${pipelineConfig.id}`) - }) + await retryableExecution(executeNotification, { pipelineConfig: pipelineConfig, dataLocation: dataLocation, data: transformationResult.data, error: transformationResult.error }, `Notifying clients for pipeline ${pipelineConfig.id}`) } } @@ -56,7 +58,7 @@ async function executeAdapter (dataousrceConfig: DatasourceConfig): Promise { +async function executeTransformation (args: { pipelineConfig: PipelineConfig, dataLocation: string }): Promise { const pipelineConfig = args.pipelineConfig const dataLocation = args.dataLocation @@ -70,7 +72,7 @@ async function executeTransformation (args: { pipelineConfig: PipelineConfig, da try { pipelineConfig.transformation.dataLocation = AdapterClient.ADAPTER_SERVICE_URL + dataLocation const jobResult = await TransformationClient.executeTransformation(pipelineConfig.transformation) - return jobResult.data + return jobResult } catch (e) { handleError(e) throw new Error('Failed to transform Data via Transformation Service') @@ -87,15 +89,20 @@ async function executeStorage (args: { pipelineConfig: PipelineConfig, data: obj return dataLocation } -async function executeNotification (args: { notificationConfig: NotificationConfig, pipelineConfig: PipelineConfig, data: object, dataLocation: string }): Promise { - const notificationConfig = args.notificationConfig +async function executeNotification (args: { pipelineConfig: PipelineConfig, dataLocation: string, data?: object, error?: object }): Promise { const pipelineConfig = args.pipelineConfig + const data = args.data + const error = args.error + + const notificationTrigger: NotificationClient.NotificationTriggerEvent = { + dataLocation: args.dataLocation, + pipelineId: pipelineConfig.id, + pipelineName: pipelineConfig.metadata.displayName, + data: data, + error: error + } - notificationConfig.data = args.data - notificationConfig.dataLocation = args.dataLocation - notificationConfig.pipelineId = pipelineConfig.id - notificationConfig.pipelineName = pipelineConfig.metadata.displayName - await NotificationClient.executeNotification(notificationConfig) + await NotificationClient.executeNotification(notificationTrigger) console.log(`Successfully delivered notification request to transformation-service for ${pipelineConfig.id}`) } diff --git a/system-test/src/system.test.js b/system-test/src/system.test.js index 6d13919f0..e0abaf134 100644 --- a/system-test/src/system.test.js +++ b/system-test/src/system.test.js @@ -6,8 +6,9 @@ const STORAGE_URL = process.env.STORAGE_API || 'http://localhost:9000/api/storag const SCHEDULER_URL = process.env.SCHEDULER_API || 'http://localhost:9000/api/scheduler' const ADAPTER_URL = process.env.ADAPTER_API || 'http://localhost:9000/api/adapter' const TRANSFORMATION_URL = process.env.TRANSFORMATION_API || 'http://localhost:9000/api/transformation' +const NOTIFICATION_URL = process.env.NOTIFICATION_API || 'http://localhost:9000/api/notification' const MOCK_SERVER_URL = process.env.MOCK_SERVER_API || 'http://localhost:9000/api/system-tests/mock-server' -const RABBIT_URL = process.env.RABBIT_API || 'http://localhost:9000/api/rabbitmq' +const RABBIT_URL = `http://${process.env.RABBIT_HOST}:15672` const STORAGE_DOCKER = process.env.STORAGE_API || 'http://storage:3000' // needed to run tests outside of docker environment const MOCK_SERVER_DOCKER = process.env.MOCK_SERVER_API || 'http://mock-server:8080' @@ -25,6 +26,7 @@ describe('System-Test', () => { console.log('Waiting for core-service with URL: ' + CORE_URL) console.log('Waiting for scheduler-service with URL: ' + SCHEDULER_URL) console.log('Waiting for transformation-service with URL: ' + TRANSFORMATION_URL) + console.log('Waiting for notification-service with URL: ' + NOTIFICATION_URL) console.log('Waiting for adapter-service with URL: ' + ADAPTER_URL) console.log('Waiting for storage-service with URL: ' + STORAGE_URL) console.log('Waiting for mock server with URL: ' + MOCK_SERVER_URL + '/') @@ -36,14 +38,15 @@ describe('System-Test', () => { CORE_URL + '/version', SCHEDULER_URL, TRANSFORMATION_URL, + NOTIFICATION_URL + '/', ADAPTER_URL + '/version', MOCK_SERVER_URL + '/', RABBIT_URL ], - timeout: 20000, + timeout: 60000, log: true }) - }, 22000) + }, 60000) afterAll(async () => { console.log('All tests done, removing adapter configs from ods...') @@ -73,21 +76,32 @@ describe('System-Test', () => { const adapterResponse = await request(ADAPTER_URL) .post('/datasources') .send(datasourceConfig) + expect(adapterResponse.status).toEqual(201) const datasourceId = adapterResponse.body.id console.log(`[Test 1] Successfully created datasource ${datasourceId}`) // Add pipeline to core service const pipelineConfig = generatePipelineConfig(datasourceId) - const notification = generateNotification('data.one === 1', MOCK_SERVER_DOCKER + '/notifications/test1') - pipelineConfig.notifications = [notification] console.log(`[Test 1] Trying to create pipeline: ${JSON.stringify(pipelineConfig)}`) const pipelineResponse = await request(CORE_URL) .post('/pipelines') .send(pipelineConfig) + expect(pipelineResponse.status).toEqual(201) const pipelineId = pipelineResponse.body.id console.log(`[Test 1] Successfully created pipeline ${pipelineId} for datasource ${datasourceId}`) + // Add notification to notification service + const notificationConfig = generateWebhookNotification(pipelineId, 'data.one === 1', MOCK_SERVER_DOCKER + '/notifications/test1') + + console.log(`[Test 1] Trying to create notification: ${JSON.stringify(notificationConfig)}`) + const notificationResponse = await request(NOTIFICATION_URL) + .post('/config/webhook') + .send(notificationConfig) + expect(notificationResponse.status).toEqual(201) + const notificationId = notificationResponse.body.id + console.log(`[Test 1] Successfully created notification ${notificationId} for pipeline ${pipelineId}`) + // Wait for webhook notification const webhookResponse = await checkWebhook('test1', 2000) console.log(`[Test 1] Webhook response body: ${JSON.stringify(webhookResponse.body)}`) @@ -113,7 +127,7 @@ describe('System-Test', () => { .send() expect(deletionResponse.status).toEqual(204) sleep(2000) // takes up to 2sec to reach scheduler - }, 30000) + }, 60000) test('Test 2: Create periodic pipeline without transformation', async () => { // Prepare datasource mock @@ -128,21 +142,32 @@ describe('System-Test', () => { const adapterResponse = await request(ADAPTER_URL) .post('/datasources') .send(datasourceConfig) + expect(adapterResponse.status).toEqual(201) const datasourceId = adapterResponse.body.id console.log(`[Test 2] Successfully created datasource ${datasourceId}`) // Add pipeline to core service const pipelineConfig = generatePipelineConfig(datasourceId) - const notification = generateNotification('data.count <= 2', MOCK_SERVER_DOCKER + '/notifications/test2') - pipelineConfig.notifications = [notification] console.log(`[Test 2] Trying to create pipeline: ${JSON.stringify(pipelineConfig)}`) const pipelineResponse = await request(CORE_URL) .post('/pipelines') .send(pipelineConfig) + expect(pipelineResponse.status).toEqual(201) const pipelineId = pipelineResponse.body.id console.log(`[Test 2] Successfully created pipeline ${pipelineId} for datasource ${datasourceId}`) + // Add notification to notification service + const notificationConfig = generateWebhookNotification(pipelineId, 'data.count <= 2', MOCK_SERVER_DOCKER + '/notifications/test2') + + console.log(`[Test 2] Trying to create notification: ${JSON.stringify(notificationConfig)}`) + const notificationResponse = await request(NOTIFICATION_URL) + .post('/config/webhook') + .send(notificationConfig) + expect(notificationResponse.status).toEqual(201) + const notificationId = notificationResponse.body.id + console.log(`[Test 2] Successfully created notification ${notificationId} for pipeline ${pipelineId}`) + // Wait for webhook notification const webhookResponse = await checkWebhook('test2', 2000) console.log(`[Test 2] Webhook response body ${JSON.stringify(webhookResponse.body)}`) @@ -177,7 +202,7 @@ describe('System-Test', () => { .send() expect(deletionResponse.status).toEqual(204) sleep(2000) // takes up to 2sec to reach scheduler - }, 40000) + }, 60000) test('Test 3: Create non-periodic pipeline with transformation', async () => { // Prepare datasource mock @@ -196,22 +221,33 @@ describe('System-Test', () => { const adapterResponse = await request(ADAPTER_URL) .post('/datasources') .send(datasourceConfig) + expect(adapterResponse.status).toEqual(201) const datasourceId = adapterResponse.body.id console.log(`[Test 3] Successfully created datasource ${datasourceId}`) // Add pipeline to core service const pipelineConfig = generatePipelineConfig(datasourceId) pipelineConfig.transformation = { func: 'data.newField = 12;return data;' } - const notification = generateNotification('data.newField === 12', MOCK_SERVER_DOCKER + '/notifications/test3') - pipelineConfig.notifications = [notification] console.log(`[Test 3] Trying to create pipeline: ${JSON.stringify(pipelineConfig)}`) const pipelineResponse = await request(CORE_URL) .post('/pipelines') .send(pipelineConfig) + expect(pipelineResponse.status).toEqual(201) const pipelineId = pipelineResponse.body.id console.log(`[Test 3] Successfully created pipeline ${pipelineId} for datasource ${datasourceId}`) + // Add notification to notification service + const notificationConfig = generateWebhookNotification(pipelineId, 'data.newField === 12', MOCK_SERVER_DOCKER + '/notifications/test3') + + console.log(`[Test 3] Trying to create notification: ${JSON.stringify(notificationConfig)}`) + const notificationResponse = await request(NOTIFICATION_URL) + .post('/config/webhook') + .send(notificationConfig) + expect(notificationResponse.status).toEqual(201) + const notificationId = notificationResponse.body.id + console.log(`[Test 3] Successfully created notification ${notificationId} for pipeline ${pipelineId}`) + // Wait for webhook notification const webhookResponse = await checkWebhook('test3', 2000) console.log(`[Test 3] Webhook response body: ${JSON.stringify(webhookResponse.body)}`) @@ -236,7 +272,7 @@ describe('System-Test', () => { .send() expect(deletionResponse.status).toEqual(204) sleep(2000) // takes up to 2sec to reach scheduler - }, 30000) + }, 60000) test('Test 4: Update periodic datasource with pipeline', async () => { // Prepare datasource mock @@ -257,21 +293,32 @@ describe('System-Test', () => { const adapterResponse = await request(ADAPTER_URL) .post('/datasources') .send(datasource) + expect(adapterResponse.status).toEqual(201) const datasourceId = adapterResponse.body.id console.log(`[Test 4] Successfully created datasource ${datasourceId}`) // Add pipeline to core service const pipelineConfig = generatePipelineConfig(datasourceId) - const notification = generateNotification('data.one === 1', MOCK_SERVER_DOCKER + '/notifications/test4_1') - pipelineConfig.notifications = [notification] console.log(`[Test 4] Trying to create pipeline: ${JSON.stringify(pipelineConfig)}`) const pipelineResponse = await request(CORE_URL) .post('/pipelines') .send(pipelineConfig) + expect(pipelineResponse.status).toEqual(201) const pipelineId = pipelineResponse.body.id console.log(`[Test 4] Successfully created pipeline ${pipelineId} for datasource ${datasourceId}`) + // Add notification to notification service + const notificationConfig = generateWebhookNotification(pipelineId, 'data.one === 1', MOCK_SERVER_DOCKER + '/notifications/test4_1') + + console.log(`[Test 4] Trying to create notification: ${JSON.stringify(notificationConfig)}`) + const notificationResponse = await request(NOTIFICATION_URL) + .post('/config/webhook') + .send(notificationConfig) + expect(notificationResponse.status).toEqual(201) + const notificationId = notificationResponse.body.id + console.log(`[Test 4] Successfully created notification ${notificationId} for pipeline ${pipelineId}`) + // Wait for webhook notification const webhookResponse = await checkWebhook('test4_1', 2000) console.log(`[Test 4] Webhook response body ${JSON.stringify(webhookResponse.body)}`) @@ -299,8 +346,6 @@ describe('System-Test', () => { // Create updated pipeline pipelineConfig.id = pipelineId - const anotherNotification = generateNotification('data.two === "two"', MOCK_SERVER_DOCKER + '/notifications/test4_2') - pipelineConfig.notifications = [notification, anotherNotification] console.log(`[Test 4] Pipeline ${pipelineId} update request triggered.`) // Update pipeline @@ -310,6 +355,17 @@ describe('System-Test', () => { expect(updateResponse.status).toEqual(204) console.log(`[Test 4] Successfully updatedd pipeline ${pipelineId}.`) + // Add another notification + const anotherNotification = generateWebhookNotification(pipelineId, 'data.two === "two"', MOCK_SERVER_DOCKER + '/notifications/test4_2') + + console.log(`[Test 4] Trying to create notification: ${JSON.stringify(anotherNotification)}`) + const anotherNotificationResponse = await request(NOTIFICATION_URL) + .post('/config/webhook') + .send(anotherNotification) + expect(anotherNotificationResponse.status).toEqual(201) + const anotherNotificationId = anotherNotificationResponse.body.id + console.log(`[Test 4] Successfully created notification ${anotherNotificationId} for pipeline ${pipelineId}`) + // Wait for webhook notification const secondWebhook = await checkWebhook('test4_2', 2000) expect(secondWebhook.body.location).toEqual(STORAGE_DOCKER + '/' + pipelineId) @@ -337,7 +393,7 @@ describe('System-Test', () => { .send() expect(deletionResponse.status).toEqual(204) sleep(2000) // takes up to 2sec to reach scheduler - }, 40000) + }, 60000) test('Test 5: Create pipeline with multiple notifications', async () => { // Prepare datasource mock @@ -353,23 +409,46 @@ describe('System-Test', () => { const adapterResponse = await request(ADAPTER_URL) .post('/datasources') .send(datasourceConfig) + expect(adapterResponse.status).toEqual(201) const datasourceId = adapterResponse.body.id console.log(`[Test 5] Successfully created datasource ${datasourceId}`) // Add pipeline to core service const pipelineConfig = generatePipelineConfig(datasourceId) - const notification1 = generateNotification('data.one === 1', MOCK_SERVER_DOCKER + '/notifications/test5_1') - const notification2 = generateNotification('data.one === 1', MOCK_SERVER_DOCKER + '/notifications/test5_2') - const notification3 = generateNotification('data.one < 1', MOCK_SERVER_DOCKER + '/notifications/test5_3') - pipelineConfig.notifications = [notification1, notification2, notification3] console.log(`[Test 5] Trying to create pipeline: ${JSON.stringify(pipelineConfig)}`) const pipelineResponse = await request(CORE_URL) .post('/pipelines') .send(pipelineConfig) + expect(pipelineResponse.status).toEqual(201) const pipelineId = pipelineResponse.body.id console.log(`[Test 5] Successfully created pipeline ${pipelineId} for datasource ${datasourceId}`) + // Add notification to notification service + const notification1 = generateWebhookNotification(pipelineId, 'data.one === 1', MOCK_SERVER_DOCKER + '/notifications/test5_1') + const notification2 = generateWebhookNotification(pipelineId, 'data.one === 1', MOCK_SERVER_DOCKER + '/notifications/test5_2') + const notification3 = generateWebhookNotification(pipelineId, 'data.one < 1', MOCK_SERVER_DOCKER + '/notifications/test5_3') + + console.log(`[Test 5] Trying to create notifications: ${JSON.stringify(notification1)}, ${JSON.stringify(notification2)}, ${JSON.stringify(notification3)}`) + let notificationResponse = await request(NOTIFICATION_URL) + .post('/config/webhook') + .send(notification1) + expect(notificationResponse.status).toEqual(201) + let notificationId = notificationResponse.body.id + console.log(`[Test 5] Successfully created notification ${notificationId} for pipeline ${pipelineId}`) + notificationResponse = await request(NOTIFICATION_URL) + .post('/config/webhook') + .send(notification2) + expect(notificationResponse.status).toEqual(201) + notificationId = notificationResponse.body.id + console.log(`[Test 5] Successfully created notification ${notificationId} for pipeline ${pipelineId}`) + notificationResponse = await request(NOTIFICATION_URL) + .post('/config/webhook') + .send(notification3) + expect(notificationResponse.status).toEqual(201) + notificationId = notificationResponse.body.id + console.log(`[Test 5] Successfully created notification ${notificationId} for pipeline ${pipelineId}`) + // Wait for webhook notification const webhookResponse1 = await checkWebhook('test5_1', 2000) expect(webhookResponse1.body.location).toEqual(STORAGE_DOCKER + '/' + pipelineId) @@ -406,7 +485,7 @@ describe('System-Test', () => { .send() expect(deletionResponse.status).toEqual(204) sleep(2000) // takes up to 2sec to reach scheduler - }, 30000) + }, 60000) test('Test 6: Delete periodic pipeline', async () => { // Prepare dataource mock @@ -421,21 +500,32 @@ describe('System-Test', () => { const adapterResponse = await request(ADAPTER_URL) .post('/datasources') .send(datasourceConfig) + expect(adapterResponse.status).toEqual(201) const datasourceId = adapterResponse.body.id console.log(`[Test 6] Successfully created datasource ${datasourceId}`) // Add pipeline to core service const pipelineConfig = generatePipelineConfig(datasourceId) - const notification = generateNotification('data.one === 1', MOCK_SERVER_DOCKER + '/notifications/test6') - pipelineConfig.notifications = [notification] console.log(`[Test 6] Trying to create pipeline: ${JSON.stringify(pipelineConfig)}`) const pipelineResponse = await request(CORE_URL) .post('/pipelines') .send(pipelineConfig) + expect(pipelineResponse.status).toEqual(201) const pipelineId = pipelineResponse.body.id console.log(`[Test 6] Successfully created pipeline ${pipelineId} for datasource ${datasourceId}`) + // Add notification to notification service + const notificationConfig = generateWebhookNotification(pipelineId, 'data.one === 1', MOCK_SERVER_DOCKER + '/notifications/test6') + + console.log(`[Test 6] Trying to create notification: ${JSON.stringify(notificationConfig)}`) + const notificationResponse = await request(NOTIFICATION_URL) + .post('/config/webhook') + .send(notificationConfig) + expect(notificationResponse.status).toEqual(201) + const notificationId = notificationResponse.body.id + console.log(`[Test 6] Successfully created notification ${notificationId} for pipeline ${pipelineId}`) + // Wait for webhook notification const webhookResponse1 = await checkWebhook('test6', 2000) expect(webhookResponse1.body.location).toEqual(STORAGE_DOCKER + '/' + pipelineId) @@ -459,14 +549,14 @@ describe('System-Test', () => { .send() expect(deletionResponse.status).toEqual(204) sleep(2000) // takes up to 2sec to reach scheduler - }, 30000) + }, 60000) }) -function generateNotification (condition, url) { +function generateWebhookNotification (pipelineId, condition, url) { return { - condition, - url, - type: 'WEBHOOK' + condition: condition, + url: url, + pipelineId: pipelineId } } @@ -506,8 +596,7 @@ function generatePipelineConfig (datasourceId) { license: 'AGPL v30', displayName: 'test1', description: 'system test 1' - }, - notifications: [] + } } } diff --git a/ui/.env.template b/ui/.env.template index 4b0d98753..ef1bc34d5 100644 --- a/ui/.env.template +++ b/ui/.env.template @@ -4,4 +4,5 @@ VUE_APP_AUTH_SERVICE_URL='http://localhost:9000/auth' VUE_APP_ADAPTER_SERVICE_URL='http://localhost:9000/api/adapter' VUE_APP_CORE_SERVICE_URL='http://localhost:9000/api/core' VUE_APP_STORAGE_SERVICE_URL='http://localhost:9000/api/storage' +VUE_APP_NOTIFICATION_SERVICE_URL='http://localhost:9000/api/notification' VUE_APP_TRANSFORMATION_SERVICE_URL='http://localhost:9000/api/transformation' diff --git a/ui/.gitignore b/ui/.gitignore index 226528a61..31d80bb44 100644 --- a/ui/.gitignore +++ b/ui/.gitignore @@ -91,4 +91,4 @@ dist/ # Idea files .idea/ -build/ +build/ \ No newline at end of file diff --git a/ui/Dockerfile b/ui/Dockerfile index 28ad310df..09ca53197 100644 --- a/ui/Dockerfile +++ b/ui/Dockerfile @@ -9,6 +9,8 @@ ARG CORE_SERVICE_URL ARG STORAGE_SERVICE_URL ARG ADAPTER_SERVICE_URL ARG TRANSFORMATION_SERVICE_URL +ARG NOTIFICATION_SERVICE_URL + WORKDIR /app @@ -30,6 +32,7 @@ RUN echo "VUE_APP_BASE_URL=$UI_BASE_URL" > .env \ && echo "VUE_APP_CORE_SERVICE_URL=$CORE_SERVICE_URL" >> .env \ && echo "VUE_APP_STORAGE_SERVICE_URL=$STORAGE_SERVICE_URL" >> .env \ && echo "VUE_APP_TRANSFORMATION_SERVICE_URL=$TRANSFORMATION_SERVICE_URL" >> .env \ + && echo "VUE_APP_NOTIFICATION_SERVICE_URL=$NOTIFICATION_SERVICE_URL" >> .env \ && cat .env # build vue.js production bundle to ./dist diff --git a/ui/package-lock.json b/ui/package-lock.json index 832866ffe..2fac08448 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -1534,7 +1534,8 @@ "@types/node": { "version": "12.12.47", "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.47.tgz", - "integrity": "sha512-yzBInQFhdY8kaZmqoL2+3U5dSTMrKaYcb561VU+lDzAYvqt+2lojvBEy+hmpSNuXnPTx7m9+04CzWYOUqWME2A==" + "integrity": "sha512-yzBInQFhdY8kaZmqoL2+3U5dSTMrKaYcb561VU+lDzAYvqt+2lojvBEy+hmpSNuXnPTx7m9+04CzWYOUqWME2A==", + "dev": true }, "@types/normalize-package-data": { "version": "2.4.0", @@ -3279,6 +3280,16 @@ "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", "dev": true }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -6689,6 +6700,13 @@ "schema-utils": "^2.5.0" } }, + "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, + "optional": true + }, "filesize": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", @@ -8542,7 +8560,11 @@ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", "dev": true, - "optional": true + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } }, "normalize-path": { "version": "2.1.1", @@ -9790,6 +9812,13 @@ "thenify-all": "^1.0.0" } }, + "nan": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", + "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", + "dev": true, + "optional": true + }, "nano-assign": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/nano-assign/-/nano-assign-1.0.1.tgz", @@ -14132,7 +14161,11 @@ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", "dev": true, - "optional": true + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } }, "glob-parent": { "version": "3.1.0", @@ -14442,7 +14475,11 @@ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", "dev": true, - "optional": true + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } }, "glob-parent": { "version": "3.1.0", diff --git a/ui/package.json b/ui/package.json index 5de427a71..59ca6ec7a 100644 --- a/ui/package.json +++ b/ui/package.json @@ -8,7 +8,6 @@ "test:unit": "vue-cli-service test:unit" }, "dependencies": { - "@types/node": "^12.12.47", "axios": "^0.19.2", "clipboard-copy": "^3.1.0", "keycloak-js": "8.0.1", @@ -24,6 +23,7 @@ "devDependencies": { "@mdi/font": "^4.9.95", "@types/jest": "^24.9.1", + "@types/node": "^12.12.47", "@typescript-eslint/eslint-plugin": "^2.34.0", "@typescript-eslint/parser": "^2.34.0", "@vue/cli-plugin-babel": "^4.4.1", diff --git a/ui/src/main.ts b/ui/src/main.ts index 9af40dec2..46ea59783 100644 --- a/ui/src/main.ts +++ b/ui/src/main.ts @@ -10,6 +10,7 @@ import StorageModule from '@/storage/module' import AuthModule from '@/components/auth/module' import DatasourceModule from '@/datasource/datasource.module' import PipelineModule from '@/pipeline/pipeline.module' +import NotificationModule from './notification/notification.module'; Vue.use(Vuetify) const vuetify = new Vuetify({ @@ -28,7 +29,8 @@ export const store = new Vuex.Store({ transformation: TransformationModule, storage: StorageModule, datasource: DatasourceModule, - pipeline: PipelineModule + pipeline: PipelineModule, + notification: NotificationModule } }) diff --git a/ui/src/pipeline/notifications/FirebaseEdit.vue b/ui/src/notification/FirebaseEdit.vue similarity index 93% rename from ui/src/pipeline/notifications/FirebaseEdit.vue rename to ui/src/notification/FirebaseEdit.vue index 3fae90b8b..db07213ed 100644 --- a/ui/src/pipeline/notifications/FirebaseEdit.vue +++ b/ui/src/notification/FirebaseEdit.vue @@ -1,7 +1,6 @@