diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index a24ff53305..e26f341c1f 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -49,7 +49,7 @@ jobs: if: startsWith(github.ref, 'refs/heads/release') || startsWith(github.ref, 'refs/heads/main') || startsWith(github.ref, 'refs/heads/develop') run: | echo ${{ secrets.PAT }} | docker login ghcr.io -u airydevci --password-stdin - ./scripts/push-images.sh ${{ github.ref }} + ./scripts/push-images.sh - name: Install aws cli uses: chrislennon/action-aws-cli@v1.1 env: @@ -67,4 +67,4 @@ jobs: aws s3 cp bazel-bin/infrastructure/cli/airy_linux_bin s3://airy-core-binaries/develop/linux/amd64/airy env: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} \ No newline at end of file + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} diff --git a/.gitignore b/.gitignore index 1c9fbbb797..d74d2dd03a 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,6 @@ package-lock.json # Misc .DS_Store + +# Testing +cypress diff --git a/.prettierignore b/.prettierignore index 275dce31e8..87c07a1b6d 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,3 +1,5 @@ -docs/docs/cli/reference.md +**/*/cli/reference.md +**/*/changelog.md build/ bazel-* +**/*/.docusaurus diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000000..3fe6909f5e --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,26 @@ +{ + "bracketSpacing": false, + "singleQuote": true, + "jsxBracketSameLine": true, + "semi": true, + "trailingComma": "es5", + "printWidth": 120, + "arrowParens": "avoid", + "endOfLine": "auto", + "overrides": [ + { + "files": "*.{ts,tsx}", + "options": { + "parser": "typescript" + } + }, + { + "files": "*.md", + "options": { + "singleQuote": false, + "quoteProps": "preserve", + "trailingComma": "none" + } + } + ] +} diff --git a/BUILD b/BUILD index c4b6f3cdba..ad2a647e9d 100644 --- a/BUILD +++ b/BUILD @@ -15,6 +15,7 @@ alias( fix_prettier( name = "fix_prettier", + config = "//:.prettierrc.json", ignore = "//:.prettierignore", ) @@ -100,6 +101,7 @@ java_library( exports = [ "@maven//:javax_servlet_javax_servlet_api", "@maven//:javax_validation_validation_api", + "@maven//:org_hibernate_validator_hibernate_validator", "@maven//:org_springframework_boot_spring_boot", "@maven//:org_springframework_boot_spring_boot_autoconfigure", "@maven//:org_springframework_boot_spring_boot_loader", @@ -174,6 +176,7 @@ java_library( exports_files( [ "package.json", + ".eslintrc", ".prettierrc.json", ".prettierignore", "yarn.lock", diff --git a/VERSION b/VERSION index ac454c6a1f..54d1a4f2a4 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.12.0 +0.13.0 diff --git a/WORKSPACE b/WORKSPACE index 1017cc10fc..bae3fb82ed 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -9,9 +9,9 @@ load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository") # Airy Bazel tools git_repository( name = "com_github_airyhq_bazel_tools", - commit = "9cf55cc0a42d68f0198883b04493ce7c7b3113ed", + commit = "b34a57be44e3cdf739e074dde1c3db5b5347cc35", remote = "https://github.com/airyhq/bazel-tools.git", - shallow_since = "1614958086 +0100", + shallow_since = "1615392891 +0100", ) load("@com_github_airyhq_bazel_tools//:repositories.bzl", "airy_bazel_tools_dependencies", "airy_jvm_deps") @@ -119,10 +119,10 @@ pinned_maven_install() # This needs to come before any rules_docker usage as it brings its own version of Gazelle http_archive( name = "bazel_gazelle", - sha256 = "b85f48fa105c4403326e9525ad2b2cc437babaa6e15a3fc0b1dbab0ab064bc7c", + sha256 = "62ca106be173579c0a167deb23358fdfe71ffa1e4cfdddf5582af26520f1c66f", urls = [ - "https://mirror.bazel.build/github.com/bazelbuild/bazel-gazelle/releases/download/v0.22.2/bazel-gazelle-v0.22.2.tar.gz", - "https://github.com/bazelbuild/bazel-gazelle/releases/download/v0.22.2/bazel-gazelle-v0.22.2.tar.gz", + "https://mirror.bazel.build/github.com/bazelbuild/bazel-gazelle/releases/download/v0.23.0/bazel-gazelle-v0.23.0.tar.gz", + "https://github.com/bazelbuild/bazel-gazelle/releases/download/v0.23.0/bazel-gazelle-v0.23.0.tar.gz", ], ) @@ -134,7 +134,10 @@ load("@io_bazel_rules_go//extras:embed_data_deps.bzl", "go_embed_data_dependenci go_embed_data_dependencies() -go_register_toolchains(nogo = "@//:airy_nogo") # my_nogo is in the top-level BUILD file of this workspace +go_register_toolchains( + nogo = "@//:airy_nogo", + version = "1.16", +) # my_nogo is in the top-level BUILD file of this workspace load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies") @@ -227,9 +230,9 @@ yarn_install( git_repository( name = "com_github_atlassian_bazel_tools", - commit = "dc5e715035b6b17f24f1d40a7eac08f8f2ac8a11", - remote = "https://github.com/atlassian/bazel-tools.git", - shallow_since = "1597268988 +1000", + commit = "e45e55f213b6804115eed1b6eb4ffc3bcf7a0cc4", + remote = "https://github.com/ash2k/bazel-tools.git", + shallow_since = "1614900742 +1100", ) load("@com_github_atlassian_bazel_tools//multirun:deps.bzl", "multirun_dependencies") diff --git a/backend/api/admin/src/main/java/co/airy/core/api/admin/ChannelsController.java b/backend/api/admin/src/main/java/co/airy/core/api/admin/ChannelsController.java index a25f9212d2..6bc451cce9 100644 --- a/backend/api/admin/src/main/java/co/airy/core/api/admin/ChannelsController.java +++ b/backend/api/admin/src/main/java/co/airy/core/api/admin/ChannelsController.java @@ -84,7 +84,7 @@ ResponseEntity updateChannel(@RequestBody @Valid UpdateChannelRequestPayload @PostMapping("/channels.chatplugin.connect") ResponseEntity connect(@RequestBody @Valid ConnectChannelRequestPayload requestPayload) { final String sourceChannelId = requestPayload.getName(); - final String sourceIdentifier = "chat_plugin"; + final String sourceIdentifier = "chatplugin"; final String channelId = UUIDv5.fromNamespaceAndName(sourceIdentifier, sourceChannelId).toString(); diff --git a/backend/api/admin/src/main/java/co/airy/core/api/admin/TemplatesController.java b/backend/api/admin/src/main/java/co/airy/core/api/admin/TemplatesController.java index dbb2e3eb86..9a8dc1d42b 100644 --- a/backend/api/admin/src/main/java/co/airy/core/api/admin/TemplatesController.java +++ b/backend/api/admin/src/main/java/co/airy/core/api/admin/TemplatesController.java @@ -38,8 +38,8 @@ ResponseEntity createTemplate(@RequestBody @Valid CreateTemplateRequestPayloa final Template template = Template.newBuilder() .setId(UUID.randomUUID().toString()) .setName(payload.getName()) + .setSource(payload.getSource()) .setContent(objectMapper.writeValueAsString(payload.getContent())) - .setVariables(objectMapper.writeValueAsString(payload.getVariables())) .build(); try { @@ -74,12 +74,8 @@ ResponseEntity deleteTemplate(@RequestBody @Valid DeleteTemplateRequestPayloa @PostMapping("/templates.list") ResponseEntity listTemplates(@RequestBody @Valid ListTemplatesRequestPayload payload) { final List response = stores.getTemplates().stream() - .filter(t -> { - if (payload.getName() == null || payload.getName().isEmpty()) { - return true; - } - return t.getName().contains(payload.getName()); - }) + .filter(t -> t.getSource().equals(payload.getSource())) + .filter(t -> (payload.getName() == null || payload.getName().isEmpty()) || t.getName().contains(payload.getName())) .map(TemplatePayload::fromTemplate) .collect(toList()); @@ -102,8 +98,8 @@ ResponseEntity updateTemplate(@RequestBody @Valid UpdateTemplateRequestPayloa template.setContent(objectMapper.writeValueAsString(payload.getContent())); } - if (payload.getVariables() != null) { - template.setVariables(objectMapper.writeValueAsString(payload.getVariables())); + if (payload.getSource() != null) { + template.setSource(payload.getSource()); } try { diff --git a/backend/api/admin/src/main/java/co/airy/core/api/admin/payload/CreateTemplateRequestPayload.java b/backend/api/admin/src/main/java/co/airy/core/api/admin/payload/CreateTemplateRequestPayload.java index 2c462fb27f..b2c3b00873 100644 --- a/backend/api/admin/src/main/java/co/airy/core/api/admin/payload/CreateTemplateRequestPayload.java +++ b/backend/api/admin/src/main/java/co/airy/core/api/admin/payload/CreateTemplateRequestPayload.java @@ -15,8 +15,7 @@ public class CreateTemplateRequestPayload { @NotNull private String name; @NotNull - private JsonNode content; - @Valid + private String source; @NotNull - private JsonNode variables; + private JsonNode content; } diff --git a/backend/api/admin/src/main/java/co/airy/core/api/admin/payload/ListTemplatesRequestPayload.java b/backend/api/admin/src/main/java/co/airy/core/api/admin/payload/ListTemplatesRequestPayload.java index d8b47c01da..86f4f82836 100644 --- a/backend/api/admin/src/main/java/co/airy/core/api/admin/payload/ListTemplatesRequestPayload.java +++ b/backend/api/admin/src/main/java/co/airy/core/api/admin/payload/ListTemplatesRequestPayload.java @@ -4,9 +4,13 @@ import lombok.Data; import lombok.NoArgsConstructor; +import javax.validation.constraints.NotNull; + @Data @NoArgsConstructor @AllArgsConstructor public class ListTemplatesRequestPayload { private String name; + @NotNull + private String source; } diff --git a/backend/api/admin/src/main/java/co/airy/core/api/admin/payload/UpdateTemplateRequestPayload.java b/backend/api/admin/src/main/java/co/airy/core/api/admin/payload/UpdateTemplateRequestPayload.java index a5e52e4dbc..79656ff2ed 100644 --- a/backend/api/admin/src/main/java/co/airy/core/api/admin/payload/UpdateTemplateRequestPayload.java +++ b/backend/api/admin/src/main/java/co/airy/core/api/admin/payload/UpdateTemplateRequestPayload.java @@ -15,7 +15,7 @@ public class UpdateTemplateRequestPayload { @NotNull private UUID id; + private String source; private String name; private JsonNode content; - private JsonNode variables; } diff --git a/backend/api/admin/src/test/java/co/airy/core/api/admin/TemplatesControllerTest.java b/backend/api/admin/src/test/java/co/airy/core/api/admin/TemplatesControllerTest.java index 30763d2eca..a16fbae573 100644 --- a/backend/api/admin/src/test/java/co/airy/core/api/admin/TemplatesControllerTest.java +++ b/backend/api/admin/src/test/java/co/airy/core/api/admin/TemplatesControllerTest.java @@ -23,8 +23,7 @@ import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit.jupiter.SpringExtension; -import java.util.concurrent.TimeUnit; - +import static co.airy.test.Timing.retryOnException; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.not; @@ -78,51 +77,91 @@ void beforeEach() throws Exception { @Test void canManageTemplates() throws Exception { final String name = "awesome-template"; + final String source = "facebook"; final String content = "{\"blueprint\":\"text\",\"payload\":\"[[salutation]]!\"}"; - final String payload = "{\"name\":\"" + name + "\",\"content\":" + content + ",\"variables\": { \"en\": {\"salutation\": \"Hello\"}}}"; + final String payload = "{\"name\":\"" + name + "\",\"source\": \"" + source + "\",\"content\":" + content + "}"; - final String createTagResponse = webTestHelper.post("/templates.create", payload, "user-id") + final String createTemplateResponse = webTestHelper.post("/templates.create", payload, "user-id") .andExpect(status().isCreated()) .andReturn() .getResponse() .getContentAsString(); - final JsonNode jsonNode = objectMapper.readTree(createTagResponse); + final JsonNode jsonNode = objectMapper.readTree(createTemplateResponse); final String templateId = jsonNode.get("id").textValue(); assertThat(templateId, is(not(nullValue()))); - //TODO wait for template to be there - TimeUnit.SECONDS.sleep(5); + retryOnException(() -> webTestHelper.post("/templates.info", "{\"id\":\"" + templateId + "\"}", "user-id") + .andExpect(status().isOk()) + .andExpect(jsonPath("$.id").value(is(templateId))) + .andExpect(jsonPath("$.content.blueprint").value(is("text"))) + .andExpect(jsonPath("$.source").value(is(source))) + .andExpect(jsonPath("$.name").value(is(name))), "could not find template"); - webTestHelper.post("/templates.info", "{\"id\":\"" + templateId + "\"}", "user-id") + webTestHelper.post("/templates.update", "{\"id\":\"" + templateId + "\", \"name\": \"new-template-name\", \"source\": \"google\", \"content\": " + content + "}", "user-id") .andExpect(status().isOk()) .andExpect(jsonPath("$.id").value(is(templateId))) - .andExpect(jsonPath("$.content").value(is(content))) - .andExpect(jsonPath("$.variables.en.salutation").value(is("Hello"))) - .andExpect(jsonPath("$.name").value(is(name))); + .andExpect(jsonPath("$.content.blueprint").value(is("text"))) + .andExpect(jsonPath("$.source").value(is("google"))) + .andExpect(jsonPath("$.name").value(is("new-template-name"))); + + retryOnException(() -> webTestHelper.post("/templates.info", "{\"id\":\"" + templateId + "\"}", "user-id") + .andExpect(status().isOk()) + .andExpect(jsonPath("$.name").value(is("new-template-name"))), "could not update template"); + + webTestHelper.post("/templates.delete", "{\"id\": \"" + templateId + "\"}", "user-id").andExpect(status().isOk()); + } + + @Test + void canListTemplates() throws Exception { + final String googleSource = "google"; + final String googleContent = "{\"blueprint\":\"text\",\"payload\":\"[[salutation]]!\"}"; - webTestHelper.post("/templates.list", "{\"name\":\"" + name.substring(0, 3) + "\"}", "user-id") + for (int i = 0; i < 10; i++) { + final String name = "awesome-template-" + i; + final String payload = "{\"name\":\"" + name + "\",\"source\": \"" + googleSource + "\",\"content\":" + googleContent + "}"; + + webTestHelper.post("/templates.create", payload, "user-id").andExpect(status().isCreated()); + } + + final String twilioSource = "twilio.sms"; + final String twilioContent = "{\"blueprint\":\"text\",\"payload\":\"[[salutation]]!\"}"; + for (int i = 0; i < 5; i++) { + final String name = "awesome-template-" + i; + final String payload = "{\"name\":\"" + name + "\",\"source\": \"" + twilioSource + "\",\"content\":" + twilioContent + "}"; + + webTestHelper.post("/templates.create", payload, "user-id").andExpect(status().isCreated()); + } + + retryOnException(() -> webTestHelper.post("/templates.list", + "{\"source\": \"google\"}", "user-id") .andExpect(status().isOk()) - .andExpect(jsonPath("$.data.length()", is(1))) - .andExpect(jsonPath("$.data[0].id").value(is(templateId))) - .andExpect(jsonPath("$.data[0].name").value(is(name))); + .andExpect(jsonPath("$.data.length()", is(10))), "could not list google templates"); - webTestHelper.post("/templates.update", "{\"id\":\"" + templateId + "\", \"name\": \"new-template-name\", \"content\": " + content + "}", "user-id") + retryOnException(() -> webTestHelper.post("/templates.list", + "{\"source\": \"google\", \"name\": \"awesome-template-\"}", "user-id") .andExpect(status().isOk()) - .andExpect(jsonPath("$.id").value(is(templateId))) - .andExpect(jsonPath("$.content").value(is(content))) - .andExpect(jsonPath("$.variables.en.salutation").value(is("Hello"))) - .andExpect(jsonPath("$.name").value(is("new-template-name"))); + .andExpect(jsonPath("$.data.length()", is(10))), "could not list google templates by name"); - webTestHelper.post("/templates.info", "{\"id\":\"" + templateId + "\"}", "user-id") + retryOnException(() -> webTestHelper.post("/templates.list", + "{\"source\": \"google\", \"name\": \"awesome-template-1\"}", "user-id") .andExpect(status().isOk()) - .andExpect(jsonPath("$.name").value(is("new-template-name"))); + .andExpect(jsonPath("$.data.length()", is(1))), "could not list google templates by name"); - webTestHelper.post("/templates.list", "{}", "user-id") + retryOnException(() -> webTestHelper.post("/templates.list", + "{\"source\": \"twilio.sms\"}", "user-id") .andExpect(status().isOk()) - .andExpect(jsonPath("$.data.length()", is(1))); + .andExpect(jsonPath("$.data.length()", is(5))), "could not list twilio templates"); - webTestHelper.post("/templates.delete", "{\"id\": \"" + templateId + "\"}", "user-id").andExpect(status().isOk()); + retryOnException(() -> webTestHelper.post("/templates.list", + "{\"source\": \"twilio.sms\", \"name\": \"awesome-template-\"}", "user-id") + .andExpect(status().isOk()) + .andExpect(jsonPath("$.data.length()", is(5))), "could not list twilio templates by name"); + + retryOnException(() -> webTestHelper.post("/templates.list", + "{\"source\": \"twilio.sms\", \"name\": \"awesome-template-1\"}", "user-id") + .andExpect(status().isOk()) + .andExpect(jsonPath("$.data.length()", is(1))), "could not list twilio templates by name"); } } diff --git a/backend/api/auth/src/main/java/co/airy/core/api/auth/controllers/payload/SignupRequestPayload.java b/backend/api/auth/src/main/java/co/airy/core/api/auth/controllers/payload/SignupRequestPayload.java index 8ceeafff2b..69560f5305 100644 --- a/backend/api/auth/src/main/java/co/airy/core/api/auth/controllers/payload/SignupRequestPayload.java +++ b/backend/api/auth/src/main/java/co/airy/core/api/auth/controllers/payload/SignupRequestPayload.java @@ -1,16 +1,12 @@ package co.airy.core.api.auth.controllers.payload; -import lombok.AllArgsConstructor; -import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import javax.validation.constraints.NotBlank; @Data -@Builder @NoArgsConstructor -@AllArgsConstructor public class SignupRequestPayload { @NotBlank private String email; diff --git a/backend/api/auth/src/test/java/co/airy/core/api/auth/UsersControllerTest.java b/backend/api/auth/src/test/java/co/airy/core/api/auth/UsersControllerTest.java index 8568918987..9ac15346ce 100644 --- a/backend/api/auth/src/test/java/co/airy/core/api/auth/UsersControllerTest.java +++ b/backend/api/auth/src/test/java/co/airy/core/api/auth/UsersControllerTest.java @@ -105,7 +105,18 @@ void canSignupAndLogin() throws Exception { } @Test - void canRestPassword() throws Exception { + void canValidateSignup() throws Exception { + final String firstName = "grace"; + final String email = "grace@example.com"; + final String password = "trustno1"; + + final String signUpRequest = "{\"email\":\"" + email + "\",\"first_name\":\"" + firstName + "\",\"password\":\"" + password + "\"}"; + + webTestHelper.post("/users.signup", signUpRequest).andExpect(status().isBadRequest()); + } + + @Test + void canResetPassword() throws Exception { final String email = "ada@example.com"; final String signUpRequest = "{\"email\":\"" + email + "\",\"first_name\":\"something\"," + @@ -113,7 +124,7 @@ void canRestPassword() throws Exception { webTestHelper.post("/users.signup", signUpRequest).andExpect(status().isOk()); - final String passwordResetRequest = "{\"email\":\"" + email + "\"}"; + final String passwordResetRequest = "{\"email\":\"" + email + "\",\"password\":\"trustno1\"}"; doNothing().when(mail).send(Mockito.eq(email), anyString(), anyString()); @@ -186,7 +197,7 @@ void canChangePassword() throws Exception { final JsonNode jsonNode = objectMapper.readTree(signupResponse); final String userId = jsonNode.get("id").textValue(); - final String requestPasswordRequest = "{\"email\":\"" + email + "\"}"; + final String requestPasswordRequest = "{\"email\":\"" + email + "\", \"password\":\"trustno1\"}"; doNothing().when(mail).send(Mockito.eq(email), anyString(), anyString()); diff --git a/backend/avro/communication/template.avsc b/backend/avro/communication/template.avsc index 2bc05203b0..4a53744b6f 100644 --- a/backend/avro/communication/template.avsc +++ b/backend/avro/communication/template.avsc @@ -5,7 +5,7 @@ "fields": [ {"name": "id", "type": "string"}, {"name": "name", "type": "string"}, - {"name": "content", "type": "string"}, - {"name": "variables", "type": "string"} + {"name": "source", "type": "string"}, + {"name": "content", "type": "string"} ] } diff --git a/backend/model/template/src/main/java/co/airy/model/template/TemplatePayload.java b/backend/model/template/src/main/java/co/airy/model/template/TemplatePayload.java index bb1d2b90fe..03abfd6bbd 100644 --- a/backend/model/template/src/main/java/co/airy/model/template/TemplatePayload.java +++ b/backend/model/template/src/main/java/co/airy/model/template/TemplatePayload.java @@ -17,21 +17,23 @@ public class TemplatePayload { private String id; private String name; - private String content; - private JsonNode variables; + private String source; + private JsonNode content; + + private static final ObjectMapper mapper = new ObjectMapper(); + public static TemplatePayload fromTemplate(final Template template) { - final ObjectMapper mapper = new ObjectMapper(); - JsonNode variables; + JsonNode content; try { - variables = mapper.readTree(template.getVariables()); + content = mapper.readTree(template.getContent()); } catch (JsonProcessingException e) { - variables = JsonNodeFactory.instance.objectNode(); + content = JsonNodeFactory.instance.objectNode(); } return TemplatePayload.builder() .id(template.getId()) .name(template.getName()) - .content(template.getContent()) - .variables(variables) + .content(content) + .source(template.getSource()) .build(); } } diff --git a/backend/sources/chat-plugin/src/main/java/co/airy/core/chat_plugin/Stores.java b/backend/sources/chat-plugin/src/main/java/co/airy/core/chat_plugin/Stores.java index 9021d36adb..ac624799f8 100644 --- a/backend/sources/chat-plugin/src/main/java/co/airy/core/chat_plugin/Stores.java +++ b/backend/sources/chat-plugin/src/main/java/co/airy/core/chat_plugin/Stores.java @@ -55,7 +55,7 @@ private void startStream() { final StreamsBuilder builder = new StreamsBuilder(); final KStream messageStream = builder.stream(applicationCommunicationMessages) - .filter((messageId, message) -> "chat_plugin".equals(message.getSource())); + .filter((messageId, message) -> "chatplugin".equals(message.getSource())); // Messages store messageStream @@ -86,7 +86,7 @@ private void startStream() { .to(applicationCommunicationMessages); builder.table(new ApplicationCommunicationChannels().name()) - .filter((channelId, channel) -> "chat_plugin".equals(channel.getSource()) + .filter((channelId, channel) -> "chatplugin".equals(channel.getSource()) && ChannelConnectionState.CONNECTED.equals(channel.getConnectionState()), Materialized.as(channelStore)); diff --git a/backend/sources/chat-plugin/src/test/java/co/airy/core/chat_plugin/ChatControllerTest.java b/backend/sources/chat-plugin/src/test/java/co/airy/core/chat_plugin/ChatControllerTest.java index 80a861e6dd..be2b6f21d3 100644 --- a/backend/sources/chat-plugin/src/test/java/co/airy/core/chat_plugin/ChatControllerTest.java +++ b/backend/sources/chat-plugin/src/test/java/co/airy/core/chat_plugin/ChatControllerTest.java @@ -76,7 +76,7 @@ public class ChatControllerTest { private static final Channel channel = Channel.newBuilder() .setConnectionState(ChannelConnectionState.CONNECTED) .setId(UUID.randomUUID().toString()) - .setSource("chat_plugin") + .setSource("chatplugin") .setSourceChannelId("some custom identifier") .build(); diff --git a/backend/webhook/redis-worker/go.mod b/backend/webhook/redis-worker/go.mod index 773ff762e8..eb01405e93 100644 --- a/backend/webhook/redis-worker/go.mod +++ b/backend/webhook/redis-worker/go.mod @@ -1,6 +1,6 @@ -module github.com/airyhq/airy/backend/webhook/redis-worker +module redis-worker -go 1.15 +go 1.16 require ( github.com/alicebob/miniredis/v2 v2.13.3 diff --git a/bazel.tsconfig.json b/bazel.tsconfig.json index 265fbd38f3..ddcaf97ce7 100644 --- a/bazel.tsconfig.json +++ b/bazel.tsconfig.json @@ -54,6 +54,12 @@ ], "*": [ "./*" + ], + "handles": [ + "./frontend/ui/handles" + ], + "chat-plugin-handles": [ + "./frontend/chat-plugin/handles" ] } }, diff --git a/docs/BUILD.bazel b/docs/BUILD.bazel index d4e4f04548..fe60e65263 100644 --- a/docs/BUILD.bazel +++ b/docs/BUILD.bazel @@ -3,6 +3,7 @@ load("@com_github_airyhq_bazel_tools//lint:prettier.bzl", "prettier") prettier( name = "prettier", + config = "//:.prettierrc.json", ignore = "//:.prettierignore", ) diff --git a/docs/cli-doc/generate_cli_docs.go b/docs/cli-doc/generate_cli_docs.go index fb063d80e6..165f416166 100644 --- a/docs/cli-doc/generate_cli_docs.go +++ b/docs/cli-doc/generate_cli_docs.go @@ -76,7 +76,7 @@ func genMarkdownCustom(cmd *cobra.Command, w *bufio.Writer) error { name := cmd.CommandPath() header := strings.Title(strings.Replace(name, "airy", "", -1)) - w.WriteString("## " + header + "\n\n") + w.WriteString("## " + strings.Trim(header, " ") + "\n\n") w.WriteString(cmd.Short + "\n\n") if len(cmd.Long) > 0 { w.WriteString("#### Synopsis\n\n") diff --git a/docs/cli-doc/go.mod b/docs/cli-doc/go.mod index 1cc169dbd7..fd5aba501d 100644 --- a/docs/cli-doc/go.mod +++ b/docs/cli-doc/go.mod @@ -1,6 +1,6 @@ module main -go 1.15 +go 1.16 require ( github.com/spf13/cobra v1.1.1 diff --git a/docs/cli-doc/go.sum b/docs/cli-doc/go.sum deleted file mode 100644 index f01bf3255e..0000000000 --- a/docs/cli-doc/go.sum +++ /dev/null @@ -1,289 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v1.1.1 h1:KfztREH0tPxJJ+geloSLaAkaPkr4ki2Er5quFV1TDo4= -github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= diff --git a/docs/docs/api/endpoints/channels.md b/docs/docs/api/endpoints/channels.md index 134ec507e3..0c2bde7821 100644 --- a/docs/docs/api/endpoints/channels.md +++ b/docs/docs/api/endpoints/channels.md @@ -130,7 +130,7 @@ POST /channels.chatplugin.connect ```json5 { "id": "1F679227-76C2-4302-BB12-703B2ADB0F66", - "source": "chat_plugin", + "source": "chatplugin", "source_channel_id": "website-identifier-42", "metadata": { "name": "website-identifier-42", diff --git a/docs/docs/sources/chat-plugin.md b/docs/docs/api/endpoints/chatplugin.md similarity index 58% rename from docs/docs/sources/chat-plugin.md rename to docs/docs/api/endpoints/chatplugin.md index 565a212576..02b4d28995 100644 --- a/docs/docs/sources/chat-plugin.md +++ b/docs/docs/api/endpoints/chatplugin.md @@ -1,64 +1,10 @@ --- -title: Airy Live Chat Plugin -sidebar_label: Airy Live Chat Plugin +title: Chat Plugin +sidebar_label: Chat Plugin --- -import TLDR from "@site/src/components/TLDR"; - - - -Airy's Live Chat Plugin is an **open-source chat widget** that you can put on your website to chat with your visitors. - - - -The Airy Live Chat Plugin is a fully-featured -[source](/getting-started/glossary#source) that enables conversations with -anonymous website visitors through a web chat plugin. - -:::tip What you will learn - -- How to connect a Chat Plugin -- How to install the Chat Plugin web widget -- How to use the HTTP and WebSocket APIs that power the Chat Plugin - -::: - -## Installation - -To install the Chat Plugin UI on your website add the following script tag to -the `` section: - -```html - -``` - -You must replace `CHANNEL_ID` with the channel id obtained when -[connecting](#connecting-a-channel) the source and `SCRIPT_HOST` with the host -of your Chat Plugin server. When using the local vagrant environment -`SCRIPT_HOST` must be set to `chatplugin.airy`. - -:::note - -`chatplugin.airy` is not publicly accessible. The setup will only work for local web pages. - -::: - -To test the setup, replace the `CHANNEL_ID` in the URL -`http://chatplugin.airy/example?channel_id=CHANNEL_ID` and open it in your -browser. - -## HTTP API +Refer to our [Chat Plugin introduction](sources/chatplugin/overview.md) for +more information. The HTTP api adheres to standards laid out in the [core API](/api/introduction#authentication). @@ -119,8 +65,8 @@ previous conversation using the [resume endpoint](#get-a-resume-token). `POST /chatplugin.resumeToken` -You must set the `token` obtained on the [authorization endpoint](#authenticating-web-users) as an `Authorization` -header. +You must set the `token` obtained on the [authorization +endpoint](#authenticating-web-users) as an `Authorization` header. **Sample request** @@ -157,14 +103,14 @@ header. ```json5 { - id: "{UUID}", + "id": "{UUID}", "content": {"text": "Hello World"}, // source message payload - state: "{String}", + "state": "{String}", // delivery state of message, one of PENDING, FAILED, DELIVERED - sender_type: "{string/enum}", + "sender_type": "{string/enum}", // See glossary - sent_at: "{string}", + "sent_at": "{string}", //'yyyy-MM-dd'T'HH:mm:ss.SSSZ' date in UTC form, to be localized by clients "metadata": { "sentFrom": "iPhone" @@ -189,15 +135,15 @@ The WebSocket connection endpoint is at `/ws.chatplugin`. ```json5 { - message: { - id: "{UUID}", + "message": { + "id": "{UUID}", "content": {"text": "Hello World"}, // source message payload - state: "{String}", + "state": "{String}", // delivery state of message, one of PENDING, FAILED, DELIVERED - sender_type: "{string/enum}", + "sender_type": "{string/enum}", // See glossary - sent_at: "{string}", + "sent_at": "{string}", //'yyyy-MM-dd'T'HH:mm:ss.SSSZ' date in UTC form, to be localized by clients "metadata": { "sentFrom": "iPhone" diff --git a/docs/docs/api/endpoints/templates.md b/docs/docs/api/endpoints/templates.md index 01a72ffc90..154227662c 100644 --- a/docs/docs/api/endpoints/templates.md +++ b/docs/docs/api/endpoints/templates.md @@ -14,16 +14,11 @@ for more information. ```json5 { - name: "my template name", - content: { - message: { - text: "[[salutation]]!" - } - }, - // source specific message content - variables: { - en: { - salutation: "%s" + "name": "my template name", + "source": "chatplugin", + "content": { + "message": { + "text": "[[salutation]]!" } } } @@ -47,11 +42,12 @@ This endpoint allows you to query templates, filtering by name. **Sample request** -Find templates whose name contains "NASA": +Find templates whose name contains "Ada": ```json5 { - name: "NASA" // optional + "source": "chatplugin", + "name": "Ada" // optional } ``` @@ -59,19 +55,14 @@ Find templates whose name contains "NASA": ```json5 { - data: [ + "data": [ { - id: "TEMPLATE-UUID", - name: "Template for NASA", - content: { - message: { - text: "[[salutation]]!" - } - }, - // source specific message content - variables: { - en: { - salutation: "%s" + "id": "TEMPLATE-UUID", + "name": "Template for Ada Lovelance day", + "source": "chatplugin", + "content": { + "message": { + "text": "[[salutation]]!" } } } @@ -85,7 +76,7 @@ Find templates whose name contains "NASA": ```json5 { - id: "TEMPLATE-UUID" + "id": "TEMPLATE-UUID" } ``` @@ -93,17 +84,12 @@ Find templates whose name contains "NASA": ```json5 { - id: "TEMPLATE-UUID", - name: "{String}", - content: { - message: { - text: "[[salutation]]!" - } - }, - // source specific message content - variables: { - en: { - salutation: "%s" + "id": "TEMPLATE-UUID", + "name": "{String}", + "source": "chatplugin", + "content": { + "message": { + "text": "[[salutation]]!" } } } @@ -115,17 +101,12 @@ Find templates whose name contains "NASA": ```json5 { - id: "template id", - name: "my template name", - content: { - message: { - text: "[[salutation]]!" - } - }, - // source specific message content - variables: { - en: { - salutation: "%s" + "id": "template id", + "name": "my template name", + "source_type": "chatplugin", + "content": { + "message": { + "text": "[[salutation]]!" } } } @@ -141,7 +122,7 @@ This endpoint returns _200_ if successful. ```json5 { - id: "TEMPLATE-UUID" + "id": "TEMPLATE-UUID" } ``` diff --git a/docs/docs/apps/ui/inbox.md b/docs/docs/apps/ui/inbox.md index 00bcae0495..7e4b56d041 100644 --- a/docs/docs/apps/ui/inbox.md +++ b/docs/docs/apps/ui/inbox.md @@ -36,7 +36,7 @@ This enables you and your teams to interact with your website visitors in a rich icon={() => } title='Airy Live Chat Plugin' description='The Airy Live Chat Plugin enables conversations with website visitors through a web chat plugin' -link='sources/chat-plugin' +link='sources/chatplugin/overview' /> ## Search & Filter diff --git a/docs/docs/apps/ui/introduction.md b/docs/docs/apps/ui/introduction.md index 0a951e0246..f07bbf0742 100644 --- a/docs/docs/apps/ui/introduction.md +++ b/docs/docs/apps/ui/introduction.md @@ -14,7 +14,7 @@ import ComponentsSVG from "@site/static/icons/information-architecture.svg"; Not every message can be handled by code, this is why Airy comes with different UIs ready for you and your teams to use. -While the [Chat Plugin](sources/chat-plugin.md) is the open-source chat UI for your website and app visitors, Airy UI has different all the UI interfaces you need internally for a messaging platform. +While the [Chat Plugin](sources/chatplugin/overview.md) is the open-source chat UI for your website and app visitors, Airy UI has different all the UI interfaces you need internally for a messaging platform. Airy UI comes with an open-source, customizable [inbox](inbox), filled with the conversations of all your [sources](sources/introduction.md), Additional features like [Filters, Search](inbox) and [Tags](tags) help you. diff --git a/docs/docs/apps/ui/quickstart.md b/docs/docs/apps/ui/quickstart.md index d68420507e..5abeaa3a9e 100644 --- a/docs/docs/apps/ui/quickstart.md +++ b/docs/docs/apps/ui/quickstart.md @@ -48,7 +48,7 @@ airy api signup ## Step 2: Open the UI -Either go to [ui.airy/login](http://ui.airy/login) in your browser or execute +Either go to [airy.core/ui/login](http://airy.core/ui/login) in your browser or execute this [CLI command](cli/reference.md#api-login): ```bash diff --git a/docs/docs/changelog.md b/docs/docs/changelog.md new file mode 100644 index 0000000000..edf75ce577 --- /dev/null +++ b/docs/docs/changelog.md @@ -0,0 +1,867 @@ +--- +title: Changelog +sidebar_label: 📝 Changelog +--- + +## 0.13.0 + +#### Changes + +- Bump typesafe-actions from 4.4.2 to 5.1.0 [[#1210](https://github.com/airyhq/airy/pull/1210)] +- [[#783](https://github.com/airyhq/airy/issues/783)] Introduce changelog [[#1221](https://github.com/airyhq/airy/pull/1221)] +- Bump yargs-parser from 5.0.0 to 5.0.1 [[#1213](https://github.com/airyhq/airy/pull/1213)] +- Bump react-dom from 16.12.0 to 16.14.0 [[#1188](https://github.com/airyhq/airy/pull/1188)] +- [[#659](https://github.com/airyhq/airy/issues/659)] Enable to connect via facebook [[#1130](https://github.com/airyhq/airy/pull/1130)] +- [[#773](https://github.com/airyhq/airy/issues/773)] change searchbar to the left [[#1192](https://github.com/airyhq/airy/pull/1192)] + +#### 🚀 Features + +- [[#1247](https://github.com/airyhq/airy/issues/1247)] Optional variables for templates creation [[#1248](https://github.com/airyhq/airy/pull/1248)] +- [[#656](https://github.com/airyhq/airy/issues/656)] Enable users to connect via Twilio Sms and Whatsapp [[#1223](https://github.com/airyhq/airy/pull/1223)] +- [[#871](https://github.com/airyhq/airy/issues/871)] Httpclient methods need return value [[#1199](https://github.com/airyhq/airy/pull/1199)] +- [[#868](https://github.com/airyhq/airy/issues/868)] Templates manager [[#1123](https://github.com/airyhq/airy/pull/1123)] +- [[#1228](https://github.com/airyhq/airy/issues/1228)] Scope templates list by source type [[#1230](https://github.com/airyhq/airy/pull/1230)] +- [[#1204](https://github.com/airyhq/airy/issues/1204)] Add sourceType to templates API [[#1208](https://github.com/airyhq/airy/pull/1208)] +- [[#1047](https://github.com/airyhq/airy/issues/1047)] Chatplugin testing [[#1087](https://github.com/airyhq/airy/pull/1087)] +- [[#1022](https://github.com/airyhq/airy/issues/1022)] Change ingress hostnames and deploy traefik ingress controller [[#1122](https://github.com/airyhq/airy/pull/1122)] +- [[#1055](https://github.com/airyhq/airy/issues/1055)] Expired Websocket Connection [[#1181](https://github.com/airyhq/airy/pull/1181)] + +#### 🐛 Bug Fixes +- [[#1236](https://github.com/airyhq/airy/issues/1236)] Fixed issues with filter by channel [[#1253](https://github.com/airyhq/airy/pull/1253)] +- [[#1249](https://github.com/airyhq/airy/issues/1249)]fixed templates modal and fixed type template with api change [[#1251](https://github.com/airyhq/airy/pull/1251)] +- [[#1241](https://github.com/airyhq/airy/issues/1241)] Fix chatplugin ui path collision. Follow up fix. [[#1245](https://github.com/airyhq/airy/pull/1245)] +- [[#1241](https://github.com/airyhq/airy/issues/1241)] Fix chatplugin ui path collision [[#1243](https://github.com/airyhq/airy/pull/1243)] +- [[#1018](https://github.com/airyhq/airy/issues/1018)]Fix Golang dependencies, upgrade Gazelle [[#1231](https://github.com/airyhq/airy/pull/1231)] +- [[#1217](https://github.com/airyhq/airy/issues/1217)] Make validation work for auth app [[#1225](https://github.com/airyhq/airy/pull/1225)] +- [[#677](https://github.com/airyhq/airy/issues/677)] add missing ingress definition for suggest replies endpoint [[#1224](https://github.com/airyhq/airy/pull/1224)] +- [[#1214](https://github.com/airyhq/airy/issues/1214)] Duplicate messages in the redux store [[#1216](https://github.com/airyhq/airy/pull/1216)] +- [[#1205](https://github.com/airyhq/airy/issues/1205)] Fix update deps command and the gazelle repositories [[#1209](https://github.com/airyhq/airy/pull/1209)] +- Fix chat plugin build by upgrading bazel-tools #2 [[#1203](https://github.com/airyhq/airy/pull/1203)] +- Fix chatplugin build by upgrading bazel-tools [[#1202](https://github.com/airyhq/airy/pull/1202)] +- [[#1047](https://github.com/airyhq/airy/issues/1047)] Fix ui baseUrl [[#1200](https://github.com/airyhq/airy/pull/1200)] +- [[#1174](https://github.com/airyhq/airy/issues/1174)] Follow up of the follow up of the fix [[#1198](https://github.com/airyhq/airy/pull/1198)] +- [[#1174](https://github.com/airyhq/airy/issues/1174)] Follow up fix to bug introduced by PR #1177 [[#1196](https://github.com/airyhq/airy/pull/1196)] +- [[#1101](https://github.com/airyhq/airy/issues/1101)] Filtering by channel not functioning [[#1194](https://github.com/airyhq/airy/pull/1194)] + +#### 📚 Documentation +- More readable examples [[#1233](https://github.com/airyhq/airy/pull/1233)] +- Chatplugin overview section [[#1207](https://github.com/airyhq/airy/pull/1207)] +- [[#1105](https://github.com/airyhq/airy/issues/1105)] New structure for chatplugin docs [[#1180](https://github.com/airyhq/airy/pull/1180)] + +#### 🧰 Maintenance +- Bump @stomp/stompjs from 6.0.0 to 6.1.0 [[#1227](https://github.com/airyhq/airy/pull/1227)] +- [[#1197](https://github.com/airyhq/airy/issues/1197)] Rename chat\_plugin to chatplugin everywhere [[#1234](https://github.com/airyhq/airy/pull/1234)] +- Bump @bazel/typescript from 3.2.1 to 3.2.2 [[#1187](https://github.com/airyhq/airy/pull/1187)] +- Bump copy-webpack-plugin from 5.1.1 to 6.4.1 [[#1158](https://github.com/airyhq/airy/pull/1158)] +- [[#1183](https://github.com/airyhq/airy/issues/1183)] Bring back the prettier config [[#1184](https://github.com/airyhq/airy/pull/1184)] + +#### Airy CLI + +You can download the Airy CLI for your operating system from the following links: + +[MacOS](https://airy-core-binaries.s3.amazonaws.com/0.13.0/darwin/amd64/airy) +[Linux](https://airy-core-binaries.s3.amazonaws.com/0.13.0/linux/amd64/airy) +[Windows](https://airy-core-binaries.s3.amazonaws.com/0.13.0/windows/amd64/airy.exe) + +## 0.12.0 + +#### Changes + +- [[#1132](https://github.com/airyhq/airy/issues/1132)] Fix missing , in nginx [[#1133](https://github.com/airyhq/airy/pull/1133)] +- [[#1014](https://github.com/airyhq/airy/issues/1014)] Deploy the helm charts [[#1084](https://github.com/airyhq/airy/pull/1084)] +- [[#1124](https://github.com/airyhq/airy/issues/1124)] Template endpoints return 404 [[#1125](https://github.com/airyhq/airy/pull/1125)] + +#### 🚀 Features + +- [[#1113](https://github.com/airyhq/airy/issues/1113)] Chat Plugin: keep text in input bar if… [[#1143](https://github.com/airyhq/airy/pull/1143)] +- [[#1000](https://github.com/airyhq/airy/issues/1000)] ConversationList scrolls over TopBar [[#1129](https://github.com/airyhq/airy/pull/1129)] +- [[#983](https://github.com/airyhq/airy/issues/983)] The login call should not send the auth… [[#1127](https://github.com/airyhq/airy/pull/1127)] +- [[#1126](https://github.com/airyhq/airy/issues/1126)] /templates.info And /templates.update are returning 404 [[#1128](https://github.com/airyhq/airy/pull/1128)] +- [[#660](https://github.com/airyhq/airy/issues/660)] Enable users to connect via Airy Live Chat [[#1078](https://github.com/airyhq/airy/pull/1078)] +- [[#1117](https://github.com/airyhq/airy/issues/1117)] Template docs are not accessible [[#1118](https://github.com/airyhq/airy/pull/1118)] + +#### 🐛 Bug Fixes + +- [[#1174](https://github.com/airyhq/airy/issues/1174)] Build the right cli version on develop [[#1177](https://github.com/airyhq/airy/pull/1177)] +- [[#1165](https://github.com/airyhq/airy/issues/1165)] Fix template endpoint content field [[#1166](https://github.com/airyhq/airy/pull/1166)] +- [[#1161](https://github.com/airyhq/airy/issues/1161)] Fix metadata 404 [[#1162](https://github.com/airyhq/airy/pull/1162)] +- [[#1152](https://github.com/airyhq/airy/issues/1152)] Fix conditional config apply [[#1153](https://github.com/airyhq/airy/pull/1153)] +- [[#1142](https://github.com/airyhq/airy/issues/1142)] Backbutton \& search aligned [[#1149](https://github.com/airyhq/airy/pull/1149)] +- [[#1034](https://github.com/airyhq/airy/issues/1034)] Tag empty state has strange scrolling… [[#1141](https://github.com/airyhq/airy/pull/1141)] +- [[#1112](https://github.com/airyhq/airy/issues/1112)] fixed highlight in inbox [[#1119](https://github.com/airyhq/airy/pull/1119)] +- [[#1120](https://github.com/airyhq/airy/issues/1120)] Fix Shellcheck [[#1121](https://github.com/airyhq/airy/pull/1121)] + +#### 📚 Documentation + +- [[#1094](https://github.com/airyhq/airy/issues/1094)] Minor UI improvements to the docs [[#1131](https://github.com/airyhq/airy/pull/1131)] + +#### 🧰 Maintenance + +- Revert "Bump webpack-dev-middleware from 3.7.2 to 4.1.0" [[#1172](https://github.com/airyhq/airy/pull/1172)] +- Bump elliptic from 6.5.3 to 6.5.4 in /docs [[#1170](https://github.com/airyhq/airy/pull/1170)] +- Bump elliptic from 6.5.3 to 6.5.4 [[#1171](https://github.com/airyhq/airy/pull/1171)] +- Bump terser-webpack-plugin from 2.3.6 to 4.2.3 [[#1169](https://github.com/airyhq/airy/pull/1169)] +- Bump html-webpack-plugin from 4.2.0 to 4.5.2 [[#1168](https://github.com/airyhq/airy/pull/1168)] +- Bump webpack-dev-middleware from 3.7.2 to 4.1.0 [[#1154](https://github.com/airyhq/airy/pull/1154)] +- Bump react from 16.12.0 to 16.14.0 [[#1167](https://github.com/airyhq/airy/pull/1167)] +- Restructure cli for building providers [[#1159](https://github.com/airyhq/airy/pull/1159)] +- Bump react-router-dom from 5.1.2 to 5.2.0 [[#1155](https://github.com/airyhq/airy/pull/1155)] +- Bump prettier from 1.19.1 to 2.2.1 [[#1147](https://github.com/airyhq/airy/pull/1147)] +- Bump lodash-es from 4.17.15 to 4.17.21 [[#1156](https://github.com/airyhq/airy/pull/1156)] +- Bump @types/react-router-dom from 5.1.3 to 5.1.7 [[#1157](https://github.com/airyhq/airy/pull/1157)] +- Restructure cli to prepare for providers [[#1151](https://github.com/airyhq/airy/pull/1151)] +- Bump eslint-plugin-react from 7.21.5 to 7.22.0 [[#1148](https://github.com/airyhq/airy/pull/1148)] +- Bump eslint from 7.16.0 to 7.21.0 [[#1144](https://github.com/airyhq/airy/pull/1144)] +- Bump file-loader from 6.0.0 to 6.2.0 [[#1145](https://github.com/airyhq/airy/pull/1145)] +- Bump @bazel/typescript from 3.2.0 to 3.2.1 [[#1146](https://github.com/airyhq/airy/pull/1146)] +- Bump react-hot-loader from 4.12.20 to 4.13.0 [[#1138](https://github.com/airyhq/airy/pull/1138)] +- Bump @types/react-redux from 7.1.3 to 7.1.16 [[#1136](https://github.com/airyhq/airy/pull/1136)] +- Bump @types/lodash-es from 4.17.3 to 4.17.4 [[#1137](https://github.com/airyhq/airy/pull/1137)] +- Bump preact from 10.5.7 to 10.5.12 [[#1139](https://github.com/airyhq/airy/pull/1139)] +- Bump react-redux from 7.1.3 to 7.2.2 [[#1140](https://github.com/airyhq/airy/pull/1140)] +- Add dependabot config [[#1135](https://github.com/airyhq/airy/pull/1135)] + +#### Airy CLI + +You can download the Airy CLI for your operating system from the following links: + +[MacOS](https://airy-core-binaries.s3.amazonaws.com/0.12.0/darwin/amd64/airy) +[Linux](https://airy-core-binaries.s3.amazonaws.com/0.12.0/linux/amd64/airy) +[Windows](https://airy-core-binaries.s3.amazonaws.com/0.12.0/windows/amd64/airy.exe) + +## 0.11.0 + +#### 🚀 Features + +- Custom welcome message in Chat Plugin [[#1103](https://github.com/airyhq/airy/pull/1103)] +- [[#1015](https://github.com/airyhq/airy/issues/1015)] Refactor the scheduling of the components [[#1091](https://github.com/airyhq/airy/pull/1091)] +- [[#1016](https://github.com/airyhq/airy/issues/1016)] Create topics with k8s job [[#1074](https://github.com/airyhq/airy/pull/1074)] +- [[#1044](https://github.com/airyhq/airy/issues/1044)] Add cypress rule [[#1077](https://github.com/airyhq/airy/pull/1077)] +- [[#1080](https://github.com/airyhq/airy/issues/1080)] Change style of ChatPlugin + fix carousel [[#1082](https://github.com/airyhq/airy/pull/1082)] +- [[#1014](https://github.com/airyhq/airy/issues/1014)] Add helm image containing the charts [[#1079](https://github.com/airyhq/airy/pull/1079)] +- [[#814](https://github.com/airyhq/airy/issues/814)] Add cmd+enter and better disabled state to… [[#1076](https://github.com/airyhq/airy/pull/1076)] + + +#### 🐛 Bug Fixes + +- Fix/1104 split endpoints in http library in multiple files [[#1114](https://github.com/airyhq/airy/pull/1114)] +- [[#1099](https://github.com/airyhq/airy/issues/1099)] Add missing allowed origin env [[#1100](https://github.com/airyhq/airy/pull/1100)] +- [[#1093](https://github.com/airyhq/airy/issues/1093)] Fix image url for Facebook channel connection [[#1095](https://github.com/airyhq/airy/pull/1095)] +- [[#1088](https://github.com/airyhq/airy/issues/1088)] Fix missing Facebook channel disconnect [[#1089](https://github.com/airyhq/airy/pull/1089)] +- [[#1068](https://github.com/airyhq/airy/issues/1068)] improve channels UI [[#1071](https://github.com/airyhq/airy/pull/1071)] +- fix size chatplugin in example.html [[#1070](https://github.com/airyhq/airy/pull/1070)] +- [[#1028](https://github.com/airyhq/airy/issues/1028)] replaced manual mapping with npm lib [[#1098](https://github.com/airyhq/airy/pull/1098)] +- [[#1072](https://github.com/airyhq/airy/issues/1072)] fixed text message and fallback in google suggestions [[#1073](https://github.com/airyhq/airy/pull/1073)] + +#### 📚 Documentation + +- [1092] Merge deployment and installation sections [[#1096](https://github.com/airyhq/airy/pull/1096)] +- Readme Revamp [[#1059](https://github.com/airyhq/airy/pull/1059)] + +#### 🧰 Maintenance + +- Use Bazel eslint test rule [[#1086](https://github.com/airyhq/airy/pull/1086)] +- Upgrade bazel tools and use buildifier tests [[#1081](https://github.com/airyhq/airy/pull/1081)] + +#### Airy CLI + +You can download the Airy CLI for your operating system from the following links: + +[MacOS](https://airy-core-binaries.s3.amazonaws.com/0.11.0/darwin/amd64/airy) +[Linux](https://airy-core-binaries.s3.amazonaws.com/0.11.0/linux/amd64/airy) +[Windows](https://airy-core-binaries.s3.amazonaws.com/0.11.0/windows/amd64/airy.exe) + +## 0.10.0 + +#### Changes + +- [[#1007](https://github.com/airyhq/airy/issues/1007)] Bug: Cookies + 2 Chat Plugins [[#1027](https://github.com/airyhq/airy/pull/1027)] + +#### 🚀 Features + +- [[#665](https://github.com/airyhq/airy/issues/665)] Build UI aspect of channels page [[#986](https://github.com/airyhq/airy/pull/986)] +- [[#848](https://github.com/airyhq/airy/issues/848)] Handle Postback / Suggestion Messages /… [[#1066](https://github.com/airyhq/airy/pull/1066)] +- [[#862](https://github.com/airyhq/airy/issues/862)] Render suggestions google [[#1040](https://github.com/airyhq/airy/pull/1040)] +- [[#1038](https://github.com/airyhq/airy/issues/1038)] ChatPlugin does not render RichText [[#1060](https://github.com/airyhq/airy/pull/1060)] +- [[#1017](https://github.com/airyhq/airy/issues/1017)] Introduce the airy create command [[#1056](https://github.com/airyhq/airy/pull/1056)] +- [[#1002](https://github.com/airyhq/airy/issues/1002)] Chat Plugin Size [[#1039](https://github.com/airyhq/airy/pull/1039)] +- [[#905](https://github.com/airyhq/airy/issues/905)] Extract avatar and time from message render library [[#1011](https://github.com/airyhq/airy/pull/1011)] +- [[#957](https://github.com/airyhq/airy/issues/957)] Add ErrorBoundaries for the RenderLibrary [[#1024](https://github.com/airyhq/airy/pull/1024)] +- [[#918](https://github.com/airyhq/airy/issues/918)] Consume Airy Events from new websocket in the UI [[#988](https://github.com/airyhq/airy/pull/988)] +- [[#670](https://github.com/airyhq/airy/issues/670)] Render Rich Card Carousel (Google Style)… [[#1021](https://github.com/airyhq/airy/pull/1021)] +- [[#885](https://github.com/airyhq/airy/issues/885)] Use new airy event in webhook [[#998](https://github.com/airyhq/airy/pull/998)] +- [[#934](https://github.com/airyhq/airy/issues/934)] Parse (but don't map) API message response… [[#977](https://github.com/airyhq/airy/pull/977)] + +#### 🐛 Bug Fixes + +- [[#1042](https://github.com/airyhq/airy/issues/1042)] Fixes rendering and sending messaged to Facebook and sending for Google [[#1065](https://github.com/airyhq/airy/pull/1065)] +- [[#932](https://github.com/airyhq/airy/issues/932)] Add Twilio SMS and Whatsapp to render library [[#1061](https://github.com/airyhq/airy/pull/1061)] +- [[#1063](https://github.com/airyhq/airy/issues/1063)] Fix docs for status command [[#1064](https://github.com/airyhq/airy/pull/1064)] +- [[#842](https://github.com/airyhq/airy/issues/842)] Remove ugly border around filter icon [[#1057](https://github.com/airyhq/airy/pull/1057)] +- [[#885](https://github.com/airyhq/airy/issues/885)] Fix webhook payload [[#1033](https://github.com/airyhq/airy/pull/1033)] +- [[#1029](https://github.com/airyhq/airy/issues/1029)] Webhook consumer bootstrapping fixed [[#1030](https://github.com/airyhq/airy/pull/1030)] +- [[#1023](https://github.com/airyhq/airy/issues/1023)] Websocket uses tls when the page is loaded via https [[#1025](https://github.com/airyhq/airy/pull/1025)] + +#### 📚 Documentation + +- [[#1001](https://github.com/airyhq/airy/issues/1001)] improve google facebook sources [[#1012](https://github.com/airyhq/airy/pull/1012)] +- [[#999](https://github.com/airyhq/airy/issues/999)] ButtonBox v3 [[#1013](https://github.com/airyhq/airy/pull/1013)] +- [[#967](https://github.com/airyhq/airy/issues/967)] Add UI Quickstart [[#996](https://github.com/airyhq/airy/pull/996)] + +#### 🧰 Maintenance + +- [[#751](https://github.com/airyhq/airy/issues/751)] Introduce golang deps tool [[#1058](https://github.com/airyhq/airy/pull/1058)] +- Upgrade rules nodejs to 3.1 [[#1062](https://github.com/airyhq/airy/pull/1062)] +- [[#954](https://github.com/airyhq/airy/issues/954)] Extracting svgs from the apps and… [[#1037](https://github.com/airyhq/airy/pull/1037)] +- [[#886](https://github.com/airyhq/airy/issues/886)] Remove deprecated communication websocket [[#1026](https://github.com/airyhq/airy/pull/1026)] + +#### Airy CLI + +You can download the Airy CLI for your operating system from the following links: + +[MacOS](https://airy-core-binaries.s3.amazonaws.com/0.10.0/darwin/amd64/airy) +[Linux](https://airy-core-binaries.s3.amazonaws.com/0.10.0/linux/amd64/airy) +[Windows](https://airy-core-binaries.s3.amazonaws.com/0.10.0/windows/amd64/airy.exe) + +## 0.9.0 + +#### 🚀 Features + +- [[#807](https://github.com/airyhq/airy/issues/807)] Introduction to UI docs [[#973](https://github.com/airyhq/airy/pull/973)] +- [[#849](https://github.com/airyhq/airy/issues/849)] Introduce dynamic page titles [[#990](https://github.com/airyhq/airy/pull/990)] +- [[#882](https://github.com/airyhq/airy/issues/882)] New /metadata.upsert API endpoint [[#955](https://github.com/airyhq/airy/pull/955)] +- [[#909](https://github.com/airyhq/airy/issues/909)] Add metadata to conversations API [[#941](https://github.com/airyhq/airy/pull/941)] +- [[#859](https://github.com/airyhq/airy/issues/859)] Add google rich card carousel to render library [[#976](https://github.com/airyhq/airy/pull/976)] +- [[#806](https://github.com/airyhq/airy/issues/806)] Add minimum height and width to UI [[#980](https://github.com/airyhq/airy/pull/980)] +- [[#671](https://github.com/airyhq/airy/issues/671)] Allow any message to be sent to the chat plugin [[#961](https://github.com/airyhq/airy/pull/961)] +- [[#950](https://github.com/airyhq/airy/issues/950)] Add update homebrew formula step to release process [[#959](https://github.com/airyhq/airy/pull/959)] +- [[#309](https://github.com/airyhq/airy/issues/309)] Homebrew cli tap [[#943](https://github.com/airyhq/airy/pull/943)] +- [[#949](https://github.com/airyhq/airy/issues/949)] Improve UI of chatplugin [[#953](https://github.com/airyhq/airy/pull/953)] +- [[#860](https://github.com/airyhq/airy/issues/860)] Render Generic Template Carousel from… [[#951](https://github.com/airyhq/airy/pull/951)] +- [[#675](https://github.com/airyhq/airy/issues/675)] Add Templates Endpoints documentation [[#872](https://github.com/airyhq/airy/pull/872)] +- [[#675](https://github.com/airyhq/airy/issues/675)] Add Templates Endpoints [[#948](https://github.com/airyhq/airy/pull/948)] +- [[#671](https://github.com/airyhq/airy/issues/671)] Render Rich Card (Google Style) on Live… [[#962](https://github.com/airyhq/airy/pull/962)] + +#### 🐛 Bug Fixes + +- [[#992](https://github.com/airyhq/airy/issues/992)] Start frontend components in start.sh [[#993](https://github.com/airyhq/airy/pull/993)] +- [[#960](https://github.com/airyhq/airy/issues/960)] Scope svg styles so that we don't break the sidebar [[#984](https://github.com/airyhq/airy/pull/984)] +- Fix missing annotation in google webhook [[#964](https://github.com/airyhq/airy/pull/964)] +- [[#956](https://github.com/airyhq/airy/issues/956)] Fix side problem in chatplugin source [[#958](https://github.com/airyhq/airy/pull/958)] +- [[#914](https://github.com/airyhq/airy/issues/914)] Add ingress and docs for AKHQ [[#940](https://github.com/airyhq/airy/pull/940)] +- [[#733](https://github.com/airyhq/airy/issues/733)] Hotfix/733 path for docs [[#982](https://github.com/airyhq/airy/pull/982)] + +#### 📚 Documentation + +- [[#867](https://github.com/airyhq/airy/issues/867)] Put cobra cmd docs in one file [[#971](https://github.com/airyhq/airy/pull/971)] +- [[#938](https://github.com/airyhq/airy/issues/938)] Buttons, buttons everywhere [[#963](https://github.com/airyhq/airy/pull/963)] + +#### 🧰 Maintenance + +- [[#733](https://github.com/airyhq/airy/issues/733)] Fix Netlify docs previews [[#991](https://github.com/airyhq/airy/pull/991)] +- [[#975](https://github.com/airyhq/airy/issues/975)] Rename Airy Core Platform [[#985](https://github.com/airyhq/airy/pull/985)] + +#### Airy CLI + +You can download the Airy CLI for your operating system from the following links: + +[MacOS](https://airy-core-binaries.s3.amazonaws.com/0.9.0/darwin/amd64/airy) +[Linux](https://airy-core-binaries.s3.amazonaws.com/0.9.0/linux/amd64/airy) +[Windows](https://airy-core-binaries.s3.amazonaws.com/0.9.0/windows/amd64/airy.exe) + +## 0.8.1 + +#### Changes + +#### 🚀 Features + +- [[#861](https://github.com/airyhq/airy/issues/861)] Render quick replies from facebook [[#942](https://github.com/airyhq/airy/pull/942)] +- [[#910](https://github.com/airyhq/airy/issues/910)] Add message metadata API documentation [[#937](https://github.com/airyhq/airy/pull/937)] +- [[#918](https://github.com/airyhq/airy/issues/918)] New Airy websocket using Airy events [[#928](https://github.com/airyhq/airy/pull/928)] +- [[#875](https://github.com/airyhq/airy/issues/875)] Improve Box component [[#924](https://github.com/airyhq/airy/pull/924)] +- [[#910](https://github.com/airyhq/airy/issues/910)] Add message metadata API [[#933](https://github.com/airyhq/airy/pull/933)] +- [[#856](https://github.com/airyhq/airy/issues/856)] Render Generic Template from Facebook [[#930](https://github.com/airyhq/airy/pull/930)] +- [[#855](https://github.com/airyhq/airy/issues/855)] Render Button Template from Facebook [[#921](https://github.com/airyhq/airy/pull/921)] + +#### Airy CLI + +You can download the Airy CLI for your operating system from the following links: + +[MacOS](https://airy-core-binaries.s3.amazonaws.com/0.8.1/darwin/amd64/airy) +[Linux](https://airy-core-binaries.s3.amazonaws.com/0.8.1/linux/amd64/airy) +[Windows](https://airy-core-binaries.s3.amazonaws.com/0.8.1/windows/amd64/airy.exe) + +## 0.8.0 + +#### Changes + + +#### 🚀 Features + +- [[#852](https://github.com/airyhq/airy/issues/852)] Add google rich text to render library [[#902](https://github.com/airyhq/airy/pull/902)] +- [[#722](https://github.com/airyhq/airy/issues/722)] Add AKHQ as optional tool [[#847](https://github.com/airyhq/airy/pull/847)] +- [[#854](https://github.com/airyhq/airy/issues/854)] Render File from Facebook [[#904](https://github.com/airyhq/airy/pull/904)] +- [[#858](https://github.com/airyhq/airy/issues/858)] Add render rich card [[#901](https://github.com/airyhq/airy/pull/901)] +- [[#863](https://github.com/airyhq/airy/issues/863)] Map metadata to object [[#891](https://github.com/airyhq/airy/pull/891)] +- [[#605](https://github.com/airyhq/airy/issues/605)] Improve chatplugin docs and gifs [[#900](https://github.com/airyhq/airy/pull/900)] +- [[#827](https://github.com/airyhq/airy/issues/827)] Chatplugin uses its own payload [[#853](https://github.com/airyhq/airy/pull/853)] +- [[#772](https://github.com/airyhq/airy/issues/772)] Add Airy Core, Airy Enterprise, Need help? and github links to navigationBar [[#838](https://github.com/airyhq/airy/pull/838)] +- [[#794](https://github.com/airyhq/airy/issues/794)] Introduce channels domain to source specific channel APIs [[#836](https://github.com/airyhq/airy/pull/836)] +- [[#729](https://github.com/airyhq/airy/issues/729)] Make auth header compliant with rfc6750 (Bearer auth) [[#830](https://github.com/airyhq/airy/pull/830)] +- [[#833](https://github.com/airyhq/airy/issues/833)] Bottom space in conversation list [[#843](https://github.com/airyhq/airy/pull/843)] + +#### 🐛 Bug Fixes + +- [[#911](https://github.com/airyhq/airy/issues/911)] fixed rich card rendering with product requirements [[#912](https://github.com/airyhq/airy/pull/912)] +- [[#796](https://github.com/airyhq/airy/issues/796)] Mv shellsheck installation to workflow [[#870](https://github.com/airyhq/airy/pull/870)] +- [[#841](https://github.com/airyhq/airy/issues/841)] Logout if user auth token is wrong [[#857](https://github.com/airyhq/airy/pull/857)] +- Fix facebook text render [[#864](https://github.com/airyhq/airy/pull/864)] +- [[#834](https://github.com/airyhq/airy/issues/834)]Delete link in old inbox and css fix [[#851](https://github.com/airyhq/airy/pull/851)] +- [[#832](https://github.com/airyhq/airy/issues/832)] Merging messages when loading conversations [[#845](https://github.com/airyhq/airy/pull/845)] + +#### 📚 Documentation + +- [[#893](https://github.com/airyhq/airy/issues/893)] Enable showLastUpdateTime [[#917](https://github.com/airyhq/airy/pull/917)] +- [[#899](https://github.com/airyhq/airy/issues/899)] Quickstart with steps [[#916](https://github.com/airyhq/airy/pull/916)] +- [[#876](https://github.com/airyhq/airy/issues/876)] cli install doc revamp [[#896](https://github.com/airyhq/airy/pull/896)] +- [[#846](https://github.com/airyhq/airy/issues/846)] Docs for airy config yaml [[#873](https://github.com/airyhq/airy/pull/873)] +- [[#874](https://github.com/airyhq/airy/issues/874)] Highlight component for docs [[#887](https://github.com/airyhq/airy/pull/887)] +- [[#735](https://github.com/airyhq/airy/issues/735)] Show airy logo on darkmode [[#837](https://github.com/airyhq/airy/pull/837)] + +#### 🧰 Maintenance + +- [#796 ] Add shellcheck lint [[#865](https://github.com/airyhq/airy/pull/865)] +- [[#575](https://github.com/airyhq/airy/issues/575)] Fix window: any type definition [[#850](https://github.com/airyhq/airy/pull/850)] +- [[#605](https://github.com/airyhq/airy/issues/605)] Rename also the charts [[#839](https://github.com/airyhq/airy/pull/839)] + +#### Airy CLI + +You can download the Airy CLI for your operating system from the following links: + +[MacOS](https://airy-core-binaries.s3.amazonaws.com/0.8.0/darwin/amd64/airy) +[Linux](https://airy-core-binaries.s3.amazonaws.com/0.8.0/linux/amd64/airy) +[Windows](https://airy-core-binaries.s3.amazonaws.com/0.8.0/windows/amd64/airy.exe) + +## 0.7.0 + +#### Changes + +- [[#685](https://github.com/airyhq/airy/issues/685)] Type errors not caught by Typescript [[#780](https://github.com/airyhq/airy/pull/780)] +- [[#288](https://github.com/airyhq/airy/issues/288)] Upgrade to Bazel 4.0.0 [[#799](https://github.com/airyhq/airy/pull/799)] +- [[#403](https://github.com/airyhq/airy/issues/403)] Filter for conversations [[#744](https://github.com/airyhq/airy/pull/744)] +- [[#745](https://github.com/airyhq/airy/issues/745)] Fixing demo api host env when running… [[#746](https://github.com/airyhq/airy/pull/746)] + +#### 🚀 Features + +- [[#824](https://github.com/airyhq/airy/issues/824)] When sending a message to the Chat Plugin,… [[#825](https://github.com/airyhq/airy/pull/825)] +- [[#642](https://github.com/airyhq/airy/issues/642)] extract message rendering to a library [[#716](https://github.com/airyhq/airy/pull/716)] +- [[#809](https://github.com/airyhq/airy/issues/809)] Httpclientinstance does not get new auth… [[#811](https://github.com/airyhq/airy/pull/811)] +- [[#804](https://github.com/airyhq/airy/issues/804)] Websocket crashes when new conversation is… [[#808](https://github.com/airyhq/airy/pull/808)] +- [[#538](https://github.com/airyhq/airy/issues/538)] Wire websocket server to the redux store [[#708](https://github.com/airyhq/airy/pull/708)] +- [[#310](https://github.com/airyhq/airy/issues/310)] autogenerated md docs for cli [[#792](https://github.com/airyhq/airy/pull/792)] +- [[#754](https://github.com/airyhq/airy/issues/754)] Specify CPUs and memory at bootstrap [[#782](https://github.com/airyhq/airy/pull/782)] +- [[#401](https://github.com/airyhq/airy/issues/401)] Implement input bar, write \& send message functionality [[#755](https://github.com/airyhq/airy/pull/755)] +- [[#752](https://github.com/airyhq/airy/issues/752)] airy version command should work without loading the config [[#769](https://github.com/airyhq/airy/pull/769)] +- [[#742](https://github.com/airyhq/airy/issues/742)] Chatplugin example page crashes when… [[#768](https://github.com/airyhq/airy/pull/768)] +- [[#611](https://github.com/airyhq/airy/issues/611)] infinite scroll for conversations list and messages [[#720](https://github.com/airyhq/airy/pull/720)] +- [[#723](https://github.com/airyhq/airy/issues/723)] Resolving source media without typed mapping [[#748](https://github.com/airyhq/airy/pull/748)] +- [[#691](https://github.com/airyhq/airy/issues/691)] Support tag\_ids filter queries [[#760](https://github.com/airyhq/airy/pull/760)] +- [[#723](https://github.com/airyhq/airy/issues/723)] Update backend message content for a transparent send message API [[#727](https://github.com/airyhq/airy/pull/727)] + +#### 🐛 Bug Fixes + +- [[#754](https://github.com/airyhq/airy/issues/754)] Fix bootstrap for empty vars [[#801](https://github.com/airyhq/airy/pull/801)] +- [[#785](https://github.com/airyhq/airy/issues/785)] display messages from auth in chat plugin [[#793](https://github.com/airyhq/airy/pull/793)] +- [[#813](https://github.com/airyhq/airy/issues/813)] Prevent sending empty messages [[#816](https://github.com/airyhq/airy/pull/816)] +- [[#802](https://github.com/airyhq/airy/issues/802)] Fix expanding message container [[#803](https://github.com/airyhq/airy/pull/803)] +- [[#791](https://github.com/airyhq/airy/issues/791)] Message Input UI/Design Improvement [[#795](https://github.com/airyhq/airy/pull/795)] +- [[#739](https://github.com/airyhq/airy/issues/739)] Fix Airy cli version when provisioning [[#787](https://github.com/airyhq/airy/pull/787)] +- Keep default in sync with the rest of the system [[#786](https://github.com/airyhq/airy/pull/786)] +- [[#788](https://github.com/airyhq/airy/issues/788)] Import StateModel instead of RootState [[#789](https://github.com/airyhq/airy/pull/789)] +- [[#706](https://github.com/airyhq/airy/issues/706)] Make NGrok optional [[#756](https://github.com/airyhq/airy/pull/756)] +- [[#778](https://github.com/airyhq/airy/issues/778)] Fix display of messages in Chat Plugin [[#779](https://github.com/airyhq/airy/pull/779)] +- [[#757](https://github.com/airyhq/airy/issues/757)] fixed read conversation when it is active [[#759](https://github.com/airyhq/airy/pull/759)] +- [[#654](https://github.com/airyhq/airy/issues/654)] Replace scss files with scss modules [[#753](https://github.com/airyhq/airy/pull/753)] +- Upgrade viper [[#747](https://github.com/airyhq/airy/pull/747)] + +#### 📚 Documentation + +- Add more docs on the installation process [[#822](https://github.com/airyhq/airy/pull/822)] +- [[#800](https://github.com/airyhq/airy/issues/800)] Restructure deployment documentation [[#826](https://github.com/airyhq/airy/pull/826)] +- [[#819](https://github.com/airyhq/airy/issues/819)] Introduce sources introduction [[#823](https://github.com/airyhq/airy/pull/823)] +- [[#810](https://github.com/airyhq/airy/issues/810)] Better troubleshooting page [[#818](https://github.com/airyhq/airy/pull/818)] +- [[#815](https://github.com/airyhq/airy/issues/815)] Rename sources [[#817](https://github.com/airyhq/airy/pull/817)] +- [[#310](https://github.com/airyhq/airy/issues/310)] autogenerated md docs for cli [[#792](https://github.com/airyhq/airy/pull/792)] +- [[#765](https://github.com/airyhq/airy/issues/765)] Restructure API docs [[#781](https://github.com/airyhq/airy/pull/781)] +- [[#775](https://github.com/airyhq/airy/issues/775)] Add ga config [[#777](https://github.com/airyhq/airy/pull/777)] +- [[#774](https://github.com/airyhq/airy/issues/774)] Better favicon [[#776](https://github.com/airyhq/airy/pull/776)] +- [[#491](https://github.com/airyhq/airy/issues/491)] Do not show the edit button for docs [[#771](https://github.com/airyhq/airy/pull/771)] +- [[#731](https://github.com/airyhq/airy/issues/731)] Follow up on revamp of the structure [[#767](https://github.com/airyhq/airy/pull/767)] +- [[#731](https://github.com/airyhq/airy/issues/731)] Doc revamp [[#758](https://github.com/airyhq/airy/pull/758)] + +#### 🧰 Maintenance + +- Untrack .ijwb since it makes importing the project more difficult [[#766](https://github.com/airyhq/airy/pull/766)] + +#### Airy CLI + +You can download the Airy CLI for your operating system from the following links: + +[MacOS](https://airy-core-binaries.s3.amazonaws.com/0.7.0/darwin/amd64/airy) +[Linux](https://airy-core-binaries.s3.amazonaws.com/0.7.0/linux/amd64/airy) +[Windows](https://airy-core-binaries.s3.amazonaws.com/0.7.0/windows/amd64/airy.exe) + +## 0.6.0 + +#### 🚀 Features + +- [[#623](https://github.com/airyhq/airy/issues/623)] Optional apps depend on config file [[#719](https://github.com/airyhq/airy/pull/719)] +- [[#698](https://github.com/airyhq/airy/issues/698)] Provide endpoint configuration to the frontend [[#712](https://github.com/airyhq/airy/pull/712)] +- [[#704](https://github.com/airyhq/airy/issues/704)] Update websocket documentation [[#705](https://github.com/airyhq/airy/pull/705)] +- [[#620](https://github.com/airyhq/airy/issues/620)] Reload configuration based on config file [[#655](https://github.com/airyhq/airy/pull/655)] +- [[#644](https://github.com/airyhq/airy/issues/644)] Facebook connector sends out templates [[#683](https://github.com/airyhq/airy/pull/683)] +- [[#667](https://github.com/airyhq/airy/issues/667)] Support Google suggestion responses [[#690](https://github.com/airyhq/airy/pull/690)] +- [[#622](https://github.com/airyhq/airy/issues/622)] Affect only deployments with a particular… [[#688](https://github.com/airyhq/airy/pull/688)] +- Introduce status command [[#686](https://github.com/airyhq/airy/pull/686)] +- [[#402](https://github.com/airyhq/airy/issues/402)] Tag conversations [[#682](https://github.com/airyhq/airy/pull/682)] +- [[#640](https://github.com/airyhq/airy/issues/640)] Enrich send message API with source template messages [[#680](https://github.com/airyhq/airy/pull/680)] +- [[#641](https://github.com/airyhq/airy/issues/641)] Add content type for source templates [[#676](https://github.com/airyhq/airy/pull/676)] +- [[#620](https://github.com/airyhq/airy/issues/620)] Download kubeconf file [[#673](https://github.com/airyhq/airy/pull/673)] +- [[#308](https://github.com/airyhq/airy/issues/308)] Upload cli binaries to S3 [[#669](https://github.com/airyhq/airy/pull/669)] +- [[#621](https://github.com/airyhq/airy/issues/621)] Controller starts/stops apps based on config map changes [[#647](https://github.com/airyhq/airy/pull/647)] +- Introduce /client.config [[#668](https://github.com/airyhq/airy/pull/668)] +- [[#646](https://github.com/airyhq/airy/issues/646)] Configurable ingress hostnames [[#648](https://github.com/airyhq/airy/pull/648)] +- [[#306](https://github.com/airyhq/airy/issues/306)] cli config [[#649](https://github.com/airyhq/airy/pull/649)] +- [[#501](https://github.com/airyhq/airy/issues/501)] Resume conversation in chat plugin [[#603](https://github.com/airyhq/airy/pull/603)] +- [[#497](https://github.com/airyhq/airy/issues/497)] Upload metadata and message source files [[#602](https://github.com/airyhq/airy/pull/602)] +- [[#599](https://github.com/airyhq/airy/issues/599)] Display avatar + time in messages [[#625](https://github.com/airyhq/airy/pull/625)] +- [[#614](https://github.com/airyhq/airy/issues/614)] Fix release script [[#615](https://github.com/airyhq/airy/pull/615)] +- [[#598](https://github.com/airyhq/airy/issues/598)] Feature/598 read unread state of conversations [[#617](https://github.com/airyhq/airy/pull/617)] + + +#### 🐛 Bug Fixes + +- [[#623](https://github.com/airyhq/airy/issues/623)] Fix Google safile sample config [[#736](https://github.com/airyhq/airy/pull/736)] +- [[#623](https://github.com/airyhq/airy/issues/623)] Fix manifest for the chatpluign [[#732](https://github.com/airyhq/airy/pull/732)] +- Fix numeric range queries [[#730](https://github.com/airyhq/airy/pull/730)] +- Return messages last to first so pagination makes sense [[#728](https://github.com/airyhq/airy/pull/728)] +- Fix infinite recursion in chatplugin nginx location capture [[#725](https://github.com/airyhq/airy/pull/725)] +- [[#698](https://github.com/airyhq/airy/issues/698)] Use host config coming from the env [[#721](https://github.com/airyhq/airy/pull/721)] +- Rm extra bracket [[#717](https://github.com/airyhq/airy/pull/717)] +- Paginate messages for real :) [[#715](https://github.com/airyhq/airy/pull/715)] +- [[#713](https://github.com/airyhq/airy/issues/713)] Fix bug on tags list [[#714](https://github.com/airyhq/airy/pull/714)] +- [[#695](https://github.com/airyhq/airy/issues/695)] Fix yq version incompatibility [[#697](https://github.com/airyhq/airy/pull/697)] +- [[#678](https://github.com/airyhq/airy/issues/678)] Update VERSION file after release [[#684](https://github.com/airyhq/airy/pull/684)] +- [[#421](https://github.com/airyhq/airy/issues/421)] Consider service disabled if any exception occurs [[#674](https://github.com/airyhq/airy/pull/674)] +- Endpoints should return {} instead of nothing [[#672](https://github.com/airyhq/airy/pull/672)] +- refactored lib with class that can be instantiated [[#664](https://github.com/airyhq/airy/pull/664)] +- add mappers to ts http client lib [[#657](https://github.com/airyhq/airy/pull/657)] +- [[#692](https://github.com/airyhq/airy/issues/692)] unread count [[#734](https://github.com/airyhq/airy/pull/734)] +- [[#546](https://github.com/airyhq/airy/issues/546)] Fix/546 revise image tags [[#658](https://github.com/airyhq/airy/pull/658)] + +#### 📚 Documentation + +- Update README.md [[#700](https://github.com/airyhq/airy/pull/700)] + +#### 🧰 Maintenance + +- Remove suppression [[#702](https://github.com/airyhq/airy/pull/702)] +- Improve config tests and introduce integration tests runner func [[#726](https://github.com/airyhq/airy/pull/726)] +- [[#711](https://github.com/airyhq/airy/issues/711)] Add CI status badge [[#724](https://github.com/airyhq/airy/pull/724)] +- Fix typo in readme [[#709](https://github.com/airyhq/airy/pull/709)] +- Reorganize integration tests [[#694](https://github.com/airyhq/airy/pull/694)] +- [[#693](https://github.com/airyhq/airy/issues/693)] Simplify display name contact API response [[#696](https://github.com/airyhq/airy/pull/696)] +- Add missing docs for authenticating with the websocket [[#689](https://github.com/airyhq/airy/pull/689)] +- [[#403](https://github.com/airyhq/airy/issues/403)] Allow leading wildcard searches for Lucene [[#681](https://github.com/airyhq/airy/pull/681)] +- Remove .bazelproject from vcs [[#666](https://github.com/airyhq/airy/pull/666)] +- Disable go plugin by default since it only works for ultimate users [[#663](https://github.com/airyhq/airy/pull/663)] +- [[#651](https://github.com/airyhq/airy/issues/651)] Use Google Cloud Storage for the bazel remote cache [[#652](https://github.com/airyhq/airy/pull/652)] +- [[#642](https://github.com/airyhq/airy/issues/642)] Update typescript content typings [[#645](https://github.com/airyhq/airy/pull/645)] + +#### Airy CLI + +You can download the Airy CLI for your operating system from the following links: + +[MacOS](https://airy-core-binaries.s3.amazonaws.com/0.6.0/darwin/amd64/airy) +[Linux](https://airy-core-binaries.s3.amazonaws.com/0.6.0/linux/amd64/airy) +[Windows](https://airy-core-binaries.s3.amazonaws.com/0.6.0/windows/amd64/airy.exe) +[Alpine](https://airy-core-binaries.s3.amazonaws.com/0.6.0/alpine/amd64/airy) +## + +#### Changes + +#### 🚀 Features + +- [[#400](https://github.com/airyhq/airy/issues/400)] Load messages of conversations [[#567](https://github.com/airyhq/airy/pull/567)] +- [[#335](https://github.com/airyhq/airy/issues/335)] Provisioning optimization [[#610](https://github.com/airyhq/airy/pull/610)] +- [[#526](https://github.com/airyhq/airy/issues/526)] Introduce namespace var [[#595](https://github.com/airyhq/airy/pull/595)] +- [[#169](https://github.com/airyhq/airy/issues/169)] Use karapace.io schema registry [[#596](https://github.com/airyhq/airy/pull/596)] +- [[#497](https://github.com/airyhq/airy/issues/497)] Dynamically map source data urls in content mapper [[#594](https://github.com/airyhq/airy/pull/594)] +- [[#169](https://github.com/airyhq/airy/issues/169)] Optimize kafka images [[#583](https://github.com/airyhq/airy/pull/583)] +- [[#327](https://github.com/airyhq/airy/issues/327)] Introduce a release script that automates the process [[#586](https://github.com/airyhq/airy/pull/586)] +- [[#526](https://github.com/airyhq/airy/issues/526)] Rename pg values [[#590](https://github.com/airyhq/airy/pull/590)] +- [[#446](https://github.com/airyhq/airy/issues/446)] Introduce go linter [[#576](https://github.com/airyhq/airy/pull/576)] +- [[#496](https://github.com/airyhq/airy/issues/496)] Add file content model [[#579](https://github.com/airyhq/airy/pull/579)] +- [[#496](https://github.com/airyhq/airy/issues/496)] Add video content model [[#577](https://github.com/airyhq/airy/pull/577)] +- [[#522](https://github.com/airyhq/airy/issues/522)] introduce httpclient lib [[#571](https://github.com/airyhq/airy/pull/571)] +- [[#450](https://github.com/airyhq/airy/issues/450)] Introduce Airy k8s controller [[#534](https://github.com/airyhq/airy/pull/534)] +- [[#496](https://github.com/airyhq/airy/issues/496)] Add audio content model [[#574](https://github.com/airyhq/airy/pull/574)] +- [[#572](https://github.com/airyhq/airy/issues/572)] Messages from facebook page should have… [[#573](https://github.com/airyhq/airy/pull/573)] + +#### 🐛 Bug Fixes + +- [[#412](https://github.com/airyhq/airy/issues/412)] Always deploy images [[#609](https://github.com/airyhq/airy/pull/609)] +- [[#412](https://github.com/airyhq/airy/issues/412)] Use the correct ENV var [[#608](https://github.com/airyhq/airy/pull/608)] +- [[#412](https://github.com/airyhq/airy/issues/412)] Actually pass the branch ref [[#604](https://github.com/airyhq/airy/pull/604)] +- [[#587](https://github.com/airyhq/airy/issues/587)] fix chat plugin development env [[#589](https://github.com/airyhq/airy/pull/589)] +- Lower case the webhook subdomains [[#588](https://github.com/airyhq/airy/pull/588)] +- [[#569](https://github.com/airyhq/airy/issues/569)] Facebook Messages from page are not parsed… [[#570](https://github.com/airyhq/airy/pull/570)] + +#### 📚 Documentation + +- [[#424](https://github.com/airyhq/airy/issues/424)] chatplugin gifs with asciinema [[#592](https://github.com/airyhq/airy/pull/592)] + +#### 🧰 Maintenance + +- [[#412](https://github.com/airyhq/airy/issues/412)] Push only changed images for beta [[#601](https://github.com/airyhq/airy/pull/601)] +- [[#331](https://github.com/airyhq/airy/issues/331)] Introduce local container push target [[#580](https://github.com/airyhq/airy/pull/580)] + +## 0.4.0 + +#### 🚀 Features + +- [[#526](https://github.com/airyhq/airy/issues/526)] Introduce namespacing for topics [[#566](https://github.com/airyhq/airy/pull/566)] +- [[#503](https://github.com/airyhq/airy/issues/503)] Customize commit interval so the test environment can have a d… [[#555](https://github.com/airyhq/airy/pull/555)] +- [[#549](https://github.com/airyhq/airy/issues/549)] Stop logging Facebook webhook requests [[#557](https://github.com/airyhq/airy/pull/557)] +- [[#547](https://github.com/airyhq/airy/issues/547)] Introduce model lib for metadata and messages [[#552](https://github.com/airyhq/airy/pull/552)] +- [[#223](https://github.com/airyhq/airy/issues/223)] Future of `/channels.explore` [[#541](https://github.com/airyhq/airy/pull/541)] +- [[#169](https://github.com/airyhq/airy/issues/169)] Use distroless for java images [[#540](https://github.com/airyhq/airy/pull/540)] +- [[#527](https://github.com/airyhq/airy/issues/527)] Enable resuming of chatplugin conversations [[#533](https://github.com/airyhq/airy/pull/533)] +- [[#494](https://github.com/airyhq/airy/issues/494)] Fetch Facebook metadata [[#528](https://github.com/airyhq/airy/pull/528)] +- [[#496](https://github.com/airyhq/airy/issues/496)] Added Image content model for Facebook [[#539](https://github.com/airyhq/airy/pull/539)] +- [[#399](https://github.com/airyhq/airy/issues/399)] Conversations List [[#507](https://github.com/airyhq/airy/pull/507)] +- [[#496](https://github.com/airyhq/airy/issues/496)] Added Image content model for Twilio [[#532](https://github.com/airyhq/airy/pull/532)] +- [[#496](https://github.com/airyhq/airy/issues/496)] Added Image content model for Google [[#531](https://github.com/airyhq/airy/pull/531)] +- [[#493](https://github.com/airyhq/airy/issues/493)] Route Google metadata to get displayname [[#521](https://github.com/airyhq/airy/pull/521)] +- [[#523](https://github.com/airyhq/airy/issues/523)] Return source type in the channel payload [[#529](https://github.com/airyhq/airy/pull/529)] +- [[#496](https://github.com/airyhq/airy/issues/496)] Changing content render api [[#520](https://github.com/airyhq/airy/pull/520)] +- [[#464](https://github.com/airyhq/airy/issues/464)] Feature/add logout core [[#519](https://github.com/airyhq/airy/pull/519)] +- [[#499](https://github.com/airyhq/airy/issues/499)] Future-proof metadata model [[#514](https://github.com/airyhq/airy/pull/514)] + +#### 🐛 Bug Fixes + +- [[#564](https://github.com/airyhq/airy/issues/564)] Fix kafka configmap in helm [[#565](https://github.com/airyhq/airy/pull/565)] +- [[#466](https://github.com/airyhq/airy/issues/466)] Change public name of go modules [[#561](https://github.com/airyhq/airy/pull/561)] +- [[#562](https://github.com/airyhq/airy/issues/562)] Fix chatplugin generator [[#563](https://github.com/airyhq/airy/pull/563)] + +#### 📚 Documentation + +- [[#485](https://github.com/airyhq/airy/issues/485)] [[#486](https://github.com/airyhq/airy/issues/486)] Enrich HTTP docs [[#560](https://github.com/airyhq/airy/pull/560)] +- [[#524](https://github.com/airyhq/airy/issues/524)] remove hyperlinks [[#530](https://github.com/airyhq/airy/pull/530)] +- [[#489](https://github.com/airyhq/airy/issues/489)] how to run the frontend [[#518](https://github.com/airyhq/airy/pull/518)] + +#### 🧰 Maintenance + +- [[#515](https://github.com/airyhq/airy/issues/515)] introduce eslint [[#554](https://github.com/airyhq/airy/pull/554)] +- [[#548](https://github.com/airyhq/airy/issues/548)] Extract payload to web library and introduce date lib [[#556](https://github.com/airyhq/airy/pull/556)] +- [[#551](https://github.com/airyhq/airy/issues/551)] Use test.properties everywhere [[#553](https://github.com/airyhq/airy/pull/553)] + +## 0.3.0 + +#### Changes + +- [[#472](https://github.com/airyhq/airy/issues/472)] Fix guide link [[#488](https://github.com/airyhq/airy/pull/488)] + +#### 🚀 Features + +- [[#473](https://github.com/airyhq/airy/issues/473)] Rely on allowed origins setup from the env [[#505](https://github.com/airyhq/airy/pull/505)] +- [[#257](https://github.com/airyhq/airy/issues/257)] Add tags to core [[#431](https://github.com/airyhq/airy/pull/431)] +- [[#310](https://github.com/airyhq/airy/issues/310)] Airy CLI [[#468](https://github.com/airyhq/airy/pull/468)] +- [[#393](https://github.com/airyhq/airy/issues/393)] AllowedOrigin in airy.conf [[#469](https://github.com/airyhq/airy/pull/469)] +- [[#310](https://github.com/airyhq/airy/issues/310)] Add go api client lib [[#460](https://github.com/airyhq/airy/pull/460)] +- [[#452](https://github.com/airyhq/airy/issues/452)] Split auth dependency [[#456](https://github.com/airyhq/airy/pull/456)] +- [[#457](https://github.com/airyhq/airy/issues/457)] Improve conversations query (indexes, restoration, api) [[#459](https://github.com/airyhq/airy/pull/459)] +- [[#451](https://github.com/airyhq/airy/issues/451)] Bash test messages generator [[#454](https://github.com/airyhq/airy/pull/454)] +- [[#437](https://github.com/airyhq/airy/issues/437)] Replace alignment in favor of sender type [[#441](https://github.com/airyhq/airy/pull/441)] +- [[#434](https://github.com/airyhq/airy/issues/434)] Move libs to the root of the monorepo [[#438](https://github.com/airyhq/airy/pull/438)] +- [[#370](https://github.com/airyhq/airy/issues/370)] Add conversation metadata filter docs [[#439](https://github.com/airyhq/airy/pull/439)] +- [[#342](https://github.com/airyhq/airy/issues/342)] Add guide on how to connect Rasa and fix webhook API [[#423](https://github.com/airyhq/airy/pull/423)] +- [[#413](https://github.com/airyhq/airy/issues/413)] Add /metadata.remove endpoint [[#430](https://github.com/airyhq/airy/pull/430)] +- [[#425](https://github.com/airyhq/airy/issues/425)] Migrate Code formating to Bazel tools [[#426](https://github.com/airyhq/airy/pull/426)] +- [[#290](https://github.com/airyhq/airy/issues/290)] Channels page [[#420](https://github.com/airyhq/airy/pull/420)] +- [[#427](https://github.com/airyhq/airy/issues/427)] Return default contact information [[#429](https://github.com/airyhq/airy/pull/429)] +- [[#413](https://github.com/airyhq/airy/issues/413)] Add /metadata.set endpoint [[#414](https://github.com/airyhq/airy/pull/414)] +- [[#370](https://github.com/airyhq/airy/issues/370)] Filter conversations on metadata [[#407](https://github.com/airyhq/airy/pull/407)] + +#### 🐛 Bug Fixes + +- [[#498](https://github.com/airyhq/airy/issues/498)] Fix image tags on conf [[#511](https://github.com/airyhq/airy/pull/511)] +- Fix codeowners syntax [[#512](https://github.com/airyhq/airy/pull/512)] +- [[#506](https://github.com/airyhq/airy/issues/506)] Remove unused labels [[#510](https://github.com/airyhq/airy/pull/510)] +- Fix sources configmap [[#500](https://github.com/airyhq/airy/pull/500)] +- [[#386](https://github.com/airyhq/airy/issues/386)] Add quote function [[#476](https://github.com/airyhq/airy/pull/476)] +- Hotfix for CI [[#465](https://github.com/airyhq/airy/pull/465)] +- [442] Fix glossary TOC [[#443](https://github.com/airyhq/airy/pull/443)] + +#### 📚 Documentation + +- [[#490](https://github.com/airyhq/airy/issues/490)] Reorganize sidebar [[#492](https://github.com/airyhq/airy/pull/492)] +- [[#484](https://github.com/airyhq/airy/issues/484)] Remove reset password docs [[#487](https://github.com/airyhq/airy/pull/487)] +- Several initial updates [[#477](https://github.com/airyhq/airy/pull/477)] +- Several improvements [[#478](https://github.com/airyhq/airy/pull/478)] +- Small improvements [[#479](https://github.com/airyhq/airy/pull/479)] +- [[#470](https://github.com/airyhq/airy/issues/470)] Specify --no-ff option in merge commands [[#471](https://github.com/airyhq/airy/pull/471)] +- [[#341](https://github.com/airyhq/airy/issues/341)] Introduce "how to connect a facebook page"… [[#436](https://github.com/airyhq/airy/pull/436)] +- [[#453](https://github.com/airyhq/airy/issues/453)] Update release docs [[#458](https://github.com/airyhq/airy/pull/458)] +- [[#444](https://github.com/airyhq/airy/issues/444)] Use prettier for markdown files as well [[#448](https://github.com/airyhq/airy/pull/448)] +- [[#442](https://github.com/airyhq/airy/issues/442)] Fix glossary TOC [[#443](https://github.com/airyhq/airy/pull/443)] + +#### 🧰 Maintenance + +- [[#462](https://github.com/airyhq/airy/issues/462)] Assign the label chore to dependabot pull requests [[#504](https://github.com/airyhq/airy/pull/504)] +- Add codeowners configuration [[#502](https://github.com/airyhq/airy/pull/502)] +- Bump ini from 1.3.5 to 1.3.7 in /docs [[#475](https://github.com/airyhq/airy/pull/475)] +- Bump ini from 1.3.5 to 1.3.7 [[#474](https://github.com/airyhq/airy/pull/474)] +- Bump elliptic from 6.5.2 to 6.5.3 [[#461](https://github.com/airyhq/airy/pull/461)] +- [[#432](https://github.com/airyhq/airy/issues/432)] Use Bazel tools web rules [[#435](https://github.com/airyhq/airy/pull/435)] + +## 0.2.0 + +#### Changes + +- [[#338](https://github.com/airyhq/airy/issues/338)] Add docs for running in production [[#359](https://github.com/airyhq/airy/pull/359)] +- [[#394](https://github.com/airyhq/airy/issues/394)] Fix broken link in documentation [[#395](https://github.com/airyhq/airy/pull/395)] +- [[#376](https://github.com/airyhq/airy/issues/376)] Fix chatplugin message sending and style loading [[#379](https://github.com/airyhq/airy/pull/379)] +- [324] Reflect in the docs our understanding of the release process [[#375](https://github.com/airyhq/airy/pull/375)] +- [[#351](https://github.com/airyhq/airy/issues/351)] Add Twilio deployment descriptors [[#374](https://github.com/airyhq/airy/pull/374)] +- [[#350](https://github.com/airyhq/airy/issues/350)] Twilio content mapper [[#373](https://github.com/airyhq/airy/pull/373)] +- [[#352](https://github.com/airyhq/airy/issues/352)] Add Twilio channel connection [[#371](https://github.com/airyhq/airy/pull/371)] +- [[#369](https://github.com/airyhq/airy/issues/369)] Show release process docs in the sidebar [[#372](https://github.com/airyhq/airy/pull/372)] +- [[#367](https://github.com/airyhq/airy/issues/367)] cleanup linting [[#368](https://github.com/airyhq/airy/pull/368)] +- [[#354](https://github.com/airyhq/airy/issues/354)] Add Twilio Events router, fix ingestion time bug in google source [[#365](https://github.com/airyhq/airy/pull/365)] +- [[#355](https://github.com/airyhq/airy/issues/355)] Add Twilio sender [[#366](https://github.com/airyhq/airy/pull/366)] +- [[#353](https://github.com/airyhq/airy/issues/353)] Add Twilio webhook [[#362](https://github.com/airyhq/airy/pull/362)] +- [[#337](https://github.com/airyhq/airy/issues/337)] Prettier linting uses tests [[#357](https://github.com/airyhq/airy/pull/357)] +- [[#334](https://github.com/airyhq/airy/issues/334)] Reflect components move in the docs [[#361](https://github.com/airyhq/airy/pull/361)] +- Change hostname in smoketest for chatplugin routes [[#363](https://github.com/airyhq/airy/pull/363)] +- Add chatplugin api docs [[#348](https://github.com/airyhq/airy/pull/348)] +- [[#322](https://github.com/airyhq/airy/issues/322)] Conversations.tag endpoint returns 500 on empty payload [[#360](https://github.com/airyhq/airy/pull/360)] +- [[#328](https://github.com/airyhq/airy/issues/328)] Update Subscribed Fields for Facebook Webhooks [[#329](https://github.com/airyhq/airy/pull/329)] +- [[#279](https://github.com/airyhq/airy/issues/279)] Add update delivery state message accessor [[#339](https://github.com/airyhq/airy/pull/339)] +- [[#349](https://github.com/airyhq/airy/issues/349)] Add Twilio source documentation [[#356](https://github.com/airyhq/airy/pull/356)] +- [[#346](https://github.com/airyhq/airy/issues/346)] Fix ingress configuration [[#347](https://github.com/airyhq/airy/pull/347)] +- [[#326](https://github.com/airyhq/airy/issues/326)] Update release process docs [[#332](https://github.com/airyhq/airy/pull/332)] +- [[#303](https://github.com/airyhq/airy/issues/303)] deploy chat plugin widget [[#333](https://github.com/airyhq/airy/pull/333)] +- [[#236](https://github.com/airyhq/airy/issues/236)] - Removing the current kafka-client pod [[#289](https://github.com/airyhq/airy/pull/289)] +- [[#231](https://github.com/airyhq/airy/issues/231)] Smoke test improvements [[#330](https://github.com/airyhq/airy/pull/330)] +- Fix the ci bazel config [[#320](https://github.com/airyhq/airy/pull/320)] +- [[#318](https://github.com/airyhq/airy/issues/318)] Docs should use the right branch [[#319](https://github.com/airyhq/airy/pull/319)] +- [[#302](https://github.com/airyhq/airy/issues/302)] Add chat plugin UI widget [[#311](https://github.com/airyhq/airy/pull/311)] +- Release npm components library v0.4.5 [[#317](https://github.com/airyhq/airy/pull/317)] +- Fix aws cli env variables in ci [[#316](https://github.com/airyhq/airy/pull/316)] +- [215] Infra/publish images [[#294](https://github.com/airyhq/airy/pull/294)] +- [[#268](https://github.com/airyhq/airy/issues/268)] Google/Facebook source documentation [[#301](https://github.com/airyhq/airy/pull/301)] +- [[#287](https://github.com/airyhq/airy/issues/287)] Add Java linting [[#295](https://github.com/airyhq/airy/pull/295)] +- [[#292](https://github.com/airyhq/airy/issues/292)] Configure algolia for docs.airy.co [[#293](https://github.com/airyhq/airy/pull/293)] +- Log web requests [[#291](https://github.com/airyhq/airy/pull/291)] +- Structure + Login for demo [[#263](https://github.com/airyhq/airy/pull/263)] +- Add google deployment descriptors [[#286](https://github.com/airyhq/airy/pull/286)] +- Add google admin api channel connection [[#284](https://github.com/airyhq/airy/pull/284)] +- [[#270](https://github.com/airyhq/airy/issues/270)] Google content mapper [[#285](https://github.com/airyhq/airy/pull/285)] +- [[#221](https://github.com/airyhq/airy/issues/221)] Further improvements to the script [[#283](https://github.com/airyhq/airy/pull/283)] +- Add authentication to communication websocket [[#282](https://github.com/airyhq/airy/pull/282)] +- Fix chat plugin messaging behavior [[#277](https://github.com/airyhq/airy/pull/277)] +- [[#264](https://github.com/airyhq/airy/issues/264)] Google event router [[#278](https://github.com/airyhq/airy/pull/278)] +- Fix reverse conversation list order [[#280](https://github.com/airyhq/airy/pull/280)] +- Add Google message sender app [[#275](https://github.com/airyhq/airy/pull/275)] +- Infra/smoke test improvement [[#262](https://github.com/airyhq/airy/pull/262)] +- [[#265](https://github.com/airyhq/airy/issues/265)] Google webhook ingestion [[#272](https://github.com/airyhq/airy/pull/272)] +- Prepare the codebase for release processes [[#260](https://github.com/airyhq/airy/pull/260)] +- Use airy specific dns entries for the dev box [[#261](https://github.com/airyhq/airy/pull/261)] +- Do not use javatuples [[#258](https://github.com/airyhq/airy/pull/258)] +- Expands contribution document [[#237](https://github.com/airyhq/airy/pull/237)] +- Generate typescript definitions from content model [[#241](https://github.com/airyhq/airy/pull/241)] +- Bug/245 send message duplicates webhook [[#249](https://github.com/airyhq/airy/pull/249)] +- [[#251](https://github.com/airyhq/airy/issues/251)] Do not remove the viewBox in SVGs [[#252](https://github.com/airyhq/airy/pull/252)] +- Fix request NPEs [[#248](https://github.com/airyhq/airy/pull/248)] +- [[#180](https://github.com/airyhq/airy/issues/180)] Extract testing helper to a java library [[#247](https://github.com/airyhq/airy/pull/247)] +- Fix name of provisioner [[#246](https://github.com/airyhq/airy/pull/246)] +- Temporary remove demo from the status output [[#242](https://github.com/airyhq/airy/pull/242)] +- Running core on alpine image with k3s [[#230](https://github.com/airyhq/airy/pull/230)] +- Map outbound content model in communication app [[#231](https://github.com/airyhq/airy/pull/231)] +- attempt to improve ci [[#234](https://github.com/airyhq/airy/pull/234)] +- Smoke test draft [[#232](https://github.com/airyhq/airy/pull/232)] +- Fixes #226 [[#233](https://github.com/airyhq/airy/pull/233)] +- Add alpine nginx image for demo app [[#229](https://github.com/airyhq/airy/pull/229)] +- Use the local components library version in the showcase app [[#228](https://github.com/airyhq/airy/pull/228)] +- Introduce sources top level menu [[#214](https://github.com/airyhq/airy/pull/214)] +- Update README.md [[#224](https://github.com/airyhq/airy/pull/224)] +- Do not autowire in production code [[#225](https://github.com/airyhq/airy/pull/225)] +- Refer to the main branch for the edit button in docs [[#220](https://github.com/airyhq/airy/pull/220)] +- Fix Facebook channel connection docs [[#222](https://github.com/airyhq/airy/pull/222)] +- Add deployment files for webhooks [[#206](https://github.com/airyhq/airy/pull/206)] +- Checks bootstrap script run path [[#192](https://github.com/airyhq/airy/pull/192)] +- Add demo app and globalize typescript type definitions [[#211](https://github.com/airyhq/airy/pull/211)] +- Add docusaurus and move docs [[#212](https://github.com/airyhq/airy/pull/212)] +- Small fixes before release [[#208](https://github.com/airyhq/airy/pull/208)] +- Fix consumer healthcheck endpoint in deployments [[#209](https://github.com/airyhq/airy/pull/209)] +- Minimal release script [[#203](https://github.com/airyhq/airy/pull/203)] +- fixed link to components website [[#205](https://github.com/airyhq/airy/pull/205)] +- Prepare the codebase for renaming [[#204](https://github.com/airyhq/airy/pull/204)] +- Orchestrate vagrant up and down [[#194](https://github.com/airyhq/airy/pull/194)] +- Fix sender app id [[#202](https://github.com/airyhq/airy/pull/202)] +- Filter out unknown webhooks [[#201](https://github.com/airyhq/airy/pull/201)] +- Require url and default to empty map for headers in webhook creation [[#198](https://github.com/airyhq/airy/pull/198)] +- Fix unauthorized response [[#200](https://github.com/airyhq/airy/pull/200)] +- Fix Searchfield [[#195](https://github.com/airyhq/airy/pull/195)] +- Disable test output in CI [[#193](https://github.com/airyhq/airy/pull/193)] +- Infra/schema reg protocol [[#199](https://github.com/airyhq/airy/pull/199)] +- Require color on tag creation [[#197](https://github.com/airyhq/airy/pull/197)] +- Introduce web test helper [[#191](https://github.com/airyhq/airy/pull/191)] +- One broker [[#190](https://github.com/airyhq/airy/pull/190)] +- Auth refactor [[#183](https://github.com/airyhq/airy/pull/183)] +- Change default bootstrap [[#184](https://github.com/airyhq/airy/pull/184)] +- Add line to apply the yaml [[#185](https://github.com/airyhq/airy/pull/185)] +- Fix bootstrap [[#181](https://github.com/airyhq/airy/pull/181)] +- Normalize health endpoints [[#179](https://github.com/airyhq/airy/pull/179)] +- Fix response code for duplicate email signups [[#178](https://github.com/airyhq/airy/pull/178)] +- Add auth middleware to admin [[#176](https://github.com/airyhq/airy/pull/176)] +- Add chat plugin [[#142](https://github.com/airyhq/airy/pull/142)] +- Add jwt to backend apps [[#175](https://github.com/airyhq/airy/pull/175)] +- Add bracket [[#174](https://github.com/airyhq/airy/pull/174)] +- Randomize jwt token and pg password [[#171](https://github.com/airyhq/airy/pull/171)] +- new version [[#172](https://github.com/airyhq/airy/pull/172)] +- Add subscribed\_fields to page connect API [[#173](https://github.com/airyhq/airy/pull/173)] +- Add channels connect endpoint [[#166](https://github.com/airyhq/airy/pull/166)] +- Change default port and mail [[#164](https://github.com/airyhq/airy/pull/164)] +- Allows /actuator/health routes to be accessible [[#165](https://github.com/airyhq/airy/pull/165)] +- Add mail vars to user inoput [[#163](https://github.com/airyhq/airy/pull/163)] +- Adds webhook api docs [[#161](https://github.com/airyhq/airy/pull/161)] +- Install virtualbox [[#158](https://github.com/airyhq/airy/pull/158)] +- Feature/remove translations [[#157](https://github.com/airyhq/airy/pull/157)] +- Check if there is a config file or not [[#159](https://github.com/airyhq/airy/pull/159)] +- Pull images while building the packer image [[#156](https://github.com/airyhq/airy/pull/156)] +- Rename endpoints so that naming is more consistent [[#153](https://github.com/airyhq/airy/pull/153)] +- Kafka topics config [[#155](https://github.com/airyhq/airy/pull/155)] +- Add local copies of the changed yamls [[#154](https://github.com/airyhq/airy/pull/154)] +- Add spring auth and spring security lib [[#127](https://github.com/airyhq/airy/pull/127)] +- Fix issue #134 [[#152](https://github.com/airyhq/airy/pull/152)] +- Clean up some scripts [[#151](https://github.com/airyhq/airy/pull/151)] +- Add box\_url instead of box [[#149](https://github.com/airyhq/airy/pull/149)] +- Disable audio for virtualbox [[#148](https://github.com/airyhq/airy/pull/148)] +- Fix curl example [[#147](https://github.com/airyhq/airy/pull/147)] +- Only print vagrant installation information if needed [[#146](https://github.com/airyhq/airy/pull/146)] +- Fix airy-core s3 image [[#143](https://github.com/airyhq/airy/pull/143)] +- Local Helm charts [[#139](https://github.com/airyhq/airy/pull/139)] +- Remove topbar and dependency on react-redux [[#144](https://github.com/airyhq/airy/pull/144)] +- Fix health check [[#137](https://github.com/airyhq/airy/pull/137)] +- Add chat plugin channel source [[#140](https://github.com/airyhq/airy/pull/140)] +- Introduce a user guide [[#138](https://github.com/airyhq/airy/pull/138)] +- Add chat plugin docs [[#136](https://github.com/airyhq/airy/pull/136)] +- Update user-input script for airy-core [[#130](https://github.com/airyhq/airy/pull/130)] +- Updates to the frontend readme [[#128](https://github.com/airyhq/airy/pull/128)] +- Remove date range, make showcase use npm library [[#125](https://github.com/airyhq/airy/pull/125)] +- Add ngrok sidecar to facebook webhook [[#126](https://github.com/airyhq/airy/pull/126)] +- Fix the left join topology call by reference issue [[#129](https://github.com/airyhq/airy/pull/129)] +- Add user input from config file [[#123](https://github.com/airyhq/airy/pull/123)] +- add readme [[#124](https://github.com/airyhq/airy/pull/124)] +- Move packer images to a separate folder [[#121](https://github.com/airyhq/airy/pull/121)] +- Fix library export [[#120](https://github.com/airyhq/airy/pull/120)] +- Add more components to showcase [[#118](https://github.com/airyhq/airy/pull/118)] +- Add conversation tag/untag [[#107](https://github.com/airyhq/airy/pull/107)] +- Bootstrap finishing [[#119](https://github.com/airyhq/airy/pull/119)] +- Bootstrap finishing [[#117](https://github.com/airyhq/airy/pull/117)] +- Implements /tags.update endpoint [[#114](https://github.com/airyhq/airy/pull/114)] +- Update topics configs [[#116](https://github.com/airyhq/airy/pull/116)] +- Download Vagrant at bootstrap time [[#112](https://github.com/airyhq/airy/pull/112)] +- Some gardening [[#115](https://github.com/airyhq/airy/pull/115)] +- Topics finder [[#113](https://github.com/airyhq/airy/pull/113)] +- User input [[#110](https://github.com/airyhq/airy/pull/110)] +- General cleanup of the docs [[#111](https://github.com/airyhq/airy/pull/111)] +- Delete tags endpoint [[#109](https://github.com/airyhq/airy/pull/109)] +- Infra/istio [[#99](https://github.com/airyhq/airy/pull/99)] +- Fix npm publishing [[#108](https://github.com/airyhq/airy/pull/108)] +- Creates /tags.list endpoint [[#105](https://github.com/airyhq/airy/pull/105)] +- Fix target name [[#106](https://github.com/airyhq/airy/pull/106)] +- Publish library on NPM [[#75](https://github.com/airyhq/airy/pull/75)] +- Rm App health checks from streaming apps [[#103](https://github.com/airyhq/airy/pull/103)] +- Creates the /tags.create endpoint [[#102](https://github.com/airyhq/airy/pull/102)] +- Add content mapper library, use content mapper on webhook publisher [[#96](https://github.com/airyhq/airy/pull/96)] +- Adds tags api documentation [[#98](https://github.com/airyhq/airy/pull/98)] +- Add wait-loop instead of sleep [[#97](https://github.com/airyhq/airy/pull/97)] +- Introduce a glossary [[#83](https://github.com/airyhq/airy/pull/83)] +- Images [[#86](https://github.com/airyhq/airy/pull/86)] +- New /users.password-reset endpoint [[#89](https://github.com/airyhq/airy/pull/89)] +- Add webhook consumer [[#88](https://github.com/airyhq/airy/pull/88)] +- Add webhook publisher [[#87](https://github.com/airyhq/airy/pull/87)] +- Enabe authorization [[#85](https://github.com/airyhq/airy/pull/85)] +- Add webhook api [[#84](https://github.com/airyhq/airy/pull/84)] +- Core auth email configuration [[#82](https://github.com/airyhq/airy/pull/82)] +- Fix components deploy [[#81](https://github.com/airyhq/airy/pull/81)] +- Adding Readme to infrastructure [[#80](https://github.com/airyhq/airy/pull/80)] +- Add password reset route [[#79](https://github.com/airyhq/airy/pull/79)] +- Prepare readme for launch [[#77](https://github.com/airyhq/airy/pull/77)] +- Add showcase app deployment [[#73](https://github.com/airyhq/airy/pull/73)] +- Core auth /users.accept-invitation endpoint [[#71](https://github.com/airyhq/airy/pull/71)] +- Some little gardening while reading the code [[#74](https://github.com/airyhq/airy/pull/74)] +- Create Components Library [[#57](https://github.com/airyhq/airy/pull/57)] +- Add login endpoint [[#70](https://github.com/airyhq/airy/pull/70)] +- Core auth create invitations endpoint [[#59](https://github.com/airyhq/airy/pull/59)] +- Add bootstrapping script [[#61](https://github.com/airyhq/airy/pull/61)] +- Add apache license [[#63](https://github.com/airyhq/airy/pull/63)] +- Add signup route with password hashing and jwt creation [[#62](https://github.com/airyhq/airy/pull/62)] +- Websocket docs [[#60](https://github.com/airyhq/airy/pull/60)] +- More design principles content [[#58](https://github.com/airyhq/airy/pull/58)] +- Add core auth app [[#56](https://github.com/airyhq/airy/pull/56)] +- Quick formatting updates to the docs [[#55](https://github.com/airyhq/airy/pull/55)] +- feature/core auth docs [[#53](https://github.com/airyhq/airy/pull/53)] +- Websocket add remaining implementations [[#52](https://github.com/airyhq/airy/pull/52)] +- Feature/streams to websocket [[#41](https://github.com/airyhq/airy/pull/41)] +- Unread count [[#42](https://github.com/airyhq/airy/pull/42)] +- Quick cleanup before next steps [[#40](https://github.com/airyhq/airy/pull/40)] +- Use group by key [[#38](https://github.com/airyhq/airy/pull/38)] +- Add facebook message sender [[#37](https://github.com/airyhq/airy/pull/37)] +- Feature/send message [[#32](https://github.com/airyhq/airy/pull/32)] +- Add delivery states to message [[#35](https://github.com/airyhq/airy/pull/35)] +- Send message requests in the events router [[#33](https://github.com/airyhq/airy/pull/33)] +- Fix the channels test [[#31](https://github.com/airyhq/airy/pull/31)] +- Channels API [[#28](https://github.com/airyhq/airy/pull/28)] +- Reorganize the docs so they can scale better [[#27](https://github.com/airyhq/airy/pull/27)] +- Remove deprecation [[#26](https://github.com/airyhq/airy/pull/26)] +- Upgrade to bazel 3.5.0 [[#25](https://github.com/airyhq/airy/pull/25)] +- More cleanup for test infrastructure [[#24](https://github.com/airyhq/airy/pull/24)] +- Speed up the tests [[#23](https://github.com/airyhq/airy/pull/23)] +- Kafka upgrade [[#22](https://github.com/airyhq/airy/pull/22)] +- Communication API [[#18](https://github.com/airyhq/airy/pull/18)] +- Small cleanups [[#21](https://github.com/airyhq/airy/pull/21)] +- Cleaning up while reading code [[#19](https://github.com/airyhq/airy/pull/19)] +- Ingestion platform draft [[#16](https://github.com/airyhq/airy/pull/16)] +- More docs infrastructure [[#9](https://github.com/airyhq/airy/pull/9)] +- Spell check the README [[#8](https://github.com/airyhq/airy/pull/8)] +- Core README v0 [[#4](https://github.com/airyhq/airy/pull/4)] +- Remove airy docs website from this repository [[#7](https://github.com/airyhq/airy/pull/7)] +- Fix edit url and root title [[#6](https://github.com/airyhq/airy/pull/6)] +- Hugo docs site [[#5](https://github.com/airyhq/airy/pull/5)] +- Setup Bazel dependencies, code formatters and github workflows [[#3](https://github.com/airyhq/airy/pull/3)] +- Basic docs ported from platform [[#2](https://github.com/airyhq/airy/pull/2)] +- Basic structure [[#1](https://github.com/airyhq/airy/pull/1)] + +#### 🐛 Bug Fixes + +- [417] Fix chatplugin chart [[#418](https://github.com/airyhq/airy/pull/418)] +- [[#408](https://github.com/airyhq/airy/issues/408)] Prioritize first apps [[#410](https://github.com/airyhq/airy/pull/410)] +- Generate random strings with helm [[#404](https://github.com/airyhq/airy/pull/404)] +- [[#405](https://github.com/airyhq/airy/issues/405)] Populate delivery state correctly [[#406](https://github.com/airyhq/airy/pull/406)] +- [[#388](https://github.com/airyhq/airy/issues/388)] Chat plugin text render bug fixed [[#392](https://github.com/airyhq/airy/pull/392)] +- [[#386](https://github.com/airyhq/airy/issues/386)] Add missing cors configuration [[#390](https://github.com/airyhq/airy/pull/390)] +- [[#378](https://github.com/airyhq/airy/issues/378)] Fix the code also and not only the docs for channel connection token [[#389](https://github.com/airyhq/airy/pull/389)] +- [[#378](https://github.com/airyhq/airy/issues/378)] Do not require token as most sources do not require it [[#380](https://github.com/airyhq/airy/pull/380)] +- [[#381](https://github.com/airyhq/airy/issues/381)] Classify pull requests as our conventions specify [[#382](https://github.com/airyhq/airy/pull/382)] + +#### 📚 Documentation + +- [415] Add gifs to connecting chatplugin channel documentation [[#419](https://github.com/airyhq/airy/pull/419)] +- Add Vbox known issue [[#409](https://github.com/airyhq/airy/pull/409)] +- [[#344](https://github.com/airyhq/airy/issues/344)] Enable copy\&paste of code snippets [[#391](https://github.com/airyhq/airy/pull/391)] +- Docs/chat plugin [[#383](https://github.com/airyhq/airy/pull/383)] + diff --git a/docs/docs/cli/reference.md b/docs/docs/cli/reference.md index 0a44465172..e15ac30866 100644 --- a/docs/docs/cli/reference.md +++ b/docs/docs/cli/reference.md @@ -3,7 +3,7 @@ title: Command Reference sidebar_label: Reference --- -## Api Login +## Api Login Login into an Airy Core instance @@ -22,14 +22,14 @@ airy api login [flags] #### Options inherited from parent commands ``` - --apihost string Airy Core HTTP API host (default "http://api.airy") + --apihost string Airy Core HTTP API host (default "http://airy.core") --cli-config string config file (default is $HOME/.airy/cli.yaml) ``` *** -## Api Signup +## Api Signup Signs users up in Airy Core @@ -50,14 +50,14 @@ airy api signup [flags] #### Options inherited from parent commands ``` - --apihost string Airy Core HTTP API host (default "http://api.airy") + --apihost string Airy Core HTTP API host (default "http://airy.core") --cli-config string config file (default is $HOME/.airy/cli.yaml) ``` *** -## Config Apply +## Config Apply Applies configuration values from airy.yaml configuration to an Airy Core instance @@ -74,7 +74,7 @@ airy config apply [flags] #### Options inherited from parent commands ``` - --apihost string Airy Core HTTP API host (default "http://api.airy") + --apihost string Airy Core HTTP API host (default "http://airy.core") --cli-config string config file (default is $HOME/.airy/cli.yaml) --config string Configuration file for an Airy Core instance (default "./airy.yaml") --kube-config string Kubernetes config file for the cluster of an Airy Core instance (default "~/.airy/kube.conf") @@ -83,7 +83,7 @@ airy config apply [flags] *** -## Create +## Create Creates an instance of Airy Core @@ -102,14 +102,14 @@ airy create [flags] #### Options inherited from parent commands ``` - --apihost string Airy Core HTTP API host (default "http://api.airy") + --apihost string Airy Core HTTP API host (default "http://airy.core") --cli-config string config file (default is $HOME/.airy/cli.yaml) ``` *** -## Init +## Init Inits your airy configuration @@ -126,14 +126,14 @@ airy init [flags] #### Options inherited from parent commands ``` - --apihost string Airy Core HTTP API host (default "http://api.airy") + --apihost string Airy Core HTTP API host (default "http://airy.core") --cli-config string config file (default is $HOME/.airy/cli.yaml) ``` *** -## Status +## Status Reports the status of an Airy Core instance @@ -150,14 +150,14 @@ airy status [flags] #### Options inherited from parent commands ``` - --apihost string Airy Core HTTP API host (default "http://api.airy") + --apihost string Airy Core HTTP API host (default "http://airy.core") --cli-config string config file (default is $HOME/.airy/cli.yaml) ``` *** -## Ui +## Ui Opens the Airy Core UI in your local browser @@ -174,14 +174,14 @@ airy ui [flags] #### Options inherited from parent commands ``` - --apihost string Airy Core HTTP API host (default "http://api.airy") + --apihost string Airy Core HTTP API host (default "http://airy.core") --cli-config string config file (default is $HOME/.airy/cli.yaml) ``` *** -## Version +## Version Prints version information @@ -198,7 +198,7 @@ airy version [flags] #### Options inherited from parent commands ``` - --apihost string Airy Core HTTP API host (default "http://api.airy") + --apihost string Airy Core HTTP API host (default "http://airy.core") --cli-config string config file (default is $HOME/.airy/cli.yaml) ``` diff --git a/docs/docs/concepts/architecture.md b/docs/docs/concepts/architecture.md index 23906659c5..70f760bfe7 100644 --- a/docs/docs/concepts/architecture.md +++ b/docs/docs/concepts/architecture.md @@ -16,7 +16,7 @@ The `backend` system is a streaming platform. Its role is to: - Manage authentication and authorization features. The `frontend` system contains a demo application and the JavaScript integration -of the [Chat Plugin](sources/chat-plugin.md). +of the [Chat Plugin](sources/chatplugin/overview.md). Having that in mind, these are the docker containers – or the `Airy Components` – which run as part of Airy Core: diff --git a/docs/docs/concepts/release-process.md b/docs/docs/concepts/release-process.md index c12aa240d4..6728ac221c 100644 --- a/docs/docs/concepts/release-process.md +++ b/docs/docs/concepts/release-process.md @@ -11,6 +11,7 @@ timely manner. Here's an outline of the process: - We need a `GITHUB_TOKEN` environment variable with write permission to the org +- We clean up the draft release and name it `x.y.z` - We run `./scripts/release.sh start x.y.z` - Once release days comes, we execute the following steps: - We test our release (`./scripts/bootstrap.sh`) and any @@ -18,7 +19,7 @@ Here's an outline of the process: - Once we're satisfied with the release, we finish the release by running `./scripts/release.sh finish x.y.z` - We update the version string and the sha in the [Homebrew Formula](https://github.com/airyhq/homebrew-airy/blob/main/Formula/cli.rb) for the CLI. - We archive cards in the done column of the [work in progress](https://github.com/airyhq/airy/projects/1) board - - We rename the current draft release to `x.y.z` and publish it + - We publish the draft release - We announce the release! As part of the release process we are also releasing a command line client - the `Airy CLI`. diff --git a/docs/docs/getting-started/installation/production.md b/docs/docs/getting-started/installation/production.md index af7b5fc5be..f4490ff0f8 100644 --- a/docs/docs/getting-started/installation/production.md +++ b/docs/docs/getting-started/installation/production.md @@ -223,13 +223,7 @@ records and apply the Kubernetes manifest: kubectl apply -f infrastructure/helm-chart/templates/ingress.yaml ``` -You must set appropriate `host` attributes in the rules for: - -- API endpoints (defaults to `api.airy`) -- Webhooks endpoints (defaults to `webhooks.airy`) -- Core UI (defaults to `ui.airy`) -- Chat plugin (defaults to `chatplugin.airy`) -- Tools (defaults to `tools.airy`) +You must set appropriate `host` attributes in the rules for the ingress routes. If you are not using Traefik, you can use the `infrastructure/helm-chart/templates/ingress.yaml` file as a guide to create @@ -246,7 +240,7 @@ For more details please see our [Configuration Section](configuration.md). ### AKHQ -AKHQ is a GUI for inspecting Apache Kafka. If enabled, it can be accessed under `http://{TOOLS-HOSTNAME}/akhq`, +AKHQ is a GUI for inspecting Apache Kafka. If enabled, it can be accessed under `http://{TOOLS-HOSTNAME}/tools/akhq`, where {TOOLS-HOSTNAME} is the configured ingress hostname, set in the previous section. Username is `admin` and the auto-generated password can be retrieved from a configMap: diff --git a/docs/docs/getting-started/installation/vagrant.md b/docs/docs/getting-started/installation/vagrant.md index 280cfc1419..e5aee4e012 100644 --- a/docs/docs/getting-started/installation/vagrant.md +++ b/docs/docs/getting-started/installation/vagrant.md @@ -35,14 +35,12 @@ need to install them manually. The script will also ask for your administrative credentials as we are using the [Vagrant Host Manager -Plugin](https://github.com/devopsgroup-io/vagrant-hostmanager) to add entries to -your hosts file. You can skip this step and add the following lines to your +Plugin](https://github.com/devopsgroup-io/vagrant-hostmanager) to add an entry to +your hosts file. You can skip this step and add the following line to your hosts file yourself. ``` -192.168.50.5 ui.airy -192.168.50.5 api.airy -192.168.50.5 chatplugin.airy +192.168.50.5 airy.core ``` After the bootstrap process finishes, it will download the Kubernetes @@ -59,17 +57,17 @@ If you want to customize your `Airy Core` instance please see our [Configuration ## Access the API -The API services are available under the domain `http://api.airy` from your +The API services are available under the domain `http://airy.core` from your local machine. You can see an example request to the API by running the `status` command. ## Access the UI -The UI can be accessed through http://ui.airy. +The UI can be accessed at http://airy.core/ui/. -The frontend UI for the Airy chat plugin can be accessed through -http://chatplugin.airy/example. Refer to [the Airy Live Chat -plugin](/sources/chat-plugin.md) documentation for detailed information. +The frontend UI for the Airy chat plugin can be accessed at +`http://airy.core/chatplugin/example`. Refer to [the Airy Live Chat +plugin](/sources/chatplugin/overview.md) documentation for detailed information. ## Public webhooks @@ -138,7 +136,7 @@ For more details please see our [Configuration Section](configuration.md). ### AKHQ -AKHQ is a GUI for inspecting Apache Kafka. If enabled, it can be accessed under `http://tools.airy/akhq`. +AKHQ is a GUI for inspecting Apache Kafka. If enabled, it can be accessed under `http://airy.core/tools/akhq`. Username is `admin` and the auto-generated password can be retrieved from a configMap: ```sh @@ -184,10 +182,10 @@ ${GOOGLE_WEBHOOK_PUBLIC_URL}/google ${TWILIO_WEBHOOK_PUBLIC_URL}/twilio "You can access the API of Airy Core at:" -"http://api.airy/" +"http://airy.core/" "Example:" -"curl -X POST -H 'Content-Type: application/json' -d '{\"first_name\": \"Grace\",\"last_name\": \"Hopper\",\"password\": \"the_answer_is_42\",\"email\": \"grace@example.com\"}' +"curl -X POST -H 'Content-Type: application/json' -d '{\"first_name\": \"Grace\",\"last_name\": \"Hopper\",\"password\": \"the_answer_is_42\",\"email\": \"grace@example.com\"}' http://airy.core/users.signup ``` To inspect the status of the Vagrant box run: diff --git a/docs/docs/getting-started/quickstart.md b/docs/docs/getting-started/quickstart.md index 760375a472..c3c1caa84d 100644 --- a/docs/docs/getting-started/quickstart.md +++ b/docs/docs/getting-started/quickstart.md @@ -33,23 +33,23 @@ link='/getting-started/installation/introduction' ## Step 1: How to setup your first source -The [Airy Live Chat Plugin](/sources/chat-plugin.md) source is well suited for a +The [Airy Live Chat Plugin](/sources/chatplugin/overview.md) source is well suited for a first integration because it does not require any configuration. Once you [signed up](/api/endpoints/users.md#signup), you must [log in](/api/authentication.md#login) so you can obtain a valid JWT token for the upcoming API calls: -```bash +```sh token=$(echo $(curl -H 'Content-Type: application/json' -d \ "{ \ \"email\":\"grace@example.com\", \ \"password\":\"the_answer_is_42\" \ -}" api.airy/users.login) | jq -r '.token') +}" airy.core/users.login) | jq -r '.token') curl -H "Content-Type: application/json" -H "Authorization: Bearer $token" -d \ "{ \"name\": \"chat plugin source\" -}" api.airy/channels.chatplugin.connect +}" airy.core/channels.chatplugin.connect ``` channels_connect @@ -64,7 +64,7 @@ browser. This authenticates the chat plugin and enables you to send messages immediately: ``` -http://chatplugin.airy/example?channel_id= +http://airy.core/chatplugin/ui/example?channel_id= ``` You can now type a message in the text box and send it 🎉 @@ -81,7 +81,7 @@ created. it should return the message you have just sent. ```bash curl -H "Content-Type: application/json" -H "Authorization: Bearer $token" -d "{}" \ -api.airy/conversations.list | jq . +airy.core/conversations.list | jq . ``` ## Step 4: Consume directly from Apache Kafka diff --git a/docs/docs/integrations/rasa.md b/docs/docs/integrations/rasa.md index 6edae7ecd8..195086707c 100644 --- a/docs/docs/integrations/rasa.md +++ b/docs/docs/integrations/rasa.md @@ -86,14 +86,14 @@ The connector requires the following configuration values: - `auth_token` the Airy Core JWT token you used to connect the webhook. -- `api_host` The url where you host your Airy Core API (`http://api.airy` for a local installation). +- `api_host` The url where you host your Airy Core API (`http://airy.core` for a local installation). Add them to your existing Rasa `credentials.yml`: ```yaml channels.airy.AiryInput: api_host: "your JWT authentication token" - auth_token: "http://api.airy" + auth_token: "http://airy.core" ``` Now you should have a working integration 🎉. diff --git a/docs/docs/sources/chatplugin/customization.md b/docs/docs/sources/chatplugin/customization.md new file mode 100644 index 0000000000..1350aa14cb --- /dev/null +++ b/docs/docs/sources/chatplugin/customization.md @@ -0,0 +1,4 @@ +--- +title: Basic & advanced customization +sidebar_label: Basic & advanced customization +--- diff --git a/docs/docs/sources/chatplugin/demo.md b/docs/docs/sources/chatplugin/demo.md new file mode 100644 index 0000000000..92e4770e18 --- /dev/null +++ b/docs/docs/sources/chatplugin/demo.md @@ -0,0 +1,6 @@ +--- +title: Demo +sidebar_label: Demo +--- + +TODO diff --git a/docs/docs/sources/chatplugin/installation.md b/docs/docs/sources/chatplugin/installation.md new file mode 100644 index 0000000000..66e1735fd6 --- /dev/null +++ b/docs/docs/sources/chatplugin/installation.md @@ -0,0 +1,37 @@ +--- +title: Installation +sidebar_label: Installation +--- + +To install the Chat Plugin UI on your website add the following script tag to +the `` section: + +```html + +``` + +You must replace `CHANNEL_ID` with the channel id obtained when +[connecting](#connecting-a-channel) the source and `SCRIPT_HOST` with the host +of your Chat Plugin server. When using the local vagrant environment +`SCRIPT_HOST` must be set to `airy.core`. + +:::note + +`airy.core` is not publicly accessible. The setup will only work for local web pages. + +::: + +To test the setup, replace the `CHANNEL_ID` in the URL +`http://airy.core/chatplugin/example?channel_id=CHANNEL_ID` and open it in your +browser. diff --git a/docs/docs/sources/chatplugin/overview.md b/docs/docs/sources/chatplugin/overview.md new file mode 100644 index 0000000000..0598646870 --- /dev/null +++ b/docs/docs/sources/chatplugin/overview.md @@ -0,0 +1,60 @@ +--- +title: Overview +sidebar_label: Overview +--- + +import TLDR from "@site/src/components/TLDR"; +import ButtonBox from "@site/src/components/ButtonBox"; +import ButtonBoxList from "@site/src/components/ButtonBoxList"; +import HammerAndWrenchSVG from "@site/static/icons/hammer-and-wrench.svg"; + + + +Airy's Live Chat Plugin is an open-source chat widget that is fully customizable +and included in Airy Core + + + +## Introduction + +Having a Live Chat plugin on your website has become essential. Connect with +your website visitors, communicate with them in real time, or use a bot to +automate FAQs. + +Airy’s Live Chat Plugin comes out of the box fully working, but thanks to its +open-source nature and React Render Props you can customize everything about it. + +Out of the box Airy’s Live Chat Plugin supports: + +- Full customization of look, feel and features +- All message types, including emojis +- Rich Messaging: Templates, cards & carousels + +## How it's build + +The Airy Live Chat Plugin is JavaScript library built with +[preact](https://preactjs.com/)and +[TypeScript](https://www.typescriptlang.org/). + +The library makes heavy use of [render +props](https://reactjs.org/docs/render-props.html) so that you can customize its +behavior in every aspect. The library handles all the +[communication](/api/endpoints/chatplugin.md) with Airy Core transparently for +you. + +## Customization + +Completely customize your Live Chat and make it match your brand: + + + } + title='Learn more about the customization of your Chat Plugin' + description='From colors to shapes and sizes: everything is editable' + link='/sources/chatplugin/customization' +/> + + +## Supported message types + +TODO diff --git a/docs/docs/sources/chatplugin/quickstart.md b/docs/docs/sources/chatplugin/quickstart.md new file mode 100644 index 0000000000..6b07ec9d84 --- /dev/null +++ b/docs/docs/sources/chatplugin/quickstart.md @@ -0,0 +1,99 @@ +--- +title: Quickstart +sidebar_label: Quickstart +--- + +import useBaseUrl from '@docusaurus/useBaseUrl'; +import TLDR from "@site/src/components/TLDR"; +import ButtonBox from "@site/src/components/ButtonBox"; +import RocketSVG from "@site/static/icons/rocket.svg"; + + + +In this Quickstart we are **setting up our first source, listen to +conversations, and consume directly from Kafka** + + + +We are going to use Airy's Live Chat Plugin as our first source. We then use the +plugin to send messages, and check them out in the UI, your terminal and +directly in Apache Kafka. + +- [Step 1: How to setup your first source](#step-1-how-to-setup-your-first-source) +- [Step 2: Send messages via the Chat Plugin](#step-2-send-messages-via-the-chat-plugin) +- [Step 3: Use the HTTP API to list conversations](#step-3-use-the-http-api-to-list-conversations) +- [Step 4: Consume directly from Apache Kafka](#step-4-consume-directly-from-apache-kafka) + + } +title='Did you already install the Airy CLI?' +description='To get going with the Quickstart, you must install Airy first. Once the CLI is up and running you are good to go.' +link='/getting-started/installation/introduction' +/> + +## Step 1: How to setup your first source + +Once you [signed up](/api/endpoints/users.md#signup), you must [log +in](/api/authentication.md#login) so you can obtain a valid JWT token for the +upcoming API calls: + +```sh +token=$(echo $(curl -H 'Content-Type: application/json' -d \ +"{ \ +\"email\":\"grace@example.com\", \ +\"password\":\"the_answer_is_42\" \ +}" airy.core/users.login) | jq -r '.token') +curl -H "Content-Type: application/json" -H "Authorization: Bearer $token" -d \ +"{ + \"name\": \"chat plugin source\" +}" airy.core/channels.chatplugin.connect +``` + +channels_connect + +The ID from the response is the `channel_id`. It is required for +the next steps, so note it down. + +## Step 2: Send messages via the Chat Plugin + +Pass the `channel_id` as a query parameter when opening the demo page in your +browser. This authenticates the chat plugin and enables you to send messages +immediately: + +``` +http://airy.core/chatplugin/ui/example?channel_id= +``` + +You can now type a message in the text box and send it 🎉 + +chatplugin working + +## Step 3: Use the HTTP API to list conversations + +To see how messages are flowing through the system, [list +conversations](/api/endpoints/conversations.md#list) for the channel you have just +created. it should return the message you have just sent. + +conversations.list + +```bash +curl -H "Content-Type: application/json" -H "Authorization: Bearer $token" -d "{}" \ +airy.core/conversations.list | jq . +``` + +## Step 4: Consume directly from Apache Kafka + +You can also consume the messages directly from the Kafka +`application.communication.messages` topic: + +``` +cd infrastructure && vagrant ssh +kubectl exec -it kafka-0 -- /bin/bash +kafka-console-consumer \ +--bootstrap-server airy-cp-kafka:9092 \ +--topic application.communication.messages \ +--from-beginning +``` + +Kafka Topic diff --git a/docs/docs/sources/introduction.md b/docs/docs/sources/introduction.md index 1fc97cb41d..c751d35755 100644 --- a/docs/docs/sources/introduction.md +++ b/docs/docs/sources/introduction.md @@ -30,7 +30,7 @@ Business Messages, and so on). icon={() => } title='Airy Live Chat Plugin' description='The Airy Live Chat Plugin enables conversations with website visitors through a web chat plugin' - link='/sources/chat-plugin' + link='/sources/chatplugin/overview' /> = 0.1.1" @@ -4487,9 +4100,9 @@ events@^1.1.1: integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= events@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379" - integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg== + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== eventsource@^1.0.7: version "1.0.7" @@ -4519,20 +4132,19 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -execa@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-3.4.0.tgz#c08ed4550ef65d858fac269ffc8572446f37eb89" - integrity sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g== +execa@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.0.0.tgz#4029b0007998a841fbd1032e5f4de86a3c1e3376" + integrity sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ== dependencies: - cross-spawn "^7.0.0" - get-stream "^5.0.0" - human-signals "^1.1.1" + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" is-stream "^2.0.0" merge-stream "^2.0.0" - npm-run-path "^4.0.0" - onetime "^5.1.0" - p-finally "^2.0.0" - signal-exit "^3.0.2" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" strip-final-newline "^2.0.0" expand-brackets@^2.1.4: @@ -4548,7 +4160,7 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -express@^4.16.3, express@^4.17.1: +express@^4.17.1: version "4.17.1" resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== @@ -4604,15 +4216,6 @@ extend@^3.0.0: resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -4632,22 +4235,10 @@ fast-deep-equal@^3.1.1: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^2.0.2: - version "2.2.7" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" - integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== - dependencies: - "@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-glob@^3.0.3, fast-glob@^3.1.1, fast-glob@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.4.tgz#d20aefbf99579383e7f3cc66529158c9b98554d3" - integrity sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ== +fast-glob@^3.1.1, fast-glob@^3.2.4: + version "3.2.5" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661" + integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -4669,47 +4260,45 @@ fast-url-parser@1.1.3: punycode "^1.3.2" fastq@^1.6.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.9.0.tgz#e16a72f338eaca48e91b5c23593bcc2ef66b7947" - integrity sha512-i7FVWL8HhVY+CTkwFxkN2mk3h+787ixS5S63eb78diVRc1MCssarHq3W5cj0av7YDSwmaV928RNag+U1etRQ7w== + version "1.11.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.0.tgz#bb9fb955a07130a918eb63c1f5161cc32a5d0858" + integrity sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g== dependencies: reusify "^1.0.4" -faye-websocket@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" - integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ= - dependencies: - websocket-driver ">=0.5.1" - -faye-websocket@~0.11.1: +faye-websocket@^0.11.3: version "0.11.3" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e" integrity sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA== dependencies: websocket-driver ">=0.5.1" -fbemitter@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/fbemitter/-/fbemitter-2.1.1.tgz#523e14fdaf5248805bb02f62efc33be703f51865" - integrity sha1-Uj4U/a9SSIBbsC9i78M75wP1GGU= +fbemitter@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/fbemitter/-/fbemitter-3.0.0.tgz#00b2a1af5411254aab416cd75f9e6289bee4bff3" + integrity sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw== dependencies: - fbjs "^0.8.4" + fbjs "^3.0.0" -fbjs@^0.8.0, fbjs@^0.8.4: - version "0.8.17" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" - integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90= +fbjs-css-vars@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" + integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== + +fbjs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.0.tgz#0907067fb3f57a78f45d95f1eacffcacd623c165" + integrity sha512-dJd4PiDOFuhe7vk4F80Mba83Vr2QuK86FoxtgPmzBqEJahncp+13YCmfoa53KHCo6OnlXLG7eeMWPfB5CrpVKg== dependencies: - core-js "^1.0.0" - isomorphic-fetch "^2.1.1" + cross-fetch "^3.0.4" + fbjs-css-vars "^1.0.0" loose-envify "^1.0.0" object-assign "^4.1.0" promise "^7.1.1" setimmediate "^1.0.5" ua-parser-js "^0.7.18" -feed@^4.2.1: +feed@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/feed/-/feed-4.2.2.tgz#865783ef6ed12579e2c44bbef3c9113bc4956a7e" integrity sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ== @@ -4721,7 +4310,7 @@ figgy-pudding@^3.5.1: resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== -figures@^3.0.0: +figures@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== @@ -4741,15 +4330,10 @@ file-uri-to-path@1.0.0: resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== -filesize@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.0.1.tgz#f850b509909c7c86f7e450ea19006c31c2ed3d2f" - integrity sha512-u4AYWPgbI5GBhs6id1KdImZWn5yfyFrrQ8OWZdN7ZMfA8Bf4HcO0BGo9bmUIEV8yrp8I1xVfJ/dn90GtFNNJcg== - -filesize@^3.6.1: - version "3.6.1" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" - integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== +filesize@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.1.0.tgz#e81bdaa780e2451d714d71c0d7a4f3238d37ad00" + integrity sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg== fill-range@^4.0.0: version "4.0.0" @@ -4827,49 +4411,31 @@ flush-write-stream@^1.0.0: inherits "^2.0.3" readable-stream "^2.3.6" -flux@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/flux/-/flux-3.1.3.tgz#d23bed515a79a22d933ab53ab4ada19d05b2f08a" - integrity sha1-0jvtUVp5oi2TOrU6tK2hnQWy8Io= +flux@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/flux/-/flux-4.0.1.tgz#7843502b02841d4aaa534af0b373034a1f75ee5c" + integrity sha512-emk4RCvJ8RzNP2lNpphKnG7r18q8elDYNAPx7xn+bDeOIo9FFfxEfIQ2y6YbQNmnsGD3nH1noxtLE64Puz1bRQ== dependencies: - fbemitter "^2.0.0" - fbjs "^0.8.0" + fbemitter "^3.0.0" + fbjs "^3.0.0" -follow-redirects@^1.0.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.0.tgz#b42e8d93a2a7eea5ed88633676d6597bc8e384db" - integrity sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA== +follow-redirects@^1.0.0, follow-redirects@^1.10.0: + version "1.13.3" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.3.tgz#e5598ad50174c1bc4e872301e82ac2cd97f90267" + integrity sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA== -follow-redirects@^1.10.0: - version "1.13.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.2.tgz#dd73c8effc12728ba5cf4259d760ea5fb83e3147" - integrity sha512-6mPTgLxYm3r6Bkkg0vNM0HTjfGrOEtsfbhagQvbxDEsEkpNhw582upBaoRZylzen6krEmxXJgt9Ju6HiI4O7BA== - -for-in@^0.1.3: - version "0.1.8" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" - integrity sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE= - -for-in@^1.0.1, for-in@^1.0.2: +for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= -for-own@^0.1.3: - version "0.1.5" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= - dependencies: - for-in "^1.0.1" - -fork-ts-checker-webpack-plugin@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-3.1.1.tgz#a1642c0d3e65f50c2cc1742e9c0a80f441f86b19" - integrity sha512-DuVkPNrM12jR41KM2e+N+styka0EgLkTnXmNcXdgOM37vtGeY+oCBK/Jx0hzSeEU6memFCtWb4htrHPMDfwwUQ== +fork-ts-checker-webpack-plugin@4.1.6: + version "4.1.6" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz#5055c703febcf37fa06405d400c122b905167fc5" + integrity sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw== dependencies: - babel-code-frame "^6.22.0" + "@babel/code-frame" "^7.5.5" chalk "^2.4.1" - chokidar "^3.3.0" micromatch "^3.1.10" minimatch "^3.0.4" semver "^5.6.0" @@ -4881,6 +4447,11 @@ forwarded@~0.1.2: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= +fraction.js@^4.0.13: + version "4.0.13" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.0.13.tgz#3c1c315fa16b35c85fffa95725a36fa729c69dfe" + integrity sha512-E1fz2Xs9ltlUp+qbiyx9wmt2n9dRzPsS11Jtdb8D2o+cC7wr9xkkKsVKJuBX0ST+LVS+LhLO+SbLJNtfWcJvXA== + fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" @@ -4901,7 +4472,7 @@ from2@^2.1.0: inherits "^2.0.1" readable-stream "^2.0.0" -fs-extra@^9.0.1: +fs-extra@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== @@ -4941,22 +4512,17 @@ fsevents@^1.2.7: bindings "^1.5.0" nan "^2.12.1" -fsevents@~2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" - integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== - fsevents@~2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.1.tgz#b209ab14c61012636c8863507edf7fb68cc54e9f" - integrity sha512-YR47Eg4hChJGAB1O3yEAOkGO+rlzutoICGqGo9EZ4lKWokzZRSyIW1QmTzqjtw8MJdj9srP869CuWw/hyzSiBw== + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -gensync@^1.0.0-beta.1: +gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== @@ -4966,10 +4532,10 @@ get-caller-file@^2.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.0.1.tgz#94a9768fcbdd0595a1c9273aacf4c89d075631be" - integrity sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== dependencies: function-bind "^1.1.1" has "^1.0.3" @@ -4987,13 +4553,18 @@ get-stream@^4.0.0, get-stream@^4.1.0: dependencies: pump "^3.0.0" -get-stream@^5.0.0, get-stream@^5.1.0: +get-stream@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== dependencies: pump "^3.0.0" +get-stream@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.0.tgz#3e0012cb6827319da2706e601a1583e8629a6718" + integrity sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg== + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -5015,18 +4586,13 @@ glob-parent@^3.1.0: path-dirname "^1.0.0" glob-parent@^5.1.0, glob-parent@^5.1.1, glob-parent@~5.1.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" - integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" -glob-to-regexp@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" - integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= - -glob@^7.0.0, glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: +glob@^7.0.0, glob@^7.0.3, glob@^7.1.3, glob@^7.1.4: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -5038,12 +4604,12 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" -global-dirs@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.0.1.tgz#acdf3bb6685bcd55cb35e8a052266569e9469201" - integrity sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A== +global-dirs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686" + integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== dependencies: - ini "^1.3.5" + ini "2.0.0" global-modules@2.0.0: version "2.0.0" @@ -5066,37 +4632,22 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globby@8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.2.tgz#5697619ccd95c5275dbb2d6faa42087c1a941d8d" - integrity sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w== - dependencies: - array-union "^1.0.1" - dir-glob "2.0.0" - fast-glob "^2.0.2" - glob "^7.1.2" - ignore "^3.3.5" - pify "^3.0.0" - slash "^1.0.0" - -globby@^10.0.1: - version "10.0.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543" - integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg== +globby@11.0.1: + version "11.0.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" + integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== dependencies: - "@types/glob" "^7.1.1" array-union "^2.1.0" dir-glob "^3.0.1" - fast-glob "^3.0.3" - glob "^7.1.3" - ignore "^5.1.1" - merge2 "^1.2.3" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" slash "^3.0.0" -globby@^11.0.1: - version "11.0.1" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" - integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== +globby@^11.0.1, globby@^11.0.2: + version "11.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.2.tgz#1af538b766a3b540ebfb58a32b2e2d5897321d83" + integrity sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og== dependencies: array-union "^2.1.0" dir-glob "^3.0.1" @@ -5140,10 +4691,10 @@ got@^9.6.0: to-readable-stream "^1.0.0" url-parse-lax "^3.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2: - version "4.2.4" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" - integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: + version "4.2.6" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" + integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== gray-matter@^4.0.2: version "4.0.2" @@ -5155,7 +4706,7 @@ gray-matter@^4.0.2: section-matter "^1.0.0" strip-bom-string "^1.0.0" -gzip-size@5.1.1, gzip-size@^5.0.0: +gzip-size@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA== @@ -5163,17 +4714,22 @@ gzip-size@5.1.1, gzip-size@^5.0.0: duplexer "^0.1.1" pify "^4.0.1" +gzip-size@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" + integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== + dependencies: + duplexer "^0.1.2" + handle-thing@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= - dependencies: - ansi-regex "^2.0.0" +has-bigints@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== has-flag@^3.0.0: version "3.0.0" @@ -5185,10 +4741,10 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-symbols@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" - integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== +has-symbols@^1.0.0, has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== has-value@^0.3.1: version "0.3.1" @@ -5377,11 +4933,6 @@ hoist-non-react-statics@^3.1.0: dependencies: react-is "^16.7.0" -hoopy@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" - integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== - hpack.js@^2.1.6: version "2.1.6" resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" @@ -5408,9 +4959,9 @@ html-comment-regex@^1.1.0: integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== html-entities@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.3.1.tgz#fb9a1a4b5b14c5daba82d3e34c6ae4fe701a0e44" - integrity sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA== + version "1.4.0" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" + integrity sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA== html-minifier-terser@^5.0.1, html-minifier-terser@^5.1.1: version "5.1.1" @@ -5436,9 +4987,9 @@ html-void-elements@^1.0.0: integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w== html-webpack-plugin@^4.5.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.5.1.tgz#40aaf1b5cb78f2f23a83333999625c20929cda65" - integrity sha512-yzK7RQZwv9xB+pcdHNTjcqbaaDZ+5L0zJHXfi89iWIZmb/FtzxhLk0635rmJihcQbs3ZUF27Xp4oWGx6EK56zg== + version "4.5.2" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.5.2.tgz#76fc83fa1a0f12dd5f7da0404a54e2699666bc12" + integrity sha512-q5oYdzjKUIPQVjOosjgvCHQOv9Ett9CYYHlgvJeXG0qQvdSojnBq4vAdQBwn1+yGveAwHCoe/rMR86ozX3+c2A== dependencies: "@types/html-minifier-terser" "^5.0.0" "@types/tapable" "^1.0.5" @@ -5450,7 +5001,7 @@ html-webpack-plugin@^4.5.0: tapable "^1.1.3" util.promisify "1.0.0" -htmlparser2@^3.3.0, htmlparser2@^3.9.1: +htmlparser2@^3.10.1, htmlparser2@^3.9.1: version "3.10.1" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== @@ -5505,9 +5056,9 @@ http-errors@~1.7.2: toidentifier "1.0.0" http-parser-js@>=0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.2.tgz#da2e31d237b393aae72ace43882dd7e270a8ff77" - integrity sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ== + version "0.5.3" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.3.tgz#01d2709c79d41698bb01d4decc5e9da4e4a033d9" + integrity sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg== http-proxy-middleware@0.19.1: version "0.19.1" @@ -5533,31 +5084,22 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= -human-signals@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" - integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -iconv-lite@0.4.24, iconv-lite@^0.4.24: +iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01" - integrity sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -icss-utils@^4.0.0, icss-utils@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" - integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== - dependencies: - postcss "^7.0.14" +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== ieee754@^1.1.4: version "1.2.1" @@ -5569,27 +5111,15 @@ iferr@^0.1.5: resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= -ignore@^3.3.5: - version "3.3.10" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" - integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== - -ignore@^5.1.1, ignore@^5.1.4: +ignore@^5.1.4: version "5.1.8" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== -immer@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/immer/-/immer-1.10.0.tgz#bad67605ba9c810275d91e1c2a47d4582e98286d" - integrity sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg== - -import-cwd@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" - integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk= - dependencies: - import-from "^2.1.0" +immer@8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/immer/-/immer-8.0.1.tgz#9c73db683e2b3975c424fb0572af5889877ae656" + integrity sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA== import-fresh@^2.0.0: version "2.0.0" @@ -5599,15 +5129,7 @@ import-fresh@^2.0.0: caller-path "^2.0.0" resolve-from "^3.0.0" -import-fresh@^3.1.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.2.tgz#fc129c160c5d68235507f4331a6baad186bdbc3e" - integrity sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-fresh@^3.2.2: +import-fresh@^3.2.1, import-fresh@^3.2.2, import-fresh@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -5615,13 +5137,6 @@ import-fresh@^3.2.2: parent-module "^1.0.0" resolve-from "^4.0.0" -import-from@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" - integrity sha1-M1238qev/VOqpHHUuAId7ja387E= - dependencies: - resolve-from "^3.0.0" - import-lazy@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" @@ -5655,10 +5170,10 @@ infer-owner@^1.0.3, infer-owner@^1.0.4: resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== -infima@0.2.0-alpha.18: - version "0.2.0-alpha.18" - resolved "https://registry.yarnpkg.com/infima/-/infima-0.2.0-alpha.18.tgz#8ac62711f13ef99b1f4a45b3ac14571722a2ccf6" - integrity sha512-ndSEffXzjgM/eiSm5jpLTX6ON9MmylzxqBnV2bTiC3kCSyDYdvzTs+bSwf+C4TWayuqnRTnBK1JUePo3m6Bnfg== +infima@0.2.0-alpha.20: + version "0.2.0-alpha.20" + resolved "https://registry.yarnpkg.com/infima/-/infima-0.2.0-alpha.20.tgz#e99f70095e8d16a3333b561772eb9bf891211d3f" + integrity sha512-HSAyIW4/iMq85dJC8PircFA530yEsxqSK/3lXjhSZY+4dms84Izi6sKGdl5V0mDxVaikjAt1oexITtj8T4B0KQ== inflight@^1.0.4: version "1.0.6" @@ -5683,54 +5198,21 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= +ini@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + ini@^1.3.5, ini@~1.3.0: - version "1.3.7" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84" - integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ== + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== inline-style-parser@0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== -inquirer@7.0.4: - version "7.0.4" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.4.tgz#99af5bde47153abca23f5c7fc30db247f39da703" - integrity sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ== - dependencies: - ansi-escapes "^4.2.1" - chalk "^2.4.2" - cli-cursor "^3.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.15" - mute-stream "0.0.8" - run-async "^2.2.0" - rxjs "^6.5.3" - string-width "^4.1.0" - strip-ansi "^5.1.0" - through "^2.3.6" - -inquirer@^7.2.0: - version "7.3.3" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" - integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.19" - mute-stream "0.0.8" - run-async "^2.4.0" - rxjs "^6.6.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - internal-ip@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" @@ -5744,6 +5226,16 @@ interpret@^1.0.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== +intl-locales-supported@^1.8.12: + version "1.8.12" + resolved "https://registry.yarnpkg.com/intl-locales-supported/-/intl-locales-supported-1.8.12.tgz#bbd83475a1cda61dc026309ca61f64c450af8ccb" + integrity sha512-FJPl7p1LYO/C+LpwlDcvVpq7AeFTdFgwnq1JjdNYKjb51xkIxssXRR8LaA0fJFogjwRRztqw1ahgSJMSZsSFdw== + +intl@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/intl/-/intl-1.2.5.tgz#82244a2190c4e419f8371f5aa34daa3420e2abde" + integrity sha1-giRKIZDE5Bn4Nx9ao02qNCDiq94= + ip-regex@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" @@ -5797,9 +5289,11 @@ is-alphanumerical@^1.0.0: is-decimal "^1.0.0" is-arguments@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" - integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.0.tgz#62353031dfbee07ceb34656a6bde59efecae8dd9" + integrity sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg== + dependencies: + call-bind "^1.0.0" is-arrayish@^0.2.1: version "0.2.1" @@ -5811,6 +5305,11 @@ is-arrayish@^0.3.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== +is-bigint@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.1.tgz#6923051dfcbc764278540b9ce0e6b3213aa5ebc2" + integrity sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg== + is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" @@ -5825,20 +5324,27 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-buffer@^1.0.2, is-buffer@^1.1.5: +is-boolean-object@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.0.tgz#e2aaad3a3a8fca34c28f6eee135b156ed2587ff0" + integrity sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA== + dependencies: + call-bind "^1.0.0" + +is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== is-buffer@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" - integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== -is-callable@^1.1.4, is-callable@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" - integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA== +is-callable@^1.1.4, is-callable@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" + integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== is-ci@^2.0.0: version "2.0.0" @@ -5859,10 +5365,10 @@ is-color-stop@^1.0.0: rgb-regex "^1.0.1" rgba-regex "^1.0.0" -is-core-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.0.0.tgz#58531b70aed1db7c0e8d4eb1a0a2d1ddd64bd12d" - integrity sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw== +is-core-module@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" + integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== dependencies: has "^1.0.3" @@ -5964,23 +5470,28 @@ is-hexadecimal@^1.0.0: resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== -is-installed-globally@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.3.2.tgz#fd3efa79ee670d1187233182d5b0a1dd00313141" - integrity sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g== +is-installed-globally@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== dependencies: - global-dirs "^2.0.1" - is-path-inside "^3.0.1" + global-dirs "^3.0.0" + is-path-inside "^3.0.2" -is-negative-zero@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.0.tgz#9553b121b0fac28869da9ed459e20c7543788461" - integrity sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE= +is-negative-zero@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== -is-npm@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-4.0.0.tgz#c90dd8380696df87a7a6d823c20d0b12bbe3c84d" - integrity sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig== +is-npm@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" + integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== + +is-number-object@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197" + integrity sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw== is-number@^3.0.0: version "3.0.0" @@ -6023,10 +5534,10 @@ is-path-inside@^2.1.0: dependencies: path-is-inside "^1.0.2" -is-path-inside@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017" - integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg== +is-path-inside@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== is-plain-obj@^1.0.0: version "1.1.0" @@ -6038,18 +5549,19 @@ is-plain-obj@^2.0.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== -is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: +is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" -is-regex@^1.0.4, is-regex@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" - integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== +is-regex@^1.0.4, is-regex@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.2.tgz#81c8ebde4db142f2cf1c53fc86d6a45788266251" + integrity sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg== dependencies: + call-bind "^1.0.2" has-symbols "^1.0.1" is-regexp@^1.0.0: @@ -6067,7 +5579,7 @@ is-root@2.1.0, is-root@^2.1.0: resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== -is-stream@^1.0.1, is-stream@^1.1.0: +is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= @@ -6077,6 +5589,11 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== +is-string@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" + integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== + is-svg@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" @@ -6084,7 +5601,7 @@ is-svg@^3.0.0: dependencies: html-comment-regex "^1.1.0" -is-symbol@^1.0.2: +is-symbol@^1.0.2, is-symbol@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== @@ -6155,14 +5672,6 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= -isomorphic-fetch@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" - integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk= - dependencies: - node-fetch "^1.0.1" - whatwg-fetch ">=0.10.0" - jest-worker@^26.5.0: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" @@ -6172,10 +5681,10 @@ jest-worker@^26.5.0: merge-stream "^2.0.0" supports-color "^7.0.0" -joi@^17.2.1, joi@^17.3.0: - version "17.3.0" - resolved "https://registry.yarnpkg.com/joi/-/joi-17.3.0.tgz#f1be4a6ce29bc1716665819ac361dfa139fff5d2" - integrity sha512-Qh5gdU6niuYbUIUV5ejbsMiiFmBdw8Kcp8Buj2JntszCkCfxJ9Cz76OtHxOZMPXrt5810iDIXs+n1nNVoquHgg== +joi@^17.3.0, joi@^17.4.0: + version "17.4.0" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.4.0.tgz#b5c2277c8519e016316e49ababd41a1908d9ef20" + integrity sha512-F4WiW2xaV6wc1jxete70Rw4V/VuMd6IN+a5ilZsxG4uYtUXWu2kq9W5P2dz30e7Gmw8RCbY/u/uk+dMPma9tAg== dependencies: "@hapi/hoek" "^9.0.0" "@hapi/topo" "^5.0.0" @@ -6188,15 +5697,10 @@ joi@^17.2.1, joi@^17.3.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= - js-yaml@^3.11.0, js-yaml@^3.13.1: - version "3.14.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" - integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -6231,7 +5735,7 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== -json3@^3.3.2: +json3@^3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== @@ -6244,9 +5748,9 @@ json5@^1.0.1: minimist "^1.2.0" json5@^2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" - integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== dependencies: minimist "^1.2.5" @@ -6271,13 +5775,6 @@ killable@^1.0.1: resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== -kind-of@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-2.0.1.tgz#018ec7a4ce7e3a86cb9141be519d24c8faa981b5" - integrity sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU= - dependencies: - is-buffer "^1.0.2" - kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -6302,6 +5799,16 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +klona@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.4.tgz#7bb1e3affb0cb8624547ef7e8f6708ea2e39dfc0" + integrity sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA== + last-call-webpack-plugin@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" @@ -6310,23 +5817,13 @@ last-call-webpack-plugin@^3.0.0: lodash "^4.17.5" webpack-sources "^1.1.0" -latest-version@^5.0.0: +latest-version@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== dependencies: package-json "^6.3.0" -lazy-cache@^0.2.3: - version "0.2.7" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-0.2.7.tgz#7feddf2dcb6edb77d11ef1d117ab5ffdf0ab1b65" - integrity sha1-f+3fLctu23fRHvHRF6tf/fCrG2U= - -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= - leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -6342,32 +5839,23 @@ loader-runner@^2.4.0: resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== -loader-utils@1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" - integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== - dependencies: - big.js "^5.2.2" - emojis-list "^2.0.0" - json5 "^1.0.1" - -loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" - integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== +loader-utils@2.0.0, loader-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" + integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== dependencies: big.js "^5.2.2" emojis-list "^3.0.0" - json5 "^1.0.1" + json5 "^2.1.2" -loader-utils@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" - integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== +loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== dependencies: big.js "^5.2.2" emojis-list "^3.0.0" - json5 "^2.1.2" + json5 "^1.0.1" locate-path@^3.0.0: version "3.0.0" @@ -6399,21 +5887,16 @@ lodash.bind@^4.1.4: resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35" integrity sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU= -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= - -lodash.chunk@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.chunk/-/lodash.chunk-4.2.0.tgz#66e5ce1f76ed27b4303d8c6512e8d1216e8106bc" - integrity sha1-ZuXOH3btJ7QwPYxlEujRIW6BBrw= - lodash.curry@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.curry/-/lodash.curry-4.1.1.tgz#248e36072ede906501d75966200a86dab8b23170" integrity sha1-JI42By7ekGUB11lmIAqG2riyMXA= +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + lodash.defaults@^4.0.1: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" @@ -6424,11 +5907,6 @@ lodash.filter@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace" integrity sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4= -lodash.flatmap@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.flatmap/-/lodash.flatmap-4.5.0.tgz#ef8cbf408f6e48268663345305c6acc0b778702e" - integrity sha1-74y/QI9uSCaGYzRTBcaswLd4cC4= - lodash.flatten@^4.2.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" @@ -6444,31 +5922,6 @@ lodash.foreach@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" integrity sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM= -lodash.groupby@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.groupby/-/lodash.groupby-4.6.0.tgz#0b08a1dcf68397c397855c3239783832df7403d1" - integrity sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E= - -lodash.has@^4.5.2: - version "4.5.2" - resolved "https://registry.yarnpkg.com/lodash.has/-/lodash.has-4.5.2.tgz#d19f4dc1095058cccbe2b0cdf4ee0fe4aa37c862" - integrity sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI= - -lodash.isplainobject@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= - -lodash.isstring@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" - integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= - -lodash.kebabcase@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" - integrity sha1-hImxyw0p/4gZXM7KRI/21swpXDY= - lodash.map@^4.4.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" @@ -6484,21 +5937,11 @@ lodash.merge@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash.padstart@^4.6.1: - version "4.6.1" - resolved "https://registry.yarnpkg.com/lodash.padstart/-/lodash.padstart-4.6.1.tgz#d2e3eebff0d9d39ad50f5cbd1b52a7bce6bb611b" - integrity sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs= - -lodash.pick@^4.2.1, lodash.pick@^4.4.0: +lodash.pick@^4.2.1: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM= -lodash.pickby@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.pickby/-/lodash.pickby-4.6.0.tgz#7dea21d8c18d7703a27c704c15d3b84a67e33aff" - integrity sha1-feoh2MGNdwOifHBMFdO4SmfjOv8= - lodash.reduce@^4.4.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b" @@ -6514,11 +5957,6 @@ lodash.some@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0= -lodash.sortby@^4.6.0, lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= - lodash.template@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" @@ -6545,14 +5983,14 @@ lodash.uniq@4.5.0, lodash.uniq@^4.5.0: integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.5: - version "4.17.20" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" - integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== loglevel@^1.6.8: - version "1.7.0" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.0.tgz#728166855a740d59d38db01cf46f042caa041bb0" - integrity sha512-i2sY04nal5jDcagM3FMfG++T69GEEM8CYuOfeOIvmXzOIcwE9a/CJPR0MFM97pYMj/u10lzz7/zd7+qwhrBTqQ== + version "1.7.1" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" + integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: version "1.4.0" @@ -6561,12 +5999,12 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3 dependencies: js-tokens "^3.0.0 || ^4.0.0" -lower-case@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.1.tgz#39eeb36e396115cc05e29422eaea9e692c9408c7" - integrity sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ== +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== dependencies: - tslib "^1.10.0" + tslib "^2.0.3" lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: version "1.0.1" @@ -6661,15 +6099,15 @@ mdast-util-to-hast@10.0.1: unist-util-position "^3.0.0" unist-util-visit "^2.0.0" -mdast-util-to-string@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz#27055500103f51637bd07d01da01eb1967a43527" - integrity sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A== +mdast-util-to-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" + integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== -mdn-data@2.0.12: - version "2.0.12" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.12.tgz#bbb658d08b38f574bbb88f7b83703defdcc46844" - integrity sha512-ULbAlgzVb8IqZ0Hsxm6hHSlQl3Jckst2YEQS7fODu9ilNWy2LvcoSY7TRFIktABP2mdppBioc66va90T+NUs8Q== +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== mdn-data@2.0.4: version "2.0.4" @@ -6707,15 +6145,6 @@ memory-fs@^0.5.0: errno "^0.1.3" readable-stream "^2.0.1" -merge-deep@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/merge-deep/-/merge-deep-3.0.2.tgz#f39fa100a4f1bd34ff29f7d2bf4508fbb8d83ad2" - integrity sha512-T7qC8kg4Zoti1cFd8Cr0M+qaZfOwjlPDEdZIIPPB2JZctjaPM4fX+i7HOId69tAti2fvO6X5ldfYUONDODsrkA== - dependencies: - arr-union "^3.1.0" - clone-deep "^0.2.4" - kind-of "^3.0.2" - merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -6726,7 +6155,7 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -merge2@^1.2.3, merge2@^1.3.0: +merge2@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== @@ -6776,15 +6205,10 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.44.0: - version "1.44.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" - integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== - -"mime-db@>= 1.43.0 < 2": - version "1.45.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea" - integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w== +mime-db@1.46.0, "mime-db@>= 1.43.0 < 2": + version "1.46.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.46.0.tgz#6267748a7f799594de3cbc8cde91def349661cee" + integrity sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ== mime-db@~1.33.0: version "1.33.0" @@ -6799,21 +6223,21 @@ mime-types@2.1.18: mime-db "~1.33.0" mime-types@^2.1.27, mime-types@~2.1.17, mime-types@~2.1.24: - version "2.1.27" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" - integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== + version "2.1.29" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.29.tgz#1d4ab77da64b91f5f72489df29236563754bb1b2" + integrity sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ== dependencies: - mime-db "1.44.0" + mime-db "1.46.0" mime@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mime@^2.4.4: - version "2.4.6" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.6.tgz#e5b407c90db442f2beb5b162373d07b69affa4d1" - integrity sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA== +mime@^2.3.1, mime@^2.4.4: + version "2.5.2" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe" + integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg== mimic-fn@^2.1.0: version "2.1.0" @@ -6925,14 +6349,6 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mixin-object@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" - integrity sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4= - dependencies: - for-in "^0.1.3" - is-extendable "^0.1.1" - mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" @@ -6945,6 +6361,11 @@ mkdirp@^1.0.3, mkdirp@^1.0.4: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== +module-alias@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/module-alias/-/module-alias-2.2.2.tgz#151cdcecc24e25739ff0aa6e51e1c5716974c0e0" + integrity sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q== + move-concurrently@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" @@ -6967,11 +6388,16 @@ ms@2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== -ms@2.1.2, ms@^2.1.1: +ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + multicast-dns-service-types@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" @@ -6985,16 +6411,16 @@ multicast-dns@^6.0.1: dns-packet "^1.3.1" thunky "^1.0.2" -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - nan@^2.12.1: version "2.14.2" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== +nanoid@^3.1.20: + version "3.1.20" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788" + integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== + nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -7027,13 +6453,13 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -no-case@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.3.tgz#c21b434c1ffe48b39087e86cfb4d2582e9df18f8" - integrity sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw== +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== dependencies: - lower-case "^2.0.1" - tslib "^1.10.0" + lower-case "^2.0.2" + tslib "^2.0.3" node-emoji@^1.10.0: version "1.10.0" @@ -7042,13 +6468,10 @@ node-emoji@^1.10.0: dependencies: lodash.toarray "^4.4.0" -node-fetch@^1.0.1: - version "1.7.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" - integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== - dependencies: - encoding "^0.1.11" - is-stream "^1.0.1" +node-fetch@2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== node-forge@^0.10.0: version "0.10.0" @@ -7084,15 +6507,10 @@ node-libs-browser@^2.2.1: util "^0.11.0" vm-browserify "^1.0.1" -node-releases@^1.1.52, node-releases@^1.1.65: - version "1.1.65" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.65.tgz#52d9579176bd60f23eba05c4438583f341944b81" - integrity sha512-YpzJOe2WFIW0V4ZkJQd/DGR/zdVwc/pI4Nl1CZrBO19FdRcSTmsuhdttw9rsTzzJLrNcSloLiBbEYx1C4f6gpA== - -node-releases@^1.1.70: - version "1.1.70" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.70.tgz#66e0ed0273aa65666d7fe78febe7634875426a08" - integrity sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw== +node-releases@^1.1.61, node-releases@^1.1.70: + version "1.1.71" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" + integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== normalize-path@^2.1.1: version "2.1.1" @@ -7138,7 +6556,7 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -npm-run-path@^4.0.0: +npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== @@ -7157,13 +6575,13 @@ nth-check@^1.0.2, nth-check@~1.0.1: dependencies: boolbase "~1.0.0" -null-loader@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/null-loader/-/null-loader-3.0.0.tgz#3e2b6c663c5bda8c73a54357d8fa0708dc61b245" - integrity sha512-hf5sNLl8xdRho4UPBOOeoIwT3WhjYcMUQm0zj44EhD6UscMAz72o2udpoDFBgykucdEDGIcd6SXbc/G6zssbzw== +null-loader@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/null-loader/-/null-loader-4.0.1.tgz#8e63bd3a2dd3c64236a4679428632edd0a6dbc6a" + integrity sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg== dependencies: - loader-utils "^1.2.3" - schema-utils "^1.0.0" + loader-utils "^2.0.0" + schema-utils "^3.0.0" num2fraction@^1.2.2: version "1.2.2" @@ -7184,18 +6602,18 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" - integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== +object-inspect@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" + integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== object-is@^1.0.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.3.tgz#2e3b9e65560137455ee3bd62aec4d90a2ea1cc81" - integrity sha512-teyqLvFWzLkq5B9ki8FVWA902UER2qkxmdA4nLf+wjOLAWgxzCWZNCxpDq9MvE8MmhWNr+I8w3BN49Vx36Y6Xg== + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" @@ -7209,7 +6627,7 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.1.0, object.assign@^4.1.1: +object.assign@^4.1.0, object.assign@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== @@ -7220,12 +6638,13 @@ object.assign@^4.1.0, object.assign@^4.1.1: object-keys "^1.1.1" object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" - integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== + version "2.1.2" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz#1bd63aeacf0d5d2d2f31b5e393b03a7c601a23f7" + integrity sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" + es-abstract "^1.18.0-next.2" object.pick@^1.3.0: version "1.3.0" @@ -7235,13 +6654,13 @@ object.pick@^1.3.0: isobject "^3.0.1" object.values@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" - integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== + version "1.1.3" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.3.tgz#eaa8b1e17589f02f698db093f7c62ee1699742ee" + integrity sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" + es-abstract "^1.18.0-next.2" has "^1.0.3" obuf@^1.0.0, obuf@^1.1.2: @@ -7268,7 +6687,7 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -onetime@^5.1.0: +onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== @@ -7276,14 +6695,14 @@ onetime@^5.1.0: mimic-fn "^2.1.0" open@^7.0.2: - version "7.3.0" - resolved "https://registry.yarnpkg.com/open/-/open-7.3.0.tgz#45461fdee46444f3645b6e14eb3ca94b82e1be69" - integrity sha512-mgLwQIx2F/ye9SmbrUkurZCnkoXyXyu9EbHtJZrICjVAJfyMArdHp3KkixGdZx1ZHFPNIwl0DDM1dFFqXbTLZw== + version "7.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" + integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== dependencies: is-docker "^2.0.0" is-wsl "^2.1.1" -opener@^1.5.1: +opener@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== @@ -7315,11 +6734,6 @@ os-browserify@^0.3.0: resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - p-cancelable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" @@ -7330,11 +6744,6 @@ p-finally@^1.0.0: resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= -p-finally@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" - integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== - p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -7343,11 +6752,11 @@ p-limit@^2.0.0, p-limit@^2.2.0: p-try "^2.0.0" p-limit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.0.2.tgz#1664e010af3cadc681baafd3e2a437be7b0fb5fe" - integrity sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg== + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: - p-try "^2.0.0" + yocto-queue "^0.1.0" p-locate@^3.0.0: version "3.0.0" @@ -7368,13 +6777,6 @@ p-map@^2.0.0: resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== -p-map@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" - integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== - dependencies: - aggregate-error "^3.0.0" - p-map@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" @@ -7419,12 +6821,12 @@ parallel-transform@^1.1.0: readable-stream "^2.1.5" param-case@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.3.tgz#4be41f8399eff621c56eebb829a5e451d9801238" - integrity sha512-VWBVyimc1+QrzappRs7waeN2YmoZFCGXWASRYX1/rGHtXqEcrGEIDm+jqIwFa2fRXNgQEwrxaYuIrX0WcAguTA== + version "3.0.4" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== dependencies: - dot-case "^3.0.3" - tslib "^1.10.0" + dot-case "^3.0.4" + tslib "^2.0.3" parent-module@^1.0.0: version "1.0.1" @@ -7465,9 +6867,9 @@ parse-json@^4.0.0: json-parse-better-errors "^1.0.1" parse-json@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.1.0.tgz#f96088cdf24a8faa9aea9a009f2d9d942c999646" - integrity sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ== + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" error-ex "^1.3.1" @@ -7494,13 +6896,13 @@ parseurl@~1.3.2, parseurl@~1.3.3: resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== -pascal-case@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.1.tgz#5ac1975133ed619281e88920973d2cd1f279de5f" - integrity sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA== +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== dependencies: - no-case "^3.0.3" - tslib "^1.10.0" + no-case "^3.0.4" + tslib "^2.0.3" pascalcase@^0.1.1: version "0.1.1" @@ -7569,13 +6971,6 @@ path-to-regexp@^1.7.0: dependencies: isarray "0.0.1" -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - dependencies: - pify "^3.0.0" - path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" @@ -7602,11 +6997,6 @@ pify@^2.0.0: resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= - pify@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" @@ -7638,7 +7028,7 @@ pkg-dir@^4.1.0: dependencies: find-up "^4.0.0" -pkg-up@3.1.0, pkg-up@^3.1.0: +pkg-up@3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== @@ -7742,14 +7132,6 @@ postcss-colormin@^4.0.3: postcss "^7.0.0" postcss-value-parser "^3.0.0" -postcss-combine-duplicated-selectors@^9.1.0: - version "9.4.0" - resolved "https://registry.yarnpkg.com/postcss-combine-duplicated-selectors/-/postcss-combine-duplicated-selectors-9.4.0.tgz#dae866debae5f93b58e13e6cc69419105e91336a" - integrity sha512-rMnO1H3wgR1T6QSlK3i8Slz9p3xD+0yOi4J7qwh/5PGR3z8jbgYvRlNKAIvXDtGBQbJKoWs4df5skL3a/fdUEA== - dependencies: - postcss "^7.0.0" - postcss-selector-parser "^6.0.0" - postcss-convert-values@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" @@ -7895,23 +7277,16 @@ postcss-lab-function@^2.0.1: postcss "^7.0.2" postcss-values-parser "^2.0.0" -postcss-load-config@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.2.tgz#c5ea504f2c4aef33c7359a34de3573772ad7502a" - integrity sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw== - dependencies: - cosmiconfig "^5.0.0" - import-cwd "^2.0.0" - -postcss-loader@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d" - integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA== +postcss-loader@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-4.2.0.tgz#f6993ea3e0f46600fb3ee49bbd010448123a7db4" + integrity sha512-mqgScxHqbiz1yxbnNcPdKYo/6aVt+XExURmEbQlviFVWogDbM4AJ0A/B+ZBpYsJrTRxKw7HyRazg9x0Q9SWwLA== dependencies: - loader-utils "^1.1.0" - postcss "^7.0.0" - postcss-load-config "^2.0.0" - schema-utils "^1.0.0" + cosmiconfig "^7.0.0" + klona "^2.0.4" + loader-utils "^2.0.0" + schema-utils "^3.0.0" + semver "^7.3.4" postcss-logical@^3.0.0: version "3.0.0" @@ -7999,38 +7374,33 @@ postcss-minify-selectors@^4.0.2: postcss "^7.0.0" postcss-selector-parser "^3.0.0" -postcss-modules-extract-imports@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" - integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== - dependencies: - postcss "^7.0.5" +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== -postcss-modules-local-by-default@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0" - integrity sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw== +postcss-modules-local-by-default@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" + integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== dependencies: - icss-utils "^4.1.1" - postcss "^7.0.32" + icss-utils "^5.0.0" postcss-selector-parser "^6.0.2" postcss-value-parser "^4.1.0" -postcss-modules-scope@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" - integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== +postcss-modules-scope@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" + integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== dependencies: - postcss "^7.0.6" - postcss-selector-parser "^6.0.0" + postcss-selector-parser "^6.0.4" -postcss-modules-values@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" - integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== dependencies: - icss-utils "^4.0.0" - postcss "^7.0.6" + icss-utils "^5.0.0" postcss-nesting@^7.0.0: version "7.0.1" @@ -8246,9 +7616,9 @@ postcss-selector-matches@^4.0.0: postcss "^7.0.2" postcss-selector-not@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz#c68ff7ba96527499e832724a2674d65603b645c0" - integrity sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ== + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz#263016eef1cf219e0ade9a913780fc1f48204cbf" + integrity sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ== dependencies: balanced-match "^1.0.0" postcss "^7.0.2" @@ -8271,7 +7641,7 @@ postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: indexes-of "^1.0.1" uniq "^1.0.1" -postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: +postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: version "6.0.4" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz#56075a1380a04604c38b063ea7767a129af5c2b3" integrity sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw== @@ -8336,6 +7706,15 @@ postcss-zindex@^4.0.1: postcss "^7.0.0" uniqs "^2.0.0" +postcss@^6.0.23: + version "6.0.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" + integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== + dependencies: + chalk "^2.4.1" + source-map "^0.6.1" + supports-color "^5.4.0" + postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: version "7.0.35" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24" @@ -8345,6 +7724,15 @@ postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2 source-map "^0.6.1" supports-color "^6.1.0" +postcss@^8.2.6, postcss@^8.2.7: + version "8.2.8" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.2.8.tgz#0b90f9382efda424c4f0f69a2ead6f6830d08ece" + integrity sha512-1F0Xb2T21xET7oQV9eKuctbM9S7BC0fetoHCc4H13z0PT6haiRLP4T0ZY4XWh7iLP0usgqykT6p9B2RtOf4FPw== + dependencies: + colorette "^1.2.2" + nanoid "^3.1.20" + source-map "^0.6.1" + prepend-http@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" @@ -8369,11 +7757,11 @@ pretty-time@^1.1.0: integrity sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA== prism-react-renderer@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-1.1.1.tgz#1c1be61b1eb9446a146ca7a50b7bcf36f2a70a44" - integrity sha512-MgMhSdHuHymNRqD6KM3eGS0PNqgK9q4QF5P0yoQQvpB6jNjeSAi3jcSAz0Sua/t9fa4xDOMar9HJbLa08gl9ug== + version "1.2.0" + resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-1.2.0.tgz#5ad4f90c3e447069426c8a53a0eafde60909cdf4" + integrity sha512-GHqzxLYImx1iKN1jJURcuRoA/0ygCcNhfGw1IT8nPIMzarmKQ3Nc+JcG0gi8JXQzuh0C5ShE4npMIoqNin40hg== -prismjs@^1.22.0: +prismjs@^1.23.0: version "1.23.0" resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.23.0.tgz#d3b3967f7d72440690497652a9d40ff046067f33" integrity sha512-c29LVsqOaLbBHuIbsTxaKENh1N2EQBOHaWv7gkHN4dgRbxSREqDnDbtFJYdpPauS4YCplMSNCABQ6Eeor69bAA== @@ -8402,7 +7790,15 @@ promise@^7.1.1: dependencies: asap "~2.0.3" -prop-types@^15.5.0, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2: +prompts@2.4.0, prompts@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.0.tgz#4aa5de0723a231d1ee9121c40fdf663df73f61d7" + integrity sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types@^15.5.0, prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -8483,7 +7879,7 @@ punycode@^2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -pupa@^2.0.1: +pupa@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== @@ -8528,6 +7924,11 @@ querystringify@^2.1.1: resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== +queue-microtask@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.2.tgz#abf64491e6ecf0f38a6502403d4cda04f372dfd3" + integrity sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg== + randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -8583,50 +7984,49 @@ react-base16-styling@^0.6.0: lodash.flow "^3.3.0" pure-color "^1.2.0" -react-dev-utils@^10.2.1: - version "10.2.1" - resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-10.2.1.tgz#f6de325ae25fa4d546d09df4bb1befdc6dd19c19" - integrity sha512-XxTbgJnYZmxuPtY3y/UV0D8/65NKkmaia4rXzViknVnZeVlklSh8u6TnaEYPfAi/Gh1TP4mEOXHI6jQOPbeakQ== +react-dev-utils@^11.0.1: + version "11.0.4" + resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-11.0.4.tgz#a7ccb60257a1ca2e0efe7a83e38e6700d17aa37a" + integrity sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A== dependencies: - "@babel/code-frame" "7.8.3" + "@babel/code-frame" "7.10.4" address "1.1.2" - browserslist "4.10.0" + browserslist "4.14.2" chalk "2.4.2" - cross-spawn "7.0.1" + cross-spawn "7.0.3" detect-port-alt "1.1.6" escape-string-regexp "2.0.0" - filesize "6.0.1" + filesize "6.1.0" find-up "4.1.0" - fork-ts-checker-webpack-plugin "3.1.1" + fork-ts-checker-webpack-plugin "4.1.6" global-modules "2.0.0" - globby "8.0.2" + globby "11.0.1" gzip-size "5.1.1" - immer "1.10.0" - inquirer "7.0.4" + immer "8.0.1" is-root "2.1.0" - loader-utils "1.2.3" + loader-utils "2.0.0" open "^7.0.2" pkg-up "3.1.0" - react-error-overlay "^6.0.7" + prompts "2.4.0" + react-error-overlay "^6.0.9" recursive-readdir "2.2.2" shell-quote "1.7.2" strip-ansi "6.0.0" text-table "0.2.0" -react-dom@^16.8.4: - version "16.14.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.14.0.tgz#7ad838ec29a777fb3c75c3a190f661cf92ab8b89" - integrity sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw== +react-dom@^17.0.1: + version "17.0.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.1.tgz#1de2560474ec9f0e334285662ede52dbc5426fc6" + integrity sha512-6eV150oJZ9U2t9svnsspTMrWNyHc6chX0KzDeAOXftRa8bNeOKTTfCJ7KorIwenkHd2xqVTBTCZd79yk/lx/Ug== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" - prop-types "^15.6.2" - scheduler "^0.19.1" + scheduler "^0.20.1" -react-error-overlay@^6.0.7: - version "6.0.8" - resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.8.tgz#474ed11d04fc6bda3af643447d85e9127ed6b5de" - integrity sha512-HvPuUQnLp5H7TouGq3kzBeioJmXms1wHy9EGjz2OURWBp4qZO6AfGEcnxts1D/CbwPLRAgTMPCEgYhA3sEM4vw== +react-error-overlay@^6.0.9: + version "6.0.9" + resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.9.tgz#3c743010c9359608c375ecd6bc76f35d93995b0a" + integrity sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew== react-fast-compare@^3.1.1: version "3.2.0" @@ -8648,15 +8048,15 @@ react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react-json-view@^1.19.1: - version "1.19.1" - resolved "https://registry.yarnpkg.com/react-json-view/-/react-json-view-1.19.1.tgz#95d8e59e024f08a25e5dc8f076ae304eed97cf5c" - integrity sha512-u5e0XDLIs9Rj43vWkKvwL8G3JzvXSl6etuS5G42a8klMohZuYFQzSN6ri+/GiBptDqlrXPTdExJVU7x9rrlXhg== +react-json-view@^1.21.1: + version "1.21.3" + resolved "https://registry.yarnpkg.com/react-json-view/-/react-json-view-1.21.3.tgz#f184209ee8f1bf374fb0c41b0813cff54549c475" + integrity sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw== dependencies: - flux "^3.1.3" + flux "^4.0.1" react-base16-styling "^0.6.0" react-lifecycles-compat "^3.0.4" - react-textarea-autosize "^6.1.0" + react-textarea-autosize "^8.3.2" react-lifecycles-compat@^3.0.4: version "3.0.4" @@ -8718,12 +8118,14 @@ react-side-effect@^2.1.0: resolved "https://registry.yarnpkg.com/react-side-effect/-/react-side-effect-2.1.1.tgz#66c5701c3e7560ab4822a4ee2742dee215d72eb3" integrity sha512-2FoTQzRNTncBVtnzxFOk2mCpcfxQpenBMbk5kSVBg5UcPqV9fRbgY2zhb7GTWWOlpFmAxhClBDlIq8Rsubz1yQ== -react-textarea-autosize@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-6.1.0.tgz#df91387f8a8f22020b77e3833c09829d706a09a5" - integrity sha512-F6bI1dgib6fSvG8so1HuArPUv+iVEfPliuLWusLF+gAKz0FbB4jLrWUrTAeq1afnPT2c9toEZYUdz/y1uKMy4A== +react-textarea-autosize@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.3.2.tgz#4f9374d357b0a6f6469956726722549124a1b2db" + integrity sha512-JrMWVgQSaExQByP3ggI1eA8zF4mF0+ddVuX7acUeK2V7bmrpjVOY72vmLz2IXFJSAXoY3D80nEzrn0GWajWK3Q== dependencies: - prop-types "^15.6.0" + "@babel/runtime" "^7.10.2" + use-composed-ref "^1.0.0" + use-latest "^1.0.0" react-toggle@^4.1.1: version "4.1.1" @@ -8732,14 +8134,13 @@ react-toggle@^4.1.1: dependencies: classnames "^2.2.5" -react@^16.8.4: - version "16.14.0" - resolved "https://registry.yarnpkg.com/react/-/react-16.14.0.tgz#94d776ddd0aaa37da3eda8fc5b6b18a4c9a3114d" - integrity sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g== +react@^17.0.1: + version "17.0.1" + resolved "https://registry.yarnpkg.com/react/-/react-17.0.1.tgz#6e0600416bd57574e3f86d92edba3d9008726127" + integrity sha512-lG9c9UuMHdcAexXtigOZLX8exLWkW0Ku29qPRU8uhF2R9BN96dLCt0psvzPLlHc5OWkgymP3qwTRgbnw5BKx3w== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" - prop-types "^15.6.2" "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" @@ -8779,10 +8180,10 @@ readdirp@~3.5.0: dependencies: picomatch "^2.2.1" -reading-time@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/reading-time/-/reading-time-1.2.0.tgz#ced71c06715762f805506328dcc1fd45d8249ac4" - integrity sha512-5b4XmKK4MEss63y0Lw0vn0Zn6G5kiHP88mUnD8UeEsyORj3sh1ghTH0/u6m1Ax9G2F4wUZrknlp6WlIsCvoXVA== +reading-time@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/reading-time/-/reading-time-1.3.0.tgz#d13e74431589a4a9038669f24d5acbc08bbb015d" + integrity sha512-RJ8J5O6UvrclfZpcPSPuKusrdRfoY7uXXoYOOdeswZNtSkQaewT3919yz6RyloDBR+iwcUyz5zGOUjhgvfuv3g== rechoir@^0.6.2: version "0.6.2" @@ -8831,12 +8232,12 @@ regex-not@^1.0.0, regex-not@^1.0.2: safe-regex "^1.1.0" regexp.prototype.flags@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" - integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== + version "1.3.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" + integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" regexpu-core@^4.7.1: version "4.7.1" @@ -8851,9 +8252,9 @@ regexpu-core@^4.7.1: unicode-match-property-value-ecmascript "^1.2.0" registry-auth-token@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.0.tgz#1d37dffda72bbecd0f581e4715540213a65eb7da" - integrity sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w== + version "4.2.1" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250" + integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw== dependencies: rc "^1.2.8" @@ -8870,9 +8271,9 @@ regjsgen@^0.5.1: integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== regjsparser@^0.6.4: - version "0.6.4" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272" - integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw== + version "0.6.7" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.7.tgz#c00164e1e6713c2e3ee641f1701c4b7aa0a7f86c" + integrity sha512-ib77G0uxsA2ovgiYbCVGx4Pv3PSttAx2vIwidqQzbL2U5S4Q+j00HdSAneSBuyVcMvEnTXMjiGgB+DlXozVhpQ== dependencies: jsesc "~0.5.0" @@ -8962,13 +8363,13 @@ remove-trailing-separator@^1.0.1: integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= renderkid@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.4.tgz#d325e532afb28d3f8796ffee306be8ffd6fc864c" - integrity sha512-K2eXrSOJdq+HuKzlcjOlGoOarUu5SDguDEhE7+Ah4zuOWL40j8A/oHvLlLob9PSTNvVnBd+/q0Er1QfpEuem5g== + version "2.0.5" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.5.tgz#483b1ac59c6601ab30a7a596a5965cabccfdd0a5" + integrity sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ== dependencies: - css-select "^1.1.0" + css-select "^2.0.2" dom-converter "^0.2" - htmlparser2 "^3.3.0" + htmlparser2 "^3.10.1" lodash "^4.17.20" strip-ansi "^3.0.0" @@ -8982,11 +8383,6 @@ repeat-string@^1.5.4, repeat-string@^1.6.1: resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= -replace-ext@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" - integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs= - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -9034,12 +8430,12 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.1.6, resolve@^1.3.2: - version "1.18.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.18.1.tgz#018fcb2c5b207d2a6424aee361c5a266da8f4130" - integrity sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA== +resolve@^1.1.6, resolve@^1.14.2, resolve@^1.3.2: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== dependencies: - is-core-module "^2.0.0" + is-core-module "^2.2.0" path-parse "^1.0.6" responselike@^1.0.2: @@ -9049,14 +8445,6 @@ responselike@^1.0.2: dependencies: lowercase-keys "^1.0.0" -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" @@ -9089,7 +8477,7 @@ rimraf@^2.5.4, rimraf@^2.6.3: dependencies: glob "^7.1.3" -rimraf@^3.0.0, rimraf@^3.0.2: +rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== @@ -9104,15 +8492,23 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -run-async@^2.2.0, run-async@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== +rtlcss@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/rtlcss/-/rtlcss-2.6.2.tgz#55b572b52c70015ba6e03d497e5c5cb8137104b4" + integrity sha512-06LFAr+GAPo+BvaynsXRfoYTJvSaWRyOhURCQ7aeI1MKph9meM222F+Zkt3bDamyHHJuGi3VPtiRkpyswmQbGA== + dependencies: + "@choojs/findup" "^0.2.1" + chalk "^2.4.2" + mkdirp "^0.5.1" + postcss "^6.0.23" + strip-json-comments "^2.0.0" run-parallel@^1.1.9: - version "1.1.10" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.10.tgz#60a51b2ae836636c81377df16cb107351bcd13ef" - integrity sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw== + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" @@ -9121,10 +8517,10 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -rxjs@^6.5.3, rxjs@^6.6.0, rxjs@^6.6.3: - version "6.6.3" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" - integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== +rxjs@^6.6.3: + version "6.6.6" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.6.tgz#14d8417aa5a07c5e633995b525e1e3c0dec03b70" + integrity sha512-/oTwee4N4iWzAMAL9xdGKjkEHmIwupR3oXbQjCKywF1BeFohswF3vZdogbmEF6pZkOsXTzWkrZszrWpQTByYVg== dependencies: tslib "^1.9.0" @@ -9145,7 +8541,7 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.1.0: +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -9155,10 +8551,10 @@ sax@^1.2.4, sax@~1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -scheduler@^0.19.1: - version "0.19.1" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" - integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== +scheduler@^0.20.1: + version "0.20.1" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.1.tgz#da0b907e24026b01181ecbc75efdc7f27b5a000c" + integrity sha512-LKTe+2xNJBNxu/QhHvDR14wUXHRQbVY5ZOYpOGWRzhydZUqrLb2JBvLPY7cAqFmqrWuDED0Mjk7013SZiOz6Bw== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" @@ -9172,7 +8568,7 @@ schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" -schema-utils@^2.0.0, schema-utils@^2.6.5, schema-utils@^2.7.0: +schema-utils@^2.0.0, schema-utils@^2.6.5: version "2.7.1" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== @@ -9208,7 +8604,7 @@ select@^1.1.2: resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0= -selfsigned@^1.10.7: +selfsigned@^1.10.8: version "1.10.8" resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.8.tgz#0d17208b7d12c33f8eac85c41835f27fc3d81a30" integrity sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w== @@ -9227,16 +8623,23 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: +semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^7.3.4: + version "7.3.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" + integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== + dependencies: + lru-cache "^6.0.0" + send@0.17.1: version "0.17.1" resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" @@ -9345,16 +8748,6 @@ sha.js@^2.4.0, sha.js@^2.4.8: inherits "^2.0.1" safe-buffer "^5.0.1" -shallow-clone@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-0.1.2.tgz#5909e874ba77106d73ac414cfec1ffca87d97060" - integrity sha1-WQnodLp3EG1zrEFM/sH/yofZcGA= - dependencies: - is-extendable "^0.1.1" - kind-of "^2.0.1" - lazy-cache "^0.2.3" - mixin-object "^2.0.1" - shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -9393,7 +8786,7 @@ shelljs@^0.8.4: interpret "^1.0.0" rechoir "^0.6.2" -signal-exit@^3.0.0, signal-exit@^3.0.2: +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== @@ -9405,20 +8798,29 @@ simple-swizzle@^0.2.2: dependencies: is-arrayish "^0.3.1" -sitemap@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/sitemap/-/sitemap-3.2.2.tgz#3f77c358fa97b555c879e457098e39910095c62b" - integrity sha512-TModL/WU4m2q/mQcrDgNANn0P4LwprM9MMvG4hu5zP4c6IIKs2YLTu6nXXnNr8ODW/WFtxKggiJ1EGn2W0GNmg== +sirv@^1.0.7: + version "1.0.11" + resolved "https://registry.yarnpkg.com/sirv/-/sirv-1.0.11.tgz#81c19a29202048507d6ec0d8ba8910fda52eb5a4" + integrity sha512-SR36i3/LSWja7AJNRBz4fF/Xjpn7lQFI30tZ434dIy+bitLYSP+ZEenHg36i23V2SGEz+kqjksg0uOGZ5LPiqg== dependencies: - lodash.chunk "^4.2.0" - lodash.padstart "^4.6.1" - whatwg-url "^7.0.0" - xmlbuilder "^13.0.0" + "@polka/url" "^1.0.0-next.9" + mime "^2.3.1" + totalist "^1.0.0" -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +sitemap@^6.3.6: + version "6.4.0" + resolved "https://registry.yarnpkg.com/sitemap/-/sitemap-6.4.0.tgz#b4bc4edf36de742405a7572bc3e467ba484b852e" + integrity sha512-DoPKNc2/apQZTUnfiOONWctwq7s6dZVspxAZe2VPMNtoqNq7HgXRvlRnbIpKjf+8+piQdWncwcy+YhhTGY5USQ== + dependencies: + "@types/node" "^14.14.28" + "@types/sax" "^1.2.1" + arg "^5.0.0" + sax "^1.2.4" slash@^3.0.0: version "3.0.0" @@ -9455,26 +8857,26 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -sockjs-client@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.4.0.tgz#c9f2568e19c8fd8173b4997ea3420e0bb306c7d5" - integrity sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g== +sockjs-client@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.5.0.tgz#2f8ff5d4b659e0d092f7aba0b7c386bd2aa20add" + integrity sha512-8Dt3BDi4FYNrCFGTL/HtwVzkARrENdwOUf1ZoW/9p3M8lZdFT35jVdrHza+qgxuG9H3/shR4cuX/X9umUrjP8Q== dependencies: - debug "^3.2.5" + debug "^3.2.6" eventsource "^1.0.7" - faye-websocket "~0.11.1" - inherits "^2.0.3" - json3 "^3.3.2" - url-parse "^1.4.3" + faye-websocket "^0.11.3" + inherits "^2.0.4" + json3 "^3.3.3" + url-parse "^1.4.7" -sockjs@0.3.20: - version "0.3.20" - resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.20.tgz#b26a283ec562ef8b2687b44033a4eeceac75d855" - integrity sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA== +sockjs@^0.3.21: + version "0.3.21" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.21.tgz#b34ffb98e796930b60a0cfa11904d6a339a7d417" + integrity sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw== dependencies: - faye-websocket "^0.10.0" + faye-websocket "^0.11.3" uuid "^3.4.0" - websocket-driver "0.6.5" + websocket-driver "^0.7.4" sort-css-media-queries@1.5.0: version "1.5.0" @@ -9513,9 +8915,9 @@ source-map-support@~0.5.12, source-map-support@~0.5.19: source-map "^0.6.0" source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + version "0.4.1" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== source-map@^0.5.0, source-map@^0.5.6: version "0.5.7" @@ -9580,9 +8982,9 @@ ssri@^6.0.1: figgy-pudding "^3.5.1" ssri@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.0.tgz#79ca74e21f8ceaeddfcb4b90143c458b8d988808" - integrity sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA== + version "8.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" + integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== dependencies: minipass "^3.1.1" @@ -9610,11 +9012,11 @@ static-extend@^0.1.1: integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= std-env@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/std-env/-/std-env-2.2.1.tgz#2ffa0fdc9e2263e0004c1211966e960948a40f6b" - integrity sha512-IjYQUinA3lg5re/YMlwlfhqNRTzMZMqE+pezevdcTaHceqx8ngEi1alX9nNCk9Sc81fy1fLDeQoaCzeiW1yBOQ== + version "2.3.0" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-2.3.0.tgz#66d4a4a4d5224242ed8e43f5d65cfa9095216eee" + integrity sha512-4qT5B45+Kjef2Z6pE0BkskzsH0GO7GrND0wGlTM1ioUe3v0dGYx9ZJH0Aro/YyA8fqQ5EyIKDRjZojJYMFTflw== dependencies: - ci-info "^1.6.0" + ci-info "^3.0.0" stream-browserify@^2.0.1: version "2.0.2" @@ -9662,30 +9064,30 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.0.0, string-width@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" - integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" + integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" -string.prototype.trimend@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz#6ddd9a8796bc714b489a3ae22246a208f37bfa46" - integrity sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw== +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" -string.prototype.trimstart@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz#22d45da81015309cd0cdd79787e8919fc5c613e7" - integrity sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg== +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" @@ -9746,7 +9148,7 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -strip-json-comments@~2.0.1: +strip-json-comments@^2.0.0, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= @@ -9767,12 +9169,7 @@ stylehacks@^4.0.0: postcss "^7.0.0" postcss-selector-parser "^3.0.0" -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= - -supports-color@^5.3.0: +supports-color@^5.3.0, supports-color@^5.4.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== @@ -9823,9 +9220,9 @@ tapable@^1.0.0, tapable@^1.1.3: integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== tar@^6.0.2: - version "6.0.5" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.0.5.tgz#bde815086e10b39f1dcd298e89d596e1535e200f" - integrity sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg== + version "6.1.0" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.0.tgz#d1724e9bcc04b977b18d5c573b333a2207229a83" + integrity sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA== dependencies: chownr "^2.0.0" fs-minipass "^2.0.0" @@ -9834,11 +9231,6 @@ tar@^6.0.2: mkdirp "^1.0.3" yallist "^4.0.0" -term-size@^2.1.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.1.tgz#2a6a54840432c2fb6320fea0f415531e90189f54" - integrity sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg== - terser-webpack-plugin@^1.4.3: version "1.4.5" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" @@ -9879,9 +9271,9 @@ terser@^4.1.2, terser@^4.6.3: source-map-support "~0.5.12" terser@^5.3.4: - version "5.3.8" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.3.8.tgz#991ae8ba21a3d990579b54aa9af11586197a75dd" - integrity sha512-zVotuHoIfnYjtlurOouTazciEfL7V38QMAOhGqpXDEg6yT13cF4+fEP9b0rrCEQTn+tT46uxgFsTZzhygk+CzQ== + version "5.6.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.6.0.tgz#138cdf21c5e3100b1b3ddfddf720962f88badcd2" + integrity sha512-vyqLMoqadC1uR0vywqOZzriDYzgEkNJFK4q9GeyOBHIbiECHiWLKcWfbQWAUaPfxkjDhapSlZB9f7fkMrvkVjA== dependencies: commander "^2.20.0" source-map "~0.7.2" @@ -9900,11 +9292,6 @@ through2@^2.0.0: readable-stream "~2.3.6" xtend "~4.0.1" -through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - thunky@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" @@ -9937,13 +9324,6 @@ tiny-warning@^1.0.0, tiny-warning@^1.0.3: resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" @@ -9996,12 +9376,10 @@ toidentifier@1.0.0: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== -tr46@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" - integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= - dependencies: - punycode "^2.1.0" +totalist@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/totalist/-/totalist-1.1.0.tgz#a4d65a3e546517701e3e5c37a47a70ac97fe56df" + integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== trim-trailing-lines@^1.0.0: version "1.1.4" @@ -10018,21 +9396,26 @@ trough@^1.0.0: resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== -tryer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" - integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== +ts-essentials@^2.0.3: + version "2.0.12" + resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-2.0.12.tgz#c9303f3d74f75fa7528c3d49b80e089ab09d8745" + integrity sha512-3IVX4nI6B5cc31/GFFE+i8ey/N2eA0CZDbo6n0yrz0zDX8ZJ8djmU1p+XRz7G3is0F3bB3pu2pAroFdAWQKU3w== ts-pnp@^1.1.6: version "1.2.0" resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== -tslib@^1.10.0, tslib@^1.9.0: +tslib@^1.9.0: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== +tslib@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" + integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== + tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" @@ -10043,10 +9426,10 @@ type-fest@^0.11.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== type-is@~1.6.17, type-is@~1.6.18: version "1.6.18" @@ -10069,9 +9452,19 @@ typedarray@^0.0.6: integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= ua-parser-js@^0.7.18: - version "0.7.22" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.22.tgz#960df60a5f911ea8f1c818f3747b99c6e177eae3" - integrity sha512-YUxzMjJ5T71w6a8WWVcMGM6YWOTX27rCoIQgLXiWaxqXSx9D7DNjiGWn1aJIRSQ5qr0xuhra77bSIh6voR/46Q== + version "0.7.24" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.24.tgz#8d3ecea46ed4f1f1d63ec25f17d8568105dc027c" + integrity sha512-yo+miGzQx5gakzVK3QFfN0/L9uVhosXBBO7qmnk7c2iw1IhL212wfA3zbnI54B0obGwC/5NWub/iT9sReMx+Fw== + +unbox-primitive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.0.tgz#eeacbc4affa28e9b3d36b5eaeccc50b3251b1d3f" + integrity sha512-P/51NX+JXyxK/aigg1/ZgyccdAxm5K1+n8+tvqSntjOivPt19gvm1VC49RWYetsiub8WViUchdxl/KWHHB0kzA== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.0" + has-symbols "^1.0.0" + which-boxed-primitive "^1.0.1" unherit@^1.0.4: version "1.1.3" @@ -10174,14 +9567,14 @@ unist-builder@2.0.3, unist-builder@^2.0.0: integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== unist-util-generated@^1.0.0: - version "1.1.5" - resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.5.tgz#1e903e68467931ebfaea386dae9ea253628acd42" - integrity sha512-1TC+NxQa4N9pNdayCYA1EGUOCAO0Le3fVp7Jzns6lnua/mYgwHo0tz5WUAfrdpNch1RZLHc61VZ1SDgrtNXLSw== + version "1.1.6" + resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.6.tgz#5ab51f689e2992a472beb1b35f2ce7ff2f324d4b" + integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== unist-util-is@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.0.3.tgz#e8b44db55fc20c43752b3346c116344d45d7c91d" - integrity sha512-bTofCFVx0iQM8Jqb1TBDVRIQW03YkD3p66JOd/aCWuqzlLyUtx1ZAGw/u+Zw+SttKvSVcvTiKYbfrtLoLefykw== + version "4.1.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" + integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== unist-util-position@^3.0.0: version "3.1.0" @@ -10254,29 +9647,30 @@ upath@^1.1.1: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -update-notifier@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.1.3.tgz#be86ee13e8ce48fb50043ff72057b5bd598e1ea3" - integrity sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A== +update-notifier@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9" + integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== dependencies: - boxen "^4.2.0" - chalk "^3.0.0" + boxen "^5.0.0" + chalk "^4.1.0" configstore "^5.0.1" has-yarn "^2.1.0" import-lazy "^2.1.0" is-ci "^2.0.0" - is-installed-globally "^0.3.1" - is-npm "^4.0.0" + is-installed-globally "^0.4.0" + is-npm "^5.0.0" is-yarn-global "^0.3.0" - latest-version "^5.0.0" - pupa "^2.0.1" + latest-version "^5.1.0" + pupa "^2.1.1" + semver "^7.3.4" semver-diff "^3.1.1" xdg-basedir "^4.0.0" uri-js@^4.2.2: - version "4.4.0" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602" - integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g== + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" @@ -10301,10 +9695,10 @@ url-parse-lax@^3.0.0: dependencies: prepend-http "^2.0.0" -url-parse@^1.4.3: - version "1.4.7" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278" - integrity sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg== +url-parse@^1.4.3, url-parse@^1.4.7: + version "1.5.1" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.1.tgz#d5fa9890af8a5e1f274a2c98376510f6425f6e3b" + integrity sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q== dependencies: querystringify "^2.1.1" requires-port "^1.0.0" @@ -10317,6 +9711,25 @@ url@^0.11.0: punycode "1.3.2" querystring "0.2.0" +use-composed-ref@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/use-composed-ref/-/use-composed-ref-1.1.0.tgz#9220e4e94a97b7b02d7d27eaeab0b37034438bbc" + integrity sha512-my1lNHGWsSDAhhVAT4MKs6IjBUtG6ZG11uUqexPH9PptiIZDQOzaF4f5tEbJ2+7qvNbtXNBbU3SfmN+fXlWDhg== + dependencies: + ts-essentials "^2.0.3" + +use-isomorphic-layout-effect@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.1.tgz#7bb6589170cd2987a152042f9084f9effb75c225" + integrity sha512-L7Evj8FGcwo/wpbv/qvSfrkHFtOpCzvM5yl2KVyDJoylVuSvzphiiasmjgQPttIGBAy2WKiBNR98q8w7PiNgKQ== + +use-latest@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/use-latest/-/use-latest-1.2.0.tgz#a44f6572b8288e0972ec411bdd0840ada366f232" + integrity sha512-d2TEuG6nSLKQLAfW3By8mKr8HurOlTkul0sOpxbClIv4SQ4iOd7BYr7VIzdbktUCnv7dua/60xzd8igMU6jmyw== + dependencies: + use-isomorphic-layout-effect "^1.0.0" + use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" @@ -10408,13 +9821,12 @@ vfile-message@^2.0.0: unist-util-stringify-position "^2.0.0" vfile@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.0.tgz#26c78ac92eb70816b01d4565e003b7e65a2a0e01" - integrity sha512-a/alcwCvtuc8OX92rqqo7PflxiCgXRFjdyoGVuYV+qbgCb0GgZJRvIgCD4+U/Kl1yhaRsaTwksF88xbPyGsgpw== + version "4.2.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" + integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== dependencies: "@types/unist" "^2.0.0" is-buffer "^2.0.0" - replace-ext "1.0.0" unist-util-stringify-position "^2.0.0" vfile-message "^2.0.0" @@ -10423,7 +9835,7 @@ vm-browserify@^1.0.1: resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== -wait-on@^5.2.0: +wait-on@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-5.2.1.tgz#05b66fcb4d7f5da01537f03e7cf96e8836422996" integrity sha512-H2F986kNWMU9hKlI9l/ppO6tN8ZSJd35yBljMLa1/vjzWP++Qh6aXyt77/u7ySJFZQqBtQxnvm/xgG48AObXcw== @@ -10434,23 +9846,23 @@ wait-on@^5.2.0: minimist "^1.2.5" rxjs "^6.6.3" -watchpack-chokidar2@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz#9948a1866cbbd6cb824dea13a7ed691f6c8ddff0" - integrity sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA== +watchpack-chokidar2@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" + integrity sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww== dependencies: chokidar "^2.1.8" watchpack@^1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.4.tgz#6e9da53b3c80bb2d6508188f5b200410866cd30b" - integrity sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg== + version "1.7.5" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453" + integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ== dependencies: graceful-fs "^4.1.2" neo-async "^2.5.0" optionalDependencies: chokidar "^3.4.1" - watchpack-chokidar2 "^2.0.0" + watchpack-chokidar2 "^2.0.1" wbuf@^1.1.0, wbuf@^1.7.3: version "1.7.3" @@ -10464,34 +9876,25 @@ web-namespaces@^1.0.0, web-namespaces@^1.1.2: resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== -webidl-conversions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" - integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== - -webpack-bundle-analyzer@^3.6.1: - version "3.9.0" - resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.9.0.tgz#f6f94db108fb574e415ad313de41a2707d33ef3c" - integrity sha512-Ob8amZfCm3rMB1ScjQVlbYYUEJyEjdEtQ92jqiFUYt5VkEeO2v5UMbv49P/gnmCZm3A6yaFQzCBvpZqN4MUsdA== +webpack-bundle-analyzer@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.4.0.tgz#74013106e7e2b07cbd64f3a5ae847f7e814802c7" + integrity sha512-9DhNa+aXpqdHk8LkLPTBU/dMfl84Y+WE2+KnfI6rSpNRNVKa0VGLjPd2pjFubDeqnWmulFggxmWBxhfJXZnR0g== dependencies: - acorn "^7.1.1" - acorn-walk "^7.1.1" - bfj "^6.1.1" - chalk "^2.4.1" - commander "^2.18.0" - ejs "^2.6.1" - express "^4.16.3" - filesize "^3.6.1" - gzip-size "^5.0.0" - lodash "^4.17.19" - mkdirp "^0.5.1" - opener "^1.5.1" - ws "^6.0.0" + acorn "^8.0.4" + acorn-walk "^8.0.0" + chalk "^4.1.0" + commander "^6.2.0" + gzip-size "^6.0.0" + lodash "^4.17.20" + opener "^1.5.2" + sirv "^1.0.7" + ws "^7.3.1" webpack-dev-middleware@^3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz#0019c3db716e3fa5cecbf64f2ab88a74bab331f3" - integrity sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw== + version "3.7.3" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz#0639372b143262e2b84ab95d3b91a7597061c2c5" + integrity sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ== dependencies: memory-fs "^0.4.1" mime "^2.4.4" @@ -10499,10 +9902,10 @@ webpack-dev-middleware@^3.7.2: range-parser "^1.2.1" webpack-log "^2.0.0" -webpack-dev-server@^3.11.0: - version "3.11.0" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz#8f154a3bce1bcfd1cc618ef4e703278855e7ff8c" - integrity sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg== +webpack-dev-server@^3.11.2: + version "3.11.2" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz#695ebced76a4929f0d5de7fd73fafe185fe33708" + integrity sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ== dependencies: ansi-html "0.0.7" bonjour "^3.5.0" @@ -10524,11 +9927,11 @@ webpack-dev-server@^3.11.0: p-retry "^3.0.1" portfinder "^1.0.26" schema-utils "^1.0.0" - selfsigned "^1.10.7" + selfsigned "^1.10.8" semver "^6.3.0" serve-index "^1.9.1" - sockjs "0.3.20" - sockjs-client "1.4.0" + sockjs "^0.3.21" + sockjs-client "^1.5.0" spdy "^4.0.2" strip-ansi "^3.0.1" supports-color "^6.1.0" @@ -10562,9 +9965,9 @@ webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack- source-map "~0.6.1" webpack@^4.44.1: - version "4.44.2" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.44.2.tgz#6bfe2b0af055c8b2d1e90ed2cd9363f841266b72" - integrity sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q== + version "4.46.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.46.0.tgz#bf9b4404ea20a073605e0a011d188d77cb6ad542" + integrity sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q== dependencies: "@webassemblyjs/ast" "1.9.0" "@webassemblyjs/helper-module-context" "1.9.0" @@ -10574,7 +9977,7 @@ webpack@^4.44.1: ajv "^6.10.2" ajv-keywords "^3.4.1" chrome-trace-event "^1.0.2" - enhanced-resolve "^4.3.0" + enhanced-resolve "^4.5.0" eslint-scope "^4.0.3" json-parse-better-errors "^1.0.2" loader-runner "^2.4.0" @@ -10590,28 +9993,21 @@ webpack@^4.44.1: watchpack "^1.7.4" webpack-sources "^1.4.1" -webpackbar@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/webpackbar/-/webpackbar-4.0.0.tgz#ee7a87f16077505b5720551af413c8ecd5b1f780" - integrity sha512-k1qRoSL/3BVuINzngj09nIwreD8wxV4grcuhHTD8VJgUbGcy8lQSPqv+bM00B7F+PffwIsQ8ISd4mIwRbr23eQ== +webpackbar@^5.0.0-3: + version "5.0.0-3" + resolved "https://registry.yarnpkg.com/webpackbar/-/webpackbar-5.0.0-3.tgz#f4f96c8fb13001b2bb1348252db4c980ab93aaac" + integrity sha512-viW6KCYjMb0NPoDrw2jAmLXU2dEOhRrtku28KmOfeE1vxbfwCYuTbTaMhnkrCZLFAFyY9Q49Z/jzYO80Dw5b8g== dependencies: - ansi-escapes "^4.2.1" - chalk "^2.4.2" - consola "^2.10.0" - figures "^3.0.0" + ansi-escapes "^4.3.1" + chalk "^4.1.0" + consola "^2.15.0" + figures "^3.2.0" pretty-time "^1.1.0" std-env "^2.2.1" text-table "^0.2.0" - wrap-ansi "^6.0.0" - -websocket-driver@0.6.5: - version "0.6.5" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" - integrity sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY= - dependencies: - websocket-extensions ">=0.1.1" + wrap-ansi "^7.0.0" -websocket-driver@>=0.5.1: +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: version "0.7.4" resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== @@ -10625,19 +10021,16 @@ websocket-extensions@>=0.1.1: resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== -whatwg-fetch@>=0.10.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.4.1.tgz#e5f871572d6879663fa5674c8f833f15a8425ab3" - integrity sha512-sofZVzE1wKwO+EYPbWfiwzaKovWiZXf4coEzjGP9b2GBVgQRLQUZ2QcuPpQExGDAW5GItpEm6Tl4OU5mywnAoQ== - -whatwg-url@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" - integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== +which-boxed-primitive@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" which-module@^2.0.0: version "2.0.0" @@ -10688,10 +10081,10 @@ wrap-ansi@^5.1.0: string-width "^3.0.0" strip-ansi "^5.0.0" -wrap-ansi@^6.0.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" string-width "^4.1.0" @@ -10712,13 +10105,18 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -ws@^6.0.0, ws@^6.2.1: +ws@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== dependencies: async-limiter "~1.0.0" +ws@^7.3.1: + version "7.4.4" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.4.tgz#383bc9742cb202292c9077ceab6f6047b17f2d59" + integrity sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw== + xdg-basedir@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" @@ -10731,20 +10129,15 @@ xml-js@^1.6.11: dependencies: sax "^1.2.4" -xmlbuilder@^13.0.0: - version "13.0.2" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-13.0.2.tgz#02ae33614b6a047d1c32b5389c1fdacb2bce47a7" - integrity sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ== - xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + version "4.0.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" + integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== yallist@^3.0.2: version "3.1.1" @@ -10756,7 +10149,7 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@^1.7.2: +yaml@^1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== @@ -10785,6 +10178,11 @@ yargs@^13.3.2: y18n "^4.0.0" yargs-parser "^13.1.2" +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + zwitch@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" diff --git a/frontend/README.md b/frontend/README.md index f051ada08a..b45f2d9bec 100644 --- a/frontend/README.md +++ b/frontend/README.md @@ -14,6 +14,6 @@ Here is a quick introduction to the frontend projects: The [UI project](https://github.com/airyhq/airy/tree/develop/frontend/ui) is a minimum UI implementation of the provided [Airy Core API](https://docs.airy.co/api/http). -- `Chat_Plugin` +- `ChatPlugin` This project is implements a UI for the [Chat Plugin Source](https://docs.airy.co/sources/chat-plugin) that can be installed as Javascript tag on websites. diff --git a/frontend/assets/BUILD b/frontend/assets/BUILD index f7c7094bb7..9abae49b92 100644 --- a/frontend/assets/BUILD +++ b/frontend/assets/BUILD @@ -1,3 +1,4 @@ +load("//tools/lint:web.bzl", "web_lint") load("@com_github_airyhq_bazel_tools//lint:buildifier.bzl", "check_pkg") load("@com_github_airyhq_bazel_tools//web:typescript.bzl", "ts_web_library") @@ -8,3 +9,5 @@ ts_web_library( ) check_pkg(name = "buildifier") + +web_lint() diff --git a/frontend/assets/images/empty-state/templates-empty-state.png b/frontend/assets/images/empty-state/templates-empty-state.png new file mode 100644 index 0000000000..39a6117514 Binary files /dev/null and b/frontend/assets/images/empty-state/templates-empty-state.png differ diff --git a/frontend/assets/images/icons/smiley.svg b/frontend/assets/images/icons/smiley.svg new file mode 100644 index 0000000000..a7e7cdfaf6 --- /dev/null +++ b/frontend/assets/images/icons/smiley.svg @@ -0,0 +1,9 @@ + + + icon/smiley/smile + + + + + + \ No newline at end of file diff --git a/frontend/assets/images/icons/template-alt.svg b/frontend/assets/images/icons/template-alt.svg new file mode 100644 index 0000000000..5beadc5bfd --- /dev/null +++ b/frontend/assets/images/icons/template-alt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/assets/images/not-found/templates-not-found.png b/frontend/assets/images/not-found/templates-not-found.png new file mode 100644 index 0000000000..e52cba27df Binary files /dev/null and b/frontend/assets/images/not-found/templates-not-found.png differ diff --git a/frontend/chat-plugin/BUILD b/frontend/chat-plugin/BUILD index 2a6379637b..974dcd25ab 100644 --- a/frontend/chat-plugin/BUILD +++ b/frontend/chat-plugin/BUILD @@ -1,3 +1,4 @@ +load("//tools/lint:web.bzl", "web_lint") load("@com_github_airyhq_bazel_tools//lint:buildifier.bzl", "check_pkg") load("@npm//@bazel/typescript:index.bzl", "ts_config") load("@com_github_airyhq_bazel_tools//web:typescript.bzl", "ts_web_library") @@ -13,6 +14,7 @@ module_deps = [ "//lib/typescript/httpclient", "//lib/typescript/render", "//lib/typescript/dates", + "//frontend/chat-plugin/handles:chat-plugin-handles", ] web_app( @@ -25,7 +27,9 @@ web_app( entry = "frontend/chat-plugin/src/iframe.js", index = ":development.html", module_deps = module_deps, - show_bundle_report = True, + output = { + "publicPath": "/chatplugin/ui", + }, ) web_library( @@ -39,7 +43,7 @@ web_library( module_deps = module_deps, output = { "libraryExport": "AiryWidget", - "publicPath": "/", + "publicPath": "/chatplugin/ui", "filename": "s.js", }, ) @@ -101,3 +105,5 @@ container_release( ) check_pkg(name = "buildifier") + +web_lint() diff --git a/frontend/chat-plugin/example.html b/frontend/chat-plugin/example.html index c9f9ee6af8..1d4ec9f632 100644 --- a/frontend/chat-plugin/example.html +++ b/frontend/chat-plugin/example.html @@ -32,18 +32,16 @@ text: "Let's start", postbackData: '/start', }, - }, + }, ], }, }, }, }; - // Only to be used for local installations - w[n].noTLS = true; var f = d.getElementsByTagName(s)[0], j = d.createElement(s); j.async = true; - j.src = '//' + w[n].host + '/s.js'; + j.src = '//' + w[n].host + '/chatplugin/ui/s.js'; f.parentNode.insertBefore(j, f); })(window, document, 'script', 'airy'); diff --git a/frontend/chat-plugin/handles/BUILD b/frontend/chat-plugin/handles/BUILD new file mode 100644 index 0000000000..e75c7a997b --- /dev/null +++ b/frontend/chat-plugin/handles/BUILD @@ -0,0 +1,8 @@ +load("@com_github_airyhq_bazel_tools//web:typescript.bzl", "ts_web_library") + +package(default_visibility = ["//visibility:public"]) + +ts_web_library( + name = "chat-plugin-handles", + srcs = ["index.ts"], +) diff --git a/frontend/chat-plugin/handles/index.ts b/frontend/chat-plugin/handles/index.ts new file mode 100644 index 0000000000..5ff8b56bf0 --- /dev/null +++ b/frontend/chat-plugin/handles/index.ts @@ -0,0 +1,3 @@ +export const cyBubble = 'bubble'; +export const cyInputbarTextarea = 'inputbarTextarea'; +export const cyInputbarButton = 'inputbarButton'; diff --git a/frontend/chat-plugin/src/airyRenderProps/AiryBubble/index.tsx b/frontend/chat-plugin/src/airyRenderProps/AiryBubble/index.tsx index fe4de87b9e..844d19c0eb 100644 --- a/frontend/chat-plugin/src/airyRenderProps/AiryBubble/index.tsx +++ b/frontend/chat-plugin/src/airyRenderProps/AiryBubble/index.tsx @@ -4,11 +4,12 @@ import style from './index.module.scss'; type Props = { isChatHidden: boolean; toggleHideChat: () => void; + dataCyId?: string; }; const AiryBubble = (props: Props) => { return ( -
props.toggleHideChat()}> +
props.toggleHideChat()} data-cy={props.dataCyId}> {!props.isChatHidden ? ( diff --git a/frontend/chat-plugin/src/airyRenderProps/AiryInputBar/index.tsx b/frontend/chat-plugin/src/airyRenderProps/AiryInputBar/index.tsx index cd12b07bb7..83b3b6ec90 100644 --- a/frontend/chat-plugin/src/airyRenderProps/AiryInputBar/index.tsx +++ b/frontend/chat-plugin/src/airyRenderProps/AiryInputBar/index.tsx @@ -1,5 +1,6 @@ import React, {ChangeEvent, FormEvent, KeyboardEvent, createRef, useEffect} from 'react'; import style from './index.module.scss'; +import {cyInputbarTextarea, cyInputbarButton} from 'chat-plugin-handles'; type Props = { sendMessage: (text: string) => void; @@ -9,6 +10,8 @@ type Props = { const AiryInputBar = (props: Props) => { const textInputRef = createRef(); + const dataCyButtonId = cyInputbarButton; + const dataCyTextareaId = cyInputbarTextarea; useEffect(() => { textInputRef.current.selectionStart = props.messageString.length; @@ -61,8 +64,9 @@ const AiryInputBar = (props: Props) => { onChange={handleChange} onKeyDown={handleKeyDown} value={props.messageString} + data-cy={dataCyTextareaId} /> -
-
-
- {messages.map((message, index: number) => { - const nextMessage = messages[index + 1]; - const lastInGroup = nextMessage ? isFromContact(message) !== isFromContact(nextMessage) : true; - - return ( - props.airyMessageProp(ctrl) - : () => ( - - - - ) - } - /> - ); - })} +
+
+
+ {messages.map((message, index: number) => { + const nextMessage = messages[index + 1]; + const lastInGroup = nextMessage ? isFromContact(message) !== isFromContact(nextMessage) : true; + + return ( + props.airyMessageProp(ctrl) + : () => ( + + + + ) + } + /> + ); + })} +
+ + {connectionState === ConnectionState.Disconnected && ( +
Reconnecting...
+ )}
-
)} diff --git a/frontend/chat-plugin/src/defaultScript.tsx b/frontend/chat-plugin/src/defaultScript.tsx index 14e51b324b..4c1106c042 100644 --- a/frontend/chat-plugin/src/defaultScript.tsx +++ b/frontend/chat-plugin/src/defaultScript.tsx @@ -28,11 +28,10 @@ declare const window: { host: string; channelId: string; welcomeMessage: {}; - noTLS: boolean; }; }; -if (window.airy.channelId.length) { +if (window.airy.channelId) { new AiryWidget({ channelId: window.airy.channelId, welcomeMessage: window.airy.welcomeMessage, diff --git a/frontend/chat-plugin/src/websocket/index.ts b/frontend/chat-plugin/src/websocket/index.ts index 9e2d804e3c..60c027525e 100644 --- a/frontend/chat-plugin/src/websocket/index.ts +++ b/frontend/chat-plugin/src/websocket/index.ts @@ -3,40 +3,50 @@ import 'regenerator-runtime/runtime'; import {start, getResumeToken, sendMessage} from '../api'; import {SuggestionResponse, TextContent} from 'render/providers/chatplugin/chatPluginModel'; import {Message} from 'httpclient'; -import {resetStorage} from '../storage'; +import {getResumeTokenFromStorage, resetStorage} from '../storage'; + /* eslint-disable @typescript-eslint/no-var-requires */ const camelcaseKeys = require('camelcase-keys'); -declare const window: { - airy: { - host: string; - channelId: string; - noTLS: boolean; - }; -}; +declare global { + interface Window { + airy: { + host: string; + channelId: string; + }; + } +} -const API_HOST = window.airy ? window.airy.host : 'chatplugin.airy'; +const API_HOST = window.airy ? window.airy.host : 'airy.core'; // https: -> wss: and http: -> ws: const protocol = location.protocol.replace('http', 'ws'); +export enum ConnectionState { + Connected = 'CONNECTED', + Disconnected = 'DISCONNECTED', +} + class WebSocket { client: Client; channelId: string; token: string; - resumeToken: string; setInitialMessages: (messages: Array) => void; onReceive: messageCallbackType; + reconnectTimeout: number; + isConnected: boolean; + updateConnectionState: (state: ConnectionState) => void; constructor( channelId: string, onReceive: messageCallbackType, setInitialMessages: (messages: Array) => void, - resumeToken?: string + updateConnectionState: (state: ConnectionState) => void ) { this.channelId = channelId; this.onReceive = onReceive; - this.resumeToken = resumeToken; this.setInitialMessages = setInitialMessages; + this.isConnected = false; + this.updateConnectionState = updateConnectionState; } connect = (token: string) => { @@ -50,12 +60,13 @@ class WebSocket { debug: function (str) { console.info(str); }, - reconnectDelay: 5000, + reconnectDelay: 0, heartbeatIncoming: 4000, heartbeatOutgoing: 4000, }); this.client.onConnect = this.onConnect; + this.client.onWebSocketClose = this.onWebSocketClose; this.client.onStompError = function (frame: IFrame) { console.error('Broker reported error: ' + frame.headers['message']); @@ -68,7 +79,8 @@ class WebSocket { onSend = (message: TextContent | SuggestionResponse) => sendMessage(message, this.token); start = async () => { - const response = await start(this.channelId, this.resumeToken); + const resumeToken = getResumeTokenFromStorage(this.channelId); + const response = await start(this.channelId, resumeToken); if (response.token && response.messages) { this.connect(response.token); this.setInitialMessages( @@ -77,7 +89,7 @@ class WebSocket { sentAt: new Date(message.sent_at), })) ); - if (!this.resumeToken) { + if (!resumeToken) { await getResumeToken(this.channelId, this.token); } } else { @@ -87,6 +99,26 @@ class WebSocket { onConnect = () => { this.client.subscribe('/user/queue/message', this.onReceive); + this.isConnected = true; + clearTimeout(this.reconnectTimeout); + this.updateConnectionState(ConnectionState.Connected); + }; + + tryReconnect = () => { + this.reconnectTimeout = window.setTimeout(this.reconnect, 5000); + }; + + reconnect = () => { + if (!this.isConnected) { + this.reconnectTimeout = window.setTimeout(this.reconnect, 5000); + this.start(); + } + }; + + onWebSocketClose = () => { + this.isConnected = false; + this.updateConnectionState(ConnectionState.Disconnected); + this.tryReconnect(); }; } diff --git a/frontend/ui/BUILD b/frontend/ui/BUILD index 95738d3e7d..f9165549c1 100644 --- a/frontend/ui/BUILD +++ b/frontend/ui/BUILD @@ -1,3 +1,4 @@ +load("//tools/lint:web.bzl", "web_lint") load("@com_github_airyhq_bazel_tools//web:typescript.bzl", "ts_web_library") load("@com_github_airyhq_bazel_tools//web:web_app.bzl", "web_app") load("@rules_pkg//:pkg.bzl", "pkg_tar") @@ -5,8 +6,6 @@ load("//tools/build:container_release.bzl", "container_release") load("@io_bazel_rules_docker//container:container.bzl", "container_image") load("@com_github_airyhq_bazel_tools//lint:buildifier.bzl", "check_pkg") -check_pkg() - check_pkg(name = "buildifier") module_deps = [ @@ -16,6 +15,7 @@ module_deps = [ "//lib/typescript/render", "//lib/typescript/dates", "//lib/typescript/websocketclient", + "//frontend/ui/handles", ] ts_web_library( @@ -46,6 +46,9 @@ web_app( entry = "frontend/ui/src/index.js", index = ":index.html", module_deps = module_deps, + output = { + "publicPath": "/ui", + }, static_assets = "//frontend/ui/public", ) @@ -76,3 +79,5 @@ container_release( registry = "ghcr.io/airyhq/frontend", repository = "ui", ) + +web_lint() diff --git a/frontend/ui/README.md b/frontend/ui/README.md index d442200f06..2e4faa148e 100644 --- a/frontend/ui/README.md +++ b/frontend/ui/README.md @@ -45,9 +45,9 @@ In order to communicate with our API endpoints, you need a valid [JWT](https://j ### Endpoints -To communicate with our signup endpoint and register your email, open another terminal and type in the terminal `curl -X POST -H 'Content-Type: application/json' -d '{"first_name": "your_name","last_name": "your_last_name","password": "your_password","email": "your_email@airy.co"}' http://api.airy/users.signup` +To communicate with our signup endpoint and register your email, open another terminal and type in the terminal `curl -X POST -H 'Content-Type: application/json' -d '{"first_name": "your_name","last_name": "your_last_name","password": "your_password","email": "your_email@airy.co"}' http://airy.core/users.signup` -To sign in, type in the terminal `token=$(echo $(curl -H 'Content-Type: application/json' -d \"{ \\"email\":\"your_email@airy.co\",\\"password\":\"your_last_name\" \}" api.airy/users.login) | jq -r '.token')` +To sign in, type in the terminal `token=$(echo $(curl -H 'Content-Type: application/json' -d \"{ \\"email\":\"your_email@airy.co\",\\"password\":\"your_last_name\" \}" airy.core/users.login) | jq -r '.token')` Aside from Curl, [PostMan](https://www.postman.com/downloads/) and other API testing tools could also be used to access the endpoints. diff --git a/frontend/ui/handles/BUILD b/frontend/ui/handles/BUILD new file mode 100644 index 0000000000..334ea614f1 --- /dev/null +++ b/frontend/ui/handles/BUILD @@ -0,0 +1,8 @@ +load("@com_github_airyhq_bazel_tools//web:typescript.bzl", "ts_web_library") + +package(default_visibility = ["//visibility:public"]) + +ts_web_library( + name = "handles", + srcs = ["index.ts"], +) diff --git a/frontend/ui/handles/index.ts b/frontend/ui/handles/index.ts new file mode 100644 index 0000000000..cedc6489af --- /dev/null +++ b/frontend/ui/handles/index.ts @@ -0,0 +1,4 @@ +export const cyMessageList = 'messageList'; +export const cyInputBar = 'inputBar'; +export const cyMessageTextArea = 'messageTextArea'; +export const cyMessageSendButton = 'messageSendButton'; diff --git a/frontend/ui/index.html b/frontend/ui/index.html index 9567955d3d..7a09e9d882 100644 --- a/frontend/ui/index.html +++ b/frontend/ui/index.html @@ -3,7 +3,7 @@ Airy UI - + @@ -11,11 +11,10 @@ manifest.json provides metadata used when your web app is added to the homescreen on Android. See https://developers.google.com/web/fundamentals/engage-and-retain/web-app-manifest/ --> - + diff --git a/frontend/ui/public/BUILD b/frontend/ui/public/BUILD index 9b864009bc..d0c2f25172 100644 --- a/frontend/ui/public/BUILD +++ b/frontend/ui/public/BUILD @@ -1,3 +1,4 @@ +load("//tools/lint:web.bzl", "web_lint") load("@com_github_airyhq_bazel_tools//lint:buildifier.bzl", "check_pkg") package(default_visibility = ["//visibility:public"]) @@ -10,3 +11,5 @@ filegroup( ) check_pkg(name = "buildifier") + +web_lint() diff --git a/frontend/ui/src/actions/channel/index.ts b/frontend/ui/src/actions/channel/index.ts index 5c49dfea75..73ebfcd028 100644 --- a/frontend/ui/src/actions/channel/index.ts +++ b/frontend/ui/src/actions/channel/index.ts @@ -1,12 +1,14 @@ -import {createAction} from 'typesafe-actions'; +import _typesafe, {createAction} from 'typesafe-actions'; import _, {Dispatch} from 'redux'; import { Channel, - ConnectChannelRequestPayload, + ConnectChannelFacebookRequestPayload, ExploreChannelRequestPayload, DisconnectChannelRequestPayload, ConnectChatPluginRequestPayload, + ConnectTwilioSmsRequestPayload, + ConnectTwilioWhatsappRequestPayload, UpdateChannelRequestPayload, } from 'httpclient'; import {HttpClientInstance} from '../../InitializeAiryApi'; @@ -16,13 +18,13 @@ const ADD_CHANNELS = '@@channel/ADD_CHANNELS'; const SET_CHANNEL = '@@channel/SET_CHANNEL'; const DELETE_CHANNEL = '@@channel/DELETE_CHANNEL'; -export const setCurrentChannelsAction = createAction(SET_CURRENT_CHANNELS, resolve => (channels: Channel[]) => - resolve(channels) -); +export const setCurrentChannelsAction = createAction(SET_CURRENT_CHANNELS, (channels: Channel[]) => channels)< + Channel[] +>(); -export const addChannelsAction = createAction(ADD_CHANNELS, resolve => (channels: Channel[]) => resolve(channels)); -export const setChannelAction = createAction(SET_CHANNEL, resolve => (channel: Channel) => resolve(channel)); -export const deleteChannelAction = createAction(DELETE_CHANNEL, resolve => (channelId: string) => resolve(channelId)); +export const addChannelsAction = createAction(ADD_CHANNELS, (channels: Channel[]) => channels)(); +export const setChannelAction = createAction(SET_CHANNEL, (channel: Channel) => channel)(); +export const deleteChannelAction = createAction(DELETE_CHANNEL, (channelId: string) => channelId)(); export const listChannels = () => async (dispatch: Dispatch) => HttpClientInstance.listChannels().then((response: Channel[]) => { @@ -37,7 +39,9 @@ export const exploreChannels = (requestPayload: ExploreChannelRequestPayload) => }); }; -export const connectChannel = (requestPayload: ConnectChannelRequestPayload) => async (dispatch: Dispatch) => +export const connectFacebookChannel = (requestPayload: ConnectChannelFacebookRequestPayload) => async ( + dispatch: Dispatch +) => HttpClientInstance.connectFacebookChannel(requestPayload).then((response: Channel) => { dispatch(addChannelsAction([response])); return Promise.resolve(response); @@ -49,16 +53,28 @@ export const connectChatPlugin = (requestPayload: ConnectChatPluginRequestPayloa return Promise.resolve(response); }); +export const connectTwilioSms = (requestPayload: ConnectTwilioSmsRequestPayload) => async (dispatch: Dispatch) => + HttpClientInstance.connectTwilioSmsChannel(requestPayload).then((response: Channel) => { + dispatch(addChannelsAction([response])); + return Promise.resolve(response); + }); + +export const connectTwilioWhatsapp = (requestPayload: ConnectTwilioWhatsappRequestPayload) => async ( + dispatch: Dispatch +) => + HttpClientInstance.connectTwilioWhatsappChannel(requestPayload).then((response: Channel) => { + dispatch(addChannelsAction([response])); + return Promise.resolve(response); + }); + export const updateChannel = (requestPayload: UpdateChannelRequestPayload) => async (dispatch: Dispatch) => HttpClientInstance.updateChannel(requestPayload).then((response: Channel) => { dispatch(setChannelAction(response)); return Promise.resolve(response); }); -export const disconnectChannel = (source: string, requestPayload: DisconnectChannelRequestPayload) => async ( - dispatch: Dispatch -) => - HttpClientInstance.disconnectChannel(source, requestPayload).then(() => { +export const disconnectChannel = (requestPayload: DisconnectChannelRequestPayload) => async (dispatch: Dispatch) => + HttpClientInstance.disconnectChannel(requestPayload).then(() => { dispatch(deleteChannelAction(requestPayload.channelId)); return Promise.resolve(true); }); diff --git a/frontend/ui/src/actions/config/index.ts b/frontend/ui/src/actions/config/index.ts index 647961b70e..583e5bc438 100644 --- a/frontend/ui/src/actions/config/index.ts +++ b/frontend/ui/src/actions/config/index.ts @@ -1,17 +1,15 @@ -import {ConfigPayload} from 'httpclient'; +import {Config} from 'httpclient'; import _, {Dispatch} from 'redux'; -import {createAction} from 'typesafe-actions'; +import _typesafe, {createAction} from 'typesafe-actions'; import {HttpClientInstance} from '../../InitializeAiryApi'; const ADD_SETTINGS_TO_STORE = 'ADD_CONFIG_TO_STORE'; -export const saveClientConfig = createAction(ADD_SETTINGS_TO_STORE, resolve => (config: ConfigPayload) => - resolve(config) -); +export const saveClientConfig = createAction(ADD_SETTINGS_TO_STORE, (config: Config) => config)(); export const getClientConfig = () => async (dispatch: Dispatch) => { - return HttpClientInstance.getConfig().then((response: ConfigPayload) => { + return HttpClientInstance.getConfig().then((response: Config) => { dispatch(saveClientConfig(response)); return Promise.resolve(true); }); diff --git a/frontend/ui/src/actions/conversations/index.ts b/frontend/ui/src/actions/conversations/index.ts index 54646fcc34..dc8ffbb0ed 100644 --- a/frontend/ui/src/actions/conversations/index.ts +++ b/frontend/ui/src/actions/conversations/index.ts @@ -1,6 +1,6 @@ import {Dispatch} from 'redux'; -import {createAction} from 'typesafe-actions'; -import {Conversation, PaginatedResponse} from 'httpclient'; +import _typesafe, {createAction} from 'typesafe-actions'; +import {Conversation, Pagination, PaginatedResponse} from 'httpclient'; import {HttpClientInstance} from '../../InitializeAiryApi'; import {StateModel} from '../../reducers'; import {mergeMetadataAction, setMetadataAction} from '../metadata'; @@ -10,44 +10,42 @@ const CONVERSATIONS_LOADING = '@@conversations/LOADING'; const CONVERSATIONS_MERGE = '@@conversations/MERGE'; const CONVERSATION_ADD_ERROR = '@@conversations/ADD_ERROR_TO_CONVERSATION'; const CONVERSATION_REMOVE_ERROR = '@@conversations/REMOVE_ERROR_FROM_CONVERSATION'; -const CONVERSATION_ADD_TAG = '@@conversations/CONVERSATION_ADD_TAG'; const CONVERSATION_REMOVE_TAG = '@@conversations/CONVERSATION_REMOVE_TAG'; const CONVERSATION_UPDATE_PAGINATION_DATA = '@@conversation/UPDATE_PAGINATION_DATA'; -export const loadingConversationAction = createAction(CONVERSATION_LOADING, resolve => (conversationId: string) => - resolve(conversationId) -); +export const loadingConversationAction = createAction( + CONVERSATION_LOADING, + (conversationId: string) => conversationId +)(); -export const loadingConversationsAction = createAction(CONVERSATIONS_LOADING, resolve => () => resolve()); +export const loadingConversationsAction = createAction(CONVERSATIONS_LOADING)(); export const mergeConversationsAction = createAction( CONVERSATIONS_MERGE, - resolve => ( - conversations: Conversation[], - paginationData?: {previousCursor: string; nextCursor: string; total: number} - ) => resolve({conversations, paginationData}) -); + (conversations: Conversation[], paginationData?: Pagination) => ({ + conversations, + paginationData, + }) +)<{conversations: Conversation[]; paginationData: Pagination}>(); export const addErrorToConversationAction = createAction( CONVERSATION_ADD_ERROR, - resolve => (conversationId: string, errorMessage: string) => resolve({conversationId, errorMessage}) -); + (conversationId: string, errorMessage: string) => ({conversationId, errorMessage}) +)<{conversationId: string; errorMessage: string}>(); -export const removeErrorFromConversationAction = createAction( - CONVERSATION_REMOVE_ERROR, - resolve => (conversationId: string) => resolve({conversationId}) -); +export const removeErrorFromConversationAction = createAction(CONVERSATION_REMOVE_ERROR, (conversationId: string) => ({ + conversationId, +}))<{conversationId: string}>(); export const removeTagFromConversationAction = createAction( CONVERSATION_REMOVE_TAG, - resolve => (conversationId: string, tagId: string) => resolve({conversationId, tagId}) -); + (conversationId: string, tagId: string) => ({conversationId, tagId}) +)<{conversationId: string; tagId: string}>(); export const updateMessagesPaginationDataAction = createAction( CONVERSATION_UPDATE_PAGINATION_DATA, - resolve => (conversationId: string, paginationData: {previousCursor: string; nextCursor: string; total: number}) => - resolve({conversationId, paginationData}) -); + (conversationId: string, paginationData: Pagination) => ({conversationId, paginationData}) +)<{conversationId: string; paginationData: Pagination}>(); export const listConversations = () => async (dispatch: Dispatch) => { dispatch(loadingConversationsAction()); diff --git a/frontend/ui/src/actions/conversationsFilter/index.ts b/frontend/ui/src/actions/conversationsFilter/index.ts index 5f9db8e96f..fd9f8833f6 100644 --- a/frontend/ui/src/actions/conversationsFilter/index.ts +++ b/frontend/ui/src/actions/conversationsFilter/index.ts @@ -1,6 +1,6 @@ import {Dispatch} from 'redux'; -import {createAction} from 'typesafe-actions'; -import {Conversation, ConversationFilter, PaginatedResponse} from 'httpclient'; +import _typesafe, {createAction} from 'typesafe-actions'; +import {Conversation, ConversationFilter, PaginatedResponse, Pagination} from 'httpclient'; import {HttpClientInstance} from '../../InitializeAiryApi'; import {StateModel} from '../../reducers'; @@ -12,27 +12,29 @@ export const SET_FILTERED_CONVERSATIONS = '@@conversations/SET_FILTERED'; export const MERGE_FILTERED_CONVERSATIONS = '@@conversations/MERGE_FILTERED'; export const UPDATE_CONVERSATION_FILTER = '@@conversation/UPDATE_FILTER'; -export const resetFilteredConversationAction = createAction(RESET_FILTERED_CONVERSATIONS); +export const resetFilteredConversationAction = createAction(RESET_FILTERED_CONVERSATIONS)(); export const setFilteredConversationsAction = createAction( SET_FILTERED_CONVERSATIONS, - resolve => ( - conversations: Conversation[], - filter: ConversationFilter, - paginationData: {previousCursor: string; nextCursor: string; total: number} - ) => resolve({conversations, filter, paginationData}) -); + (conversations: Conversation[], filter: ConversationFilter, paginationData: Pagination) => ({ + conversations, + filter, + paginationData, + }) +)<{conversations: Conversation[]; filter: ConversationFilter; paginationData: Pagination}>(); + export const mergeFilteredConversationsAction = createAction( MERGE_FILTERED_CONVERSATIONS, - resolve => ( + ( conversations: Conversation[], filter: ConversationFilter, paginationData: {previousCursor: string; nextCursor: string; total: number} - ) => resolve({conversations, filter, paginationData}) -); + ) => ({conversations, filter, paginationData}) +)<{conversations: Conversation[]; filter: ConversationFilter; paginationData: Pagination}>(); + export const updateFilteredConversationsAction = createAction( UPDATE_CONVERSATION_FILTER, - resolve => (filter: ConversationFilter) => resolve({filter}) -); + (filter: ConversationFilter) => ({filter}) +)<{filter: ConversationFilter}>(); export const setSearch = (currentFilter: ConversationFilter, displayName: string) => { return setFilter({ diff --git a/frontend/ui/src/actions/index.ts b/frontend/ui/src/actions/index.ts index 3a407a423d..2cf8f9fc48 100644 --- a/frontend/ui/src/actions/index.ts +++ b/frontend/ui/src/actions/index.ts @@ -5,3 +5,4 @@ export * from './conversationsFilter'; export * from './settings'; export * from './tags'; export * from './user'; +export * from './templates'; diff --git a/frontend/ui/src/actions/messages/index.ts b/frontend/ui/src/actions/messages/index.ts index 701ae19d54..177a164eac 100644 --- a/frontend/ui/src/actions/messages/index.ts +++ b/frontend/ui/src/actions/messages/index.ts @@ -1,5 +1,5 @@ import {Dispatch} from 'redux'; -import {createAction} from 'typesafe-actions'; +import _typesafe, {createAction} from 'typesafe-actions'; import {Message, PaginatedResponse, SendMessagesRequestPayload} from 'httpclient'; import {HttpClientInstance} from '../../InitializeAiryApi'; import {StateModel} from '../../reducers'; @@ -10,12 +10,13 @@ const MESSAGES_ADDED = '@@messages/ADDED'; export const loadingMessagesAction = createAction( MESSAGES_LOADING, - resolve => (messagesInfo: {conversationId: string; messages: Message[]}) => resolve(messagesInfo) -); + (messagesInfo: {conversationId: string; messages: Message[]}) => messagesInfo +)<{conversationId: string; messages: Message[]}>(); + export const addMessagesAction = createAction( MESSAGES_ADDED, - resolve => (messagesInfo: {conversationId: string; messages: Message[]}) => resolve(messagesInfo) -); + (messagesInfo: {conversationId: string; messages: Message[]}) => messagesInfo +)<{conversationId: string; messages: Message[]}>(); export function listMessages(conversationId: string) { return async (dispatch: Dispatch) => { diff --git a/frontend/ui/src/actions/metadata/index.ts b/frontend/ui/src/actions/metadata/index.ts index 22fa5866a9..eae68973f4 100644 --- a/frontend/ui/src/actions/metadata/index.ts +++ b/frontend/ui/src/actions/metadata/index.ts @@ -1,13 +1,15 @@ -import {createAction} from 'typesafe-actions'; +import _typesafe, {createAction} from 'typesafe-actions'; import {MetadataEvent} from 'httpclient'; const MERGE_METADATA = '@@metadata/MERGE_METADATA'; const SET_METADATA = '@@metadata/SET_METADATA'; -export const setMetadataAction = createAction(SET_METADATA, resolve => (metadataEvent: MetadataEvent) => - resolve(metadataEvent) -); +export const setMetadataAction = createAction( + SET_METADATA, + (metadataEvent: MetadataEvent) => metadataEvent +)(); -export const mergeMetadataAction = createAction(MERGE_METADATA, resolve => (metadataEvent: MetadataEvent) => - resolve(metadataEvent) -); +export const mergeMetadataAction = createAction( + MERGE_METADATA, + (metadataEvent: MetadataEvent) => metadataEvent +)(); diff --git a/frontend/ui/src/actions/settings/index.tsx b/frontend/ui/src/actions/settings/index.tsx index a6d9b1d8c7..7e5f9a2648 100644 --- a/frontend/ui/src/actions/settings/index.tsx +++ b/frontend/ui/src/actions/settings/index.tsx @@ -1,9 +1,10 @@ import _, {Dispatch} from 'redux'; +import _typesafe, {createAction} from 'typesafe-actions'; import {fakeData} from '../../pages/Tags/FAKESETTINGS'; -import {createAction} from 'typesafe-actions'; +import {Settings} from '../../reducers/data/settings'; const ADD_SETTINGS_TO_STORE = 'ADD_SETTINGS_TO_STORE'; -export const fetchSettings = createAction(ADD_SETTINGS_TO_STORE, resolve => () => resolve(fakeData())); +export const fetchSettings = createAction(ADD_SETTINGS_TO_STORE, () => fakeData())(); export const fakeSettingsAPICall = () => (dispatch: Dispatch) => dispatch(fetchSettings()); diff --git a/frontend/ui/src/actions/tags/index.tsx b/frontend/ui/src/actions/tags/index.tsx index b18ad2a578..027496b04c 100644 --- a/frontend/ui/src/actions/tags/index.tsx +++ b/frontend/ui/src/actions/tags/index.tsx @@ -1,5 +1,5 @@ import _, {Dispatch} from 'redux'; -import {createAction} from 'typesafe-actions'; +import _typesafe, {createAction} from 'typesafe-actions'; import {Tag, CreateTagRequestPayload} from 'httpclient'; import {HttpClientInstance} from '../../InitializeAiryApi'; @@ -11,12 +11,12 @@ const ERROR_TAG = 'ERROR_TAG'; const ADD_TAGS_TO_STORE = 'ADD_TAGS_TO_STORE'; const SET_TAG_FILTER = 'SET_TAG_FILTER'; -export const fetchTagAction = createAction(ADD_TAGS_TO_STORE, resolve => (tags: Tag[]) => resolve(tags)); -export const addTagAction = createAction(UPSERT_TAG, resolve => (tag: Tag) => resolve(tag)); -export const editTagAction = createAction(EDIT_TAG, resolve => (tag: Tag) => resolve(tag)); -export const deleteTagAction = createAction(DELETE_TAG, resolve => (id: string) => resolve(id)); -export const filterTagAction = createAction(SET_TAG_FILTER, resolve => (filter: string) => resolve(filter)); -export const errorTagAction = createAction(ERROR_TAG, resolve => (status: string) => resolve(status)); +export const fetchTagAction = createAction(ADD_TAGS_TO_STORE, (tags: Tag[]) => tags)(); +export const addTagAction = createAction(UPSERT_TAG, (tag: Tag) => tag)(); +export const editTagAction = createAction(EDIT_TAG, (tag: Tag) => tag)(); +export const deleteTagAction = createAction(DELETE_TAG, (id: string) => id)(); +export const filterTagAction = createAction(SET_TAG_FILTER, (filter: string) => filter)(); +export const errorTagAction = createAction(ERROR_TAG, (status: string) => status)(); export function listTags() { return function (dispatch: Dispatch) { diff --git a/frontend/ui/src/actions/templates/index.ts b/frontend/ui/src/actions/templates/index.ts new file mode 100644 index 0000000000..94a68f360b --- /dev/null +++ b/frontend/ui/src/actions/templates/index.ts @@ -0,0 +1,21 @@ +import _, {Dispatch} from 'redux'; +import _typesafe, {createAction} from 'typesafe-actions'; + +import {ListTemplatesRequestPayload, Template} from 'httpclient'; +import {HttpClientInstance} from '../../InitializeAiryApi'; + +const LIST_TEMPLATES = 'LIST_TEMPLATES'; + +export const listTemplatesAction = createAction(LIST_TEMPLATES, (templates: Template[]) => templates)(); + +export function listTemplates(requestPayload: ListTemplatesRequestPayload) { + return function (dispatch: Dispatch) { + return HttpClientInstance.listTemplates(requestPayload).then((response: Template[]) => { + if (response.length > 0) { + dispatch(listTemplatesAction(response)); + } + + return Promise.resolve(true); + }); + }; +} diff --git a/frontend/ui/src/actions/user/index.ts b/frontend/ui/src/actions/user/index.ts index 8687d6999e..193a2eb9c6 100644 --- a/frontend/ui/src/actions/user/index.ts +++ b/frontend/ui/src/actions/user/index.ts @@ -1,4 +1,4 @@ -import {createAction} from 'typesafe-actions'; +import _typesafe, {createAction} from 'typesafe-actions'; import _, {Dispatch} from 'redux'; import {User, LoginViaEmailRequestPayload} from 'httpclient'; @@ -9,9 +9,9 @@ const SET_CURRENT_USER = '@@auth/SET_CURRENT_USER'; const USER_AUTH_ERROR = '@@auth/ERROR'; const USER_LOGOUT = '@@auth/LOGOUT_USER'; -export const setCurrentUserAction = createAction(SET_CURRENT_USER, resolve => (user: User) => resolve(user)); -export const userAuthErrorAction = createAction(USER_AUTH_ERROR, resolve => (error: Error) => resolve(error)); -export const logoutUserAction = createAction(USER_LOGOUT); +export const setCurrentUserAction = createAction(SET_CURRENT_USER, (user: User) => user)(); +export const userAuthErrorAction = createAction(USER_AUTH_ERROR, (error: Error) => error)(); +export const logoutUserAction = createAction(USER_LOGOUT)(); export function loginViaEmail(requestPayload: LoginViaEmailRequestPayload) { return async (dispatch: Dispatch) => { diff --git a/frontend/ui/src/components/IconChannel/index.tsx b/frontend/ui/src/components/IconChannel/index.tsx index 0076e9df4b..d226706734 100644 --- a/frontend/ui/src/components/IconChannel/index.tsx +++ b/frontend/ui/src/components/IconChannel/index.tsx @@ -50,12 +50,12 @@ const SOURCE_INFO = { avatar: () => , }, 'twilio.whatsapp': { - text: 'Whatsapp number', + text: 'WhatsApp number', icon: () => , avatar: () => , }, - chat_plugin: { - text: 'Airy Chat plugin', + chatplugin: { + text: 'Airy Live Chat plugin', icon: () => , avatar: () => , }, @@ -72,8 +72,7 @@ const IconChannel: React.FC = ({ channel = PlaceholderChannelData; } - //TODO: This has to go once the backend returns the source - const channelInfo = SOURCE_INFO[channel.source || 'chat_plugin']; + const channelInfo = SOURCE_INFO[channel.source]; const fbFallback = SOURCE_INFO['facebook']; if (icon && showName) { @@ -83,35 +82,47 @@ const IconChannel: React.FC = ({

{channel.metadata?.name}

); - } else if (showAvatar && showName) { + } + + if (showAvatar && showName) { return (
{channelInfo.avatar()}

{channel.metadata?.name}

); - } else if (icon && text) { + } + + if (icon && text) { return (
{channelInfo.icon()}

{channelInfo.text}

); - } else if (showAvatar && text) { + } + + if (showAvatar && text) { return (
{channelInfo.avatar()}

{channelInfo.text}

); - } else if (icon) { + } + + if (icon) { return <>{channelInfo.icon()}; - } else if (showAvatar) { + } + + if (showAvatar) { return <>{channelInfo.avatar()}; } + return ( <> - {fbFallback.icon()} {fbFallback.text} + {' '} + {fbFallback.icon()} {fbFallback.text}{' '} ); }; diff --git a/frontend/ui/src/components/IconChannelFilter/index.tsx b/frontend/ui/src/components/IconChannelFilter/index.tsx index 2c8ebe0a5c..1502137121 100644 --- a/frontend/ui/src/components/IconChannelFilter/index.tsx +++ b/frontend/ui/src/components/IconChannelFilter/index.tsx @@ -6,12 +6,14 @@ import {ReactComponent as GoogleIcon} from 'assets/images/icons/google_avatar.sv import {ReactComponent as WhatsappIcon} from 'assets/images/icons/whatsapp_avatar.svg'; import {ReactComponent as SmsIcon} from 'assets/images/icons/sms_avatar.svg'; import {ReactComponent as FacebookIcon} from 'assets/images/icons/messenger_avatar.svg'; +import {ReactComponent as AiryAvatar} from 'assets/images/icons/airy_avatar.svg'; const sourceIconsMap = { google: GoogleIcon, facebook: FacebookIcon, 'twilio.sms': SmsIcon, 'twilio.whatsapp': WhatsappIcon, + chatplugin: AiryAvatar, }; export const IconChannelFilter = ({channel}: {channel: Channel}) => { diff --git a/frontend/ui/src/env.ts b/frontend/ui/src/env.ts index 0e46eb65ed..80426cf545 100644 --- a/frontend/ui/src/env.ts +++ b/frontend/ui/src/env.ts @@ -1,6 +1,5 @@ export interface Env { API_HOST?: string; - CHATPLUGIN_HOST?: string; } declare const window: { @@ -10,6 +9,5 @@ declare const window: { const templatedState: Env = window.AIRY_TEMPLATED_STATE || {}; export const env: Env = { - API_HOST: templatedState.API_HOST || 'api.airy', - CHATPLUGIN_HOST: templatedState.CHATPLUGIN_HOST || 'chatplugin.airy', + API_HOST: templatedState.API_HOST || 'airy.core', }; diff --git a/frontend/ui/src/index.tsx b/frontend/ui/src/index.tsx index 4794b4ff67..c108705083 100644 --- a/frontend/ui/src/index.tsx +++ b/frontend/ui/src/index.tsx @@ -14,7 +14,7 @@ const render = async () => { const App = (await import('./App')).default; const RootContainer = () => ( - + diff --git a/frontend/ui/src/pages/Channels/ChannelsMainPage/SourceDescription/index.module.scss b/frontend/ui/src/pages/Channels/ChannelsMainPage/SourceDescription/index.module.scss index 3dea73718c..9a7f2e2682 100644 --- a/frontend/ui/src/pages/Channels/ChannelsMainPage/SourceDescription/index.module.scss +++ b/frontend/ui/src/pages/Channels/ChannelsMainPage/SourceDescription/index.module.scss @@ -90,3 +90,11 @@ box-shadow: 0px 0px 0px 3px var(--color-background-blue); } } + +.requirementsDialog { + z-index: 1; + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); +} diff --git a/frontend/ui/src/pages/Channels/ChannelsMainPage/SourceDescription/index.tsx b/frontend/ui/src/pages/Channels/ChannelsMainPage/SourceDescription/index.tsx index 93d0a1c52a..1d14615170 100644 --- a/frontend/ui/src/pages/Channels/ChannelsMainPage/SourceDescription/index.tsx +++ b/frontend/ui/src/pages/Channels/ChannelsMainPage/SourceDescription/index.tsx @@ -7,12 +7,14 @@ type SourceDescriptionProps = { title: string; text: string; displayButton: boolean; + id: string; onAddChannelClick?: () => void; }; const SourceDescription = (props: SourceDescriptionProps) => { return ( <> +
{props.image}
diff --git a/frontend/ui/src/pages/Channels/ChannelsMainPage/SourceInfo/index.module.scss b/frontend/ui/src/pages/Channels/ChannelsMainPage/SourceInfo/index.module.scss index e033a962db..d8e9b1edce 100644 --- a/frontend/ui/src/pages/Channels/ChannelsMainPage/SourceInfo/index.module.scss +++ b/frontend/ui/src/pages/Channels/ChannelsMainPage/SourceInfo/index.module.scss @@ -1,6 +1,5 @@ @import '../../../../assets/scss/fonts'; @import '../../../../assets/scss/colors'; - .connectedContainer { display: flex; flex-direction: column; @@ -8,12 +7,10 @@ height: 120px; margin-bottom: 10px; } - .connectedSum { margin-left: 16px; color: var(--color-text-gray); } - .connectedChannelBox { display: flex; box-sizing: border-box; @@ -24,8 +21,18 @@ border-radius: 8px; background-color: #ffffff; margin-left: 12px; -} + position: relative; + &:hover { + background-color: var(--color-background-blue); + box-shadow: -0.5px 2px 3px 0px var(--color-light-gray); + cursor: pointer; + button { + background-color: var(--color-background-blue); + cursor: pointer; + } + } +} .connectedChannel { display: flex; flex-wrap: wrap; @@ -42,10 +49,10 @@ max-width: 142px; text-overflow: ellipsis; } - .extraChannel { display: flex; min-width: 88px; + width: 100%; min-height: 20px; padding: 0 24px 0 24px; cursor: pointer; @@ -57,12 +64,15 @@ .connectedChannelData { @include font-base; display: flex; + align-items: center; margin: 4px; align-items: flex-start; border: none; + outline: none; background-color: inherit; text-align: left; cursor: pointer; + outline: none; &:hover { text-decoration: underline; @@ -72,7 +82,6 @@ .channelListEntry { display: inline-flex; } - .placeholderLogo { height: 24px; width: 24px; @@ -81,7 +90,6 @@ width: 24px; } } - .facebookImage { height: 20px; width: 20px; @@ -105,7 +113,6 @@ .channelButton { margin: 20px 0px 8px 0px; } - .addChannelButton { position: relative; width: 40px; @@ -118,7 +125,6 @@ outline: none; cursor: pointer; } - .channelButtonIcon { @include font-m; display: flex; @@ -131,7 +137,6 @@ border-radius: 50%; color: var(--color-text-gray); cursor: pointer; - svg { height: 30px; width: 30px; @@ -143,6 +148,5 @@ &:hover { color: var(--color-airy-blue); background-color: var(--color-background-blue); - box-shadow: 0px 0px 0px 3px var(--color-background-blue); } } diff --git a/frontend/ui/src/pages/Channels/ChannelsMainPage/SourceInfo/index.tsx b/frontend/ui/src/pages/Channels/ChannelsMainPage/SourceInfo/index.tsx index 4a95225ceb..d4b3a7ad8a 100644 --- a/frontend/ui/src/pages/Channels/ChannelsMainPage/SourceInfo/index.tsx +++ b/frontend/ui/src/pages/Channels/ChannelsMainPage/SourceInfo/index.tsx @@ -13,18 +13,16 @@ type SourceInfoProps = { onAddChannelClick?: () => void; onMoreChannelsClick?: () => void; onChannelClick?: (channel: Channel) => void; + onSourceInfoClick?: () => void; }; const SourceInfo = (props: SourceInfoProps) => { const {source, channels} = props; - const isPhoneNumberSource = () => { return source === 'twilio.sms' || source === 'twilio.whatsapp'; }; - const channelsToShow = isPhoneNumberSource() ? 2 : 4; const hasExtraChannels = channels.length > channelsToShow; - return ( <> {channels && channels.length > 0 && ( @@ -41,7 +39,7 @@ const SourceInfo = (props: SourceInfoProps) => { return (
  • -
    +
    {hasExtraChannels && ( - + +{channels.length - channelsToShow} {props.isConnected} )} @@ -81,5 +79,4 @@ const SourceInfo = (props: SourceInfoProps) => { ); }; - export default SourceInfo; diff --git a/frontend/ui/src/pages/Channels/ChannelsMainPage/Sources/ChatPluginConnect.tsx b/frontend/ui/src/pages/Channels/ChannelsMainPage/Sources/ChatPluginConnect.tsx index 14c74a3711..3649c72496 100644 --- a/frontend/ui/src/pages/Channels/ChannelsMainPage/Sources/ChatPluginConnect.tsx +++ b/frontend/ui/src/pages/Channels/ChannelsMainPage/Sources/ChatPluginConnect.tsx @@ -8,7 +8,7 @@ import {ReactComponent as AiryLogo} from 'assets/images/icons/airy_avatar.svg'; import {ReactComponent as BackIcon} from 'assets/images/icons/arrow-left-2.svg'; import {env} from '../../../../env'; -import {CHANNELS_CHAT_PLUGIN_ROUTE} from '../../../../routes/routes'; +import {CHANNELS_CHAT_PLUGIN_ROUTE, CHANNELS_CONNECTED_ROUTE} from '../../../../routes/routes'; import {connectChatPlugin, updateChannel, disconnectChannel} from '../../../../actions/channel'; import {StateModel} from '../../../../reducers'; import {allChannels} from '../../../../selectors/channels'; @@ -49,9 +49,7 @@ const ChatPluginConnect = (props: ChatPluginProps) => { useEffect(() => { if (channelId !== 'new' && channelId?.length) { - const channel = props.channels.find((channel: Channel) => { - return channel.id === channelId; - }); + const channel = props.channels.find((channel: Channel) => channel.id === channelId); if (channel) { setDisplayName(channel.metadata?.name || ''); setImageUrl(channel.metadata?.imageUrl || ''); @@ -76,7 +74,7 @@ const ChatPluginConnect = (props: ChatPluginProps) => { const updateConnection = (event: FormEvent) => { event.preventDefault(); props.updateChannel({channelId: channelId, name: displayName, imageUrl: imageUrl}).then(() => { - props.history.replace(CHANNELS_CHAT_PLUGIN_ROUTE); + props.history.replace(CHANNELS_CONNECTED_ROUTE + '/chatplugin'); }); }; @@ -158,7 +156,7 @@ const ChatPluginConnect = (props: ChatPluginProps) => { (function(w, d, s, n) { w[n] = w[n] || {}; w[n].channelId = "${channelId}"; - w[n].host = "${'//' + env.CHATPLUGIN_HOST}"; + w[n].host = "${'//' + env.API_HOST}"; var f = d.getElementsByTagName(s)[0], j = d.createElement(s); j.async = true; @@ -216,7 +214,7 @@ const ChatPluginConnect = (props: ChatPluginProps) => { const disconnectChannel = (channel: Channel) => { if (window.confirm('Do you really want to delete this channel?')) { - props.disconnectChannel('chatplugin', {channelId: channel.id}); + props.disconnectChannel({source: 'chatplugin', channelId: channel.id}); } }; diff --git a/frontend/ui/src/pages/Channels/ChannelsMainPage/Sources/ChatPluginSource.tsx b/frontend/ui/src/pages/Channels/ChannelsMainPage/Sources/ChatPluginSource.tsx index 751d6cd8fb..c8e8efac9d 100644 --- a/frontend/ui/src/pages/Channels/ChannelsMainPage/Sources/ChatPluginSource.tsx +++ b/frontend/ui/src/pages/Channels/ChannelsMainPage/Sources/ChatPluginSource.tsx @@ -1,17 +1,17 @@ import React from 'react'; import {withRouter, RouteComponentProps} from 'react-router-dom'; -import {Channel} from 'httpclient'; - import {ReactComponent as AiryLogo} from 'assets/images/icons/airy_avatar.svg'; - +import {Channel} from 'httpclient'; import SourceInfo from '../SourceInfo'; import SourceDescription from '../SourceDescription'; +import {ChannelSource} from 'httpclient'; +import {CHANNELS_CONNECTED_ROUTE} from '../../../../routes/routes'; import {CHANNELS_CHAT_PLUGIN_ROUTE} from '../../../../routes/routes'; type ChatPluginProps = {pluginSource: Channel[]}; const ChatPluginSource = (props: ChatPluginProps & RouteComponentProps) => { - const channels = props.pluginSource.filter((channel: Channel) => channel.source === 'chat_plugin'); + const channels = props.pluginSource.filter((channel: Channel) => channel.source === 'chatplugin'); return (
    @@ -20,17 +20,24 @@ const ChatPluginSource = (props: ChatPluginProps & RouteComponentProps) => { text="Best of class browser messenger" image={} displayButton={!channels.length} + id={ChannelSource.chatPlugin} onAddChannelClick={() => { props.history.push(CHANNELS_CHAT_PLUGIN_ROUTE + '/new'); }} /> } isConnected="connected" + onSourceInfoClick={() => { + props.history.push({ + pathname: CHANNELS_CONNECTED_ROUTE + `/chatplugin`, + state: {source: 'chatplugin'}, + }); + }} onMoreChannelsClick={() => { props.history.push(CHANNELS_CHAT_PLUGIN_ROUTE); }} diff --git a/frontend/ui/src/pages/Channels/ChannelsMainPage/Sources/FacebookConnect.module.scss b/frontend/ui/src/pages/Channels/ChannelsMainPage/Sources/FacebookConnect.module.scss new file mode 100644 index 0000000000..7882e59cb1 --- /dev/null +++ b/frontend/ui/src/pages/Channels/ChannelsMainPage/Sources/FacebookConnect.module.scss @@ -0,0 +1,65 @@ +@import '../../../../assets/scss/fonts'; +@import '../../../../assets/scss/colors'; + +.wrapper { + background: white; + display: block; + border-radius: 10px; + padding-left: 96px; + padding-top: 88px; + width: 100%; + overflow-y: auto; + padding: 32px; + margin: 88px 1.5em 0 100px; + min-height: calc(100vh - 170px); +} + +.headline { + @include font-xl; + font-weight: bold; + margin-bottom: 8px; +} + +.backButton { + display: block; + margin-bottom: 16px; + cursor: pointer; + text-decoration: none; + &:hover { + text-decoration: underline; + } +} + +.backIcon { + path { + fill: var(--color-airy-blue); + } + margin-right: 8px; +} + +.inputContainer { + display: flex; + flex-direction: column; + margin-bottom: 32px; + width: 474px; + margin-top: 16px; + + label { + margin-top: 24px; + } + + input { + @include font-base; + } +} + +.subtitle { + display: flex; + flex-direction: column; + @include font-s; + color: var(--color-airy-blue); + img { + width: 17px; + height: 13px; + } +} diff --git a/frontend/ui/src/pages/Channels/ChannelsMainPage/Sources/FacebookConnect.tsx b/frontend/ui/src/pages/Channels/ChannelsMainPage/Sources/FacebookConnect.tsx new file mode 100644 index 0000000000..081c3be96a --- /dev/null +++ b/frontend/ui/src/pages/Channels/ChannelsMainPage/Sources/FacebookConnect.tsx @@ -0,0 +1,120 @@ +import React, {useEffect, useState} from 'react'; +import _, {connect, ConnectedProps} from 'react-redux'; +import styles from './FacebookConnect.module.scss'; +import {withRouter, RouteComponentProps} from 'react-router-dom'; +import {ReactComponent as BackIcon} from 'assets/images/icons/arrow-left-2.svg'; +import {CHANNELS_CONNECTED_ROUTE} from '../../../../routes/routes'; +import {Button, Input, LinkButton} from '@airyhq/components'; +import {connectFacebookChannel} from '../../../../actions/channel'; +import {StateModel} from '../../../../reducers'; +import {ConnectChannelFacebookRequestPayload} from 'httpclient'; + +type FacebookProps = { + channelId?: string; +} & RouteComponentProps<{channelId: string}> & + ConnectedProps; + +const mapStateToProps = (state: StateModel, props: RouteComponentProps<{channelId: string}>) => ({ + channel: state.data.channels[props.match.params.channelId], +}); + +const mapDispatchToProps = { + connectFacebookChannel, +}; + +const connector = connect(mapStateToProps, mapDispatchToProps); + +const FacebookConnect = (props: FacebookProps) => { + const {connectFacebookChannel, channel} = props; + const [id, setId] = useState(channel?.sourceChannelId || ''); + const [token, setToken] = useState(''); + const [name, setName] = useState(channel?.metadata?.name || ''); + const [image, setImage] = useState(channel?.metadata?.imageUrl || ''); + const [buttonTitle, setButtonTitle] = useState('Connect Page'); + const [errorMessage, setErrorMessage] = useState(''); + + const buttonStatus = () => { + return !(id.length > 5 && token != ''); + }; + + useEffect(() => { + if (channel) { + setButtonTitle('Update Page'); + } + }, []); + + const connectNewChannel = () => { + const connectPayload: ConnectChannelFacebookRequestPayload = { + pageId: id, + pageToken: token, + ...(name && + name !== '' && { + name, + }), + ...(image && + image !== '' && { + imageUrl: image, + }), + }; + + connectFacebookChannel(connectPayload) + .then(() => { + props.history.replace(CHANNELS_CONNECTED_ROUTE + '/facebook'); + }) + .catch(() => { + setErrorMessage('Please check entered value'); + }); + }; + + return ( +
    +

    Facebook Messenger

    + + + Back + +
    + ) => setId(event.target.value)} + minLength={6} + required={true} + height={33} + hint={errorMessage}> + ) => setToken(event.target.value)} + required={true} + height={33} + hint={errorMessage}> + ) => setName(event.target.value)} + height={33}> + ) => setImage(event.target.value)} + height={33}> +
    + +
    + ); +}; + +export default withRouter(connector(FacebookConnect)); diff --git a/frontend/ui/src/pages/Channels/ChannelsMainPage/Sources/FacebookSource.tsx b/frontend/ui/src/pages/Channels/ChannelsMainPage/Sources/FacebookSource.tsx index 24fa4c7e5d..4b90b02229 100644 --- a/frontend/ui/src/pages/Channels/ChannelsMainPage/Sources/FacebookSource.tsx +++ b/frontend/ui/src/pages/Channels/ChannelsMainPage/Sources/FacebookSource.tsx @@ -1,12 +1,19 @@ import React from 'react'; +import {withRouter, RouteComponentProps} from 'react-router-dom'; import {ReactComponent as FacebookLogo} from 'assets/images/icons/messenger_avatar.svg'; import {Channel} from 'httpclient'; import SourceDescription from '../SourceDescription'; import SourceInfo from '../SourceInfo'; +import {ChannelSource} from 'httpclient'; +import {CHANNELS_FACEBOOK_ROUTE} from '../../../../routes/routes'; +import {CHANNELS_CONNECTED_ROUTE} from '../../../../routes/routes'; -type FacebookSourceProps = {facebookSource: Channel[]}; +type FacebookSourceProps = { + facebookSource: Channel[]; + showDialogAction: (source: string) => void; +}; -const FacebookSource = (props: FacebookSourceProps) => { +const FacebookSource = (props: FacebookSourceProps & RouteComponentProps) => { const channels = props.facebookSource.filter((channel: Channel) => channel.source === 'facebook'); return ( @@ -16,11 +23,30 @@ const FacebookSource = (props: FacebookSourceProps) => { text="Connect multiple Facebook pages" image={} displayButton={!channels.length} + id={ChannelSource.facebook} + onAddChannelClick={() => props.showDialogAction(ChannelSource.facebook)} /> - + props.history.push(CHANNELS_FACEBOOK_ROUTE)} + onChannelClick={(channel: Channel) => { + props.history.push({ + pathname: CHANNELS_FACEBOOK_ROUTE + `/${channel.id}`, + state: {channel: channel}, + }); + }} + onSourceInfoClick={() => { + props.history.push({ + pathname: CHANNELS_CONNECTED_ROUTE + `/facebook`, + }); + }} + />
    ); }; -export default FacebookSource; +export default withRouter(FacebookSource); diff --git a/frontend/ui/src/pages/Channels/ChannelsMainPage/Sources/GoogleSource.tsx b/frontend/ui/src/pages/Channels/ChannelsMainPage/Sources/GoogleSource.tsx index 5e914d8e96..2b966f058a 100644 --- a/frontend/ui/src/pages/Channels/ChannelsMainPage/Sources/GoogleSource.tsx +++ b/frontend/ui/src/pages/Channels/ChannelsMainPage/Sources/GoogleSource.tsx @@ -3,6 +3,7 @@ import {ReactComponent as GoogleLogo} from 'assets/images/icons/google_avatar.sv import {Channel} from 'httpclient'; import SourceDescription from '../SourceDescription'; import SourceInfo from '../SourceInfo'; +import {ChannelSource} from 'httpclient'; type GoogleSourceProps = {googleSource: Channel[]}; @@ -16,6 +17,7 @@ const GoogleSource = (props: GoogleSourceProps) => { text="Be there when people search" image={} displayButton={!channels.length} + id={ChannelSource.google} /> ) => ({ + channels: Object.values(allChannels(state)), + channel: state.data.channels[props.match.params.channelId], +}); +const connector = connect(mapStateToProps, mapDispatchToProps); + +type TwilioSmsProps = {channelId?: string} & ConnectedProps & + RouteComponentProps; + +const TwilioSmsConnect = (props: TwilioSmsProps) => { + const {channel} = props; + const [smsNumberInput, setSmsNumberInput] = useState(channel?.sourceChannelId || ''); + const [smsNameInput, setSmsNameInput] = useState(channel?.metadata?.name || ''); + const [smsUrlInput, setSmsUrlInput] = useState(channel?.metadata?.imageUrl || ''); + const [buttonTitle, setButtonTitle] = useState('Connect Sms Number'); + const channelId = props.match.params.channelId; + + useEffect(() => { + if (channel) { + setButtonTitle('Update Sms Number'); + } + }, []); + + useEffect(() => { + if (channelId !== 'new_account' && channelId?.length) { + props.channels.find((channel: Channel) => { + return channel.id === channelId; + }); + } + }, [props.channels, channelId]); + + const handleNumberInput = (e: React.ChangeEvent): void => { + setSmsNumberInput(e.target.value); + }; + + const handleNameInput = (e: React.ChangeEvent): void => { + setSmsNameInput(e.target.value); + }; + + const handleUrlInput = (e: React.ChangeEvent): void => { + setSmsUrlInput(e.target.value); + }; + + const sendTwilioSmsData = () => { + props + .connectTwilioSms({ + sourceChannelId: smsNumberInput, + name: smsNameInput, + imageUrl: smsUrlInput, + }) + .then(() => { + props.history.replace(CHANNELS_CONNECTED_ROUTE + `/twilio.sms/#`); + }); + }; + + const connectTwilioSms = (e: React.ChangeEvent): void => { + e.preventDefault(); + sendTwilioSmsData(); + }; + + return ( +
    +

    SMS

    + + + Back + + + +
    + ); +}; + +export default connector(withRouter(TwilioSmsConnect)); diff --git a/frontend/ui/src/pages/Channels/ChannelsMainPage/Sources/TwilioSmsSource.tsx b/frontend/ui/src/pages/Channels/ChannelsMainPage/Sources/TwilioSmsSource.tsx index 64db9a4d8e..0d5b586be5 100644 --- a/frontend/ui/src/pages/Channels/ChannelsMainPage/Sources/TwilioSmsSource.tsx +++ b/frontend/ui/src/pages/Channels/ChannelsMainPage/Sources/TwilioSmsSource.tsx @@ -1,32 +1,52 @@ import React from 'react'; +import {withRouter, RouteComponentProps} from 'react-router-dom'; import {ReactComponent as SMSLogo} from 'assets/images/icons/sms_avatar.svg'; import {Channel} from 'httpclient'; +import {CHANNELS_CONNECTED_ROUTE} from '../../../../routes/routes'; import SourceDescription from '../SourceDescription'; import SourceInfo from '../SourceInfo'; +import {CHANNELS_TWILIO_SMS_ROUTE} from '../../../../routes/routes'; +import {ChannelSource} from 'httpclient'; -type TwilioSmsSourceProps = {twilloSmsSource: Channel[]}; +type TwilioSmsSourceProps = {twilioSmsSource: Channel[]; showDialogAction: (source: string) => void}; -const TwilioSmsSource = (props: TwilioSmsSourceProps) => { - const channels = props.twilloSmsSource.filter((channel: Channel) => channel.source === 'twilio.sms'); +const TwilioSmsSource = (props: TwilioSmsSourceProps & RouteComponentProps) => { + const channels = props.twilioSmsSource.filter((channel: Channel) => channel.source === 'twilio.sms'); return ( -
    - } - displayButton={!channels.length} - /> + <> +
    + } + displayButton={!channels.length} + id={ChannelSource.twilioSMS} + onAddChannelClick={() => props.showDialogAction(ChannelSource.twilioSMS)} + /> - } - isConnected="connected" - /> -
    + } + isConnected="connected" + onSourceInfoClick={() => { + props.history.push({ + pathname: CHANNELS_CONNECTED_ROUTE + `/twilio.sms/#`, + state: {source: 'twilio.sms'}, + }); + }} + onChannelClick={(channel: Channel) => { + props.history.push(CHANNELS_TWILIO_SMS_ROUTE + `/${channel.id}`); + }} + onAddChannelClick={() => { + props.history.push(CHANNELS_TWILIO_SMS_ROUTE + '/new_account'); + }} + /> +
    + ); }; -export default TwilioSmsSource; +export default withRouter(TwilioSmsSource); diff --git a/frontend/ui/src/pages/Channels/ChannelsMainPage/Sources/TwilioWhatsAppSource.tsx b/frontend/ui/src/pages/Channels/ChannelsMainPage/Sources/TwilioWhatsAppSource.tsx index 12111d14e0..9cfef85f68 100644 --- a/frontend/ui/src/pages/Channels/ChannelsMainPage/Sources/TwilioWhatsAppSource.tsx +++ b/frontend/ui/src/pages/Channels/ChannelsMainPage/Sources/TwilioWhatsAppSource.tsx @@ -1,32 +1,51 @@ import React from 'react'; +import {RouteComponentProps, withRouter} from 'react-router-dom'; import {ReactComponent as WhatsappLogo} from 'assets/images/icons/whatsapp_avatar.svg'; import {Channel} from 'httpclient'; import SourceDescription from '../SourceDescription'; import SourceInfo from '../SourceInfo'; +import {ChannelSource} from 'httpclient'; +import {CHANNELS_CONNECTED_ROUTE, CHANNELS_TWILIO_WHATSAPP_ROUTE} from '../../../../routes/routes'; -type TwilioWhatsAppSourceProps = {whatsappSmsSource: Channel[]}; +type TwilioWhatsAppSourceProps = {whatsappSmsSource: Channel[]; showDialogAction: (source: string) => void}; -const TwilioWhatsAppSource = (props: TwilioWhatsAppSourceProps) => { +const TwilioWhatsAppSource = (props: TwilioWhatsAppSourceProps & RouteComponentProps) => { const channels = props.whatsappSmsSource.filter((channel: Channel) => channel.source === 'twilio.whatsapp'); return ( -
    - } - displayButton={!channels.length} - /> + <> +
    + } + displayButton={!channels.length} + id={ChannelSource.twilioWhatsapp} + onAddChannelClick={() => props.showDialogAction(ChannelSource.twilioWhatsapp)} + /> - } - isConnected="connected" - /> -
    + } + isConnected="connected" + onSourceInfoClick={() => { + props.history.push({ + pathname: CHANNELS_CONNECTED_ROUTE + `/twilio.whatsapp/#`, + state: {source: 'twilio.whatsapp'}, + }); + }} + onChannelClick={(channel: Channel) => { + props.history.push(CHANNELS_TWILIO_WHATSAPP_ROUTE + `/${channel.id}`); + }} + onAddChannelClick={() => { + props.history.push(CHANNELS_TWILIO_WHATSAPP_ROUTE + '/new_account'); + }} + /> +
    + ); }; -export default TwilioWhatsAppSource; +export default withRouter(TwilioWhatsAppSource); diff --git a/frontend/ui/src/pages/Channels/ChannelsMainPage/Sources/TwilioWhatsappConnect.tsx b/frontend/ui/src/pages/Channels/ChannelsMainPage/Sources/TwilioWhatsappConnect.tsx new file mode 100644 index 0000000000..bf58d03255 --- /dev/null +++ b/frontend/ui/src/pages/Channels/ChannelsMainPage/Sources/TwilioWhatsappConnect.tsx @@ -0,0 +1,113 @@ +import React, {useState, useEffect} from 'react'; +import styles from './TwilioSmsConnect.module.scss'; +import {connect, ConnectedProps} from 'react-redux'; +import {withRouter, RouteComponentProps} from 'react-router-dom'; +import {ReactComponent as BackIcon} from 'assets/images/icons/arrow-left-2.svg'; +import {Channel} from 'httpclient'; +import {CHANNELS_CONNECTED_ROUTE} from '../../../../routes/routes'; +import {connectTwilioWhatsapp} from '../../../../actions/channel'; +import {StateModel} from '../../../../reducers'; +import SmsWhatsappForm from '../../Twilio/SmsWhatsappForm'; +import {allChannels} from '../../../../selectors/channels'; +import {LinkButton} from '@airyhq/components'; +interface TwilioWhatsappRouterProps { + channelId?: string; +} +const mapDispatchToProps = {connectTwilioWhatsapp}; +const mapStateToProps = (state: StateModel, props: RouteComponentProps<{channelId: string}>) => ({ + channels: Object.values(allChannels(state)), + channel: state.data.channels[props.match.params.channelId], +}); +const connector = connect(mapStateToProps, mapDispatchToProps); + +type TwilioWhatsappProps = {channelId?: string} & ConnectedProps & + RouteComponentProps; + +const TwilioWhatsappConnect = (props: TwilioWhatsappProps) => { + const {channel} = props; + const [whatsappNumberInput, setWhatsappNumberInput] = useState(channel?.sourceChannelId || ''); + const [whatsappNameInput, setWhatsappNameInput] = useState(channel?.metadata?.name || ''); + const [whatsappUrlInput, setWhatsappUrlInput] = useState(channel?.metadata?.imageUrl || ''); + const [buttonTitle, setButtonTitle] = useState('Connect Whatsapp Number'); + const channelId = props.match.params.channelId; + + useEffect(() => { + if (channel) { + setButtonTitle('Update Whatsapp Number'); + } + }, []); + + useEffect(() => { + if (channelId !== 'new_account') { + props.channels.find((channel: Channel) => { + return channel.id === channelId; + }); + } + }, [props.channels, channelId]); + + const handleNumberInput = (e: React.ChangeEvent): void => { + setWhatsappNumberInput(e.target.value); + }; + + const handleNameInput = (e: React.ChangeEvent): void => { + setWhatsappNameInput(e.target.value); + }; + + const handleUrlInput = (e: React.ChangeEvent): void => { + setWhatsappUrlInput(e.target.value); + }; + + const sendTwilioWhatsappData = () => { + props + .connectTwilioWhatsapp({ + sourceChannelId: whatsappNumberInput, + name: whatsappNameInput, + imageUrl: whatsappUrlInput, + }) + .then(() => { + props.history.replace({ + pathname: CHANNELS_CONNECTED_ROUTE + `/twilio.whatsapp/#`, + state: {source: 'twilio.whatsapp'}, + }); + }); + }; + + const connectTwilioWhatsapp = (e: React.ChangeEvent): void => { + e.preventDefault(); + sendTwilioWhatsappData(); + }; + + return ( +
    +

    WhatsApp

    + + + + Back + + + +
    + ); +}; + +export default connector(withRouter(TwilioWhatsappConnect)); diff --git a/frontend/ui/src/pages/Channels/ChannelsMainPage/index.tsx b/frontend/ui/src/pages/Channels/ChannelsMainPage/index.tsx index a60bbfeb1a..3861d765c6 100644 --- a/frontend/ui/src/pages/Channels/ChannelsMainPage/index.tsx +++ b/frontend/ui/src/pages/Channels/ChannelsMainPage/index.tsx @@ -1,21 +1,61 @@ -import React from 'react'; - +import React, {useState} from 'react'; import ChatPluginSource from './Sources/ChatPluginSource'; import FacebookSource from './Sources/FacebookSource'; import TwilioSmsSource from './Sources/TwilioSmsSource'; import GoogleSource from './Sources/GoogleSource'; import TwilioWhatsAppSource from './Sources/TwilioWhatsAppSource'; +import {ChannelSource} from 'httpclient'; +import {RequirementsDialog} from '../Facebook/RequirementsDialog'; +import {SmsWhatsappDialogue} from '../Twilio/RequirementsDialog'; +import { + CHANNELS_FACEBOOK_ROUTE, + CHANNELS_TWILIO_SMS_ROUTE, + CHANNELS_TWILIO_WHATSAPP_ROUTE, +} from '../../../routes/routes'; +import {withRouter, RouteComponentProps} from 'react-router-dom'; -import {Channel, ConfigPayload} from 'httpclient'; +import {Channel, Config} from 'httpclient'; import styles from './index.module.scss'; type ChannelsConnectProps = { channels: Channel[]; - config: ConfigPayload; + config: Config; }; -const ChannelsMainPage = (props: ChannelsConnectProps) => { +const ChannelsMainPage = (props: ChannelsConnectProps & RouteComponentProps) => { + const [displayDialogFromSource, setDisplayDialogFromSource] = useState(''); + + const OpenRequirementsDialog = ({source}: {source: string}): JSX.Element => { + switch (source) { + case ChannelSource.facebook: + return ( + setDisplayDialogFromSource('')} + onAddChannel={() => props.history.push(CHANNELS_FACEBOOK_ROUTE)} + /> + ); + case ChannelSource.google: + break; + case ChannelSource.chatPlugin: + break; + case ChannelSource.twilioSMS: + return ( + setDisplayDialogFromSource('')} + onAddChannel={() => props.history.push(CHANNELS_TWILIO_SMS_ROUTE + '/new_account')} + /> + ); + case ChannelSource.twilioWhatsapp: + return ( + setDisplayDialogFromSource('')} + onAddChannel={() => props.history.push(CHANNELS_TWILIO_WHATSAPP_ROUTE + '/new_account')} + /> + ); + } + }; + return ( <>
    @@ -29,11 +69,25 @@ const ChannelsMainPage = (props: ChannelsConnectProps) => {
    + {displayDialogFromSource !== '' && } {props.config.components['sources-chatplugin'].enabled && } - {props.config.components['sources-facebook'].enabled && } - {props.config.components['sources-twilio'].enabled && } + {props.config.components['sources-facebook'].enabled && ( + setDisplayDialogFromSource(source)} + /> + )} + {props.config.components['sources-twilio'].enabled && ( + setDisplayDialogFromSource(source)} + /> + )} {props.config.components['sources-twilio'].enabled && ( - + setDisplayDialogFromSource(source)} + /> )} {props.config.components['sources-google'].enabled && }
    @@ -41,4 +95,4 @@ const ChannelsMainPage = (props: ChannelsConnectProps) => { ); }; -export default ChannelsMainPage; +export default withRouter(ChannelsMainPage); diff --git a/frontend/ui/src/pages/Channels/ConnectedChannelsList/ChannelListItem.module.scss b/frontend/ui/src/pages/Channels/ConnectedChannelsList/ChannelListItem.module.scss new file mode 100644 index 0000000000..838c2a8e03 --- /dev/null +++ b/frontend/ui/src/pages/Channels/ConnectedChannelsList/ChannelListItem.module.scss @@ -0,0 +1,226 @@ +@import 'assets/scss/fonts'; +@import 'assets/scss/colors'; + +.channelItem { + display: flex; + flex-direction: row; + align-items: center; + flex-grow: 1; + height: 64px; + border-bottom: 1px solid var(--color-light-gray); +} + +.channelLogo { + display: flex; + align-items: center; + height: 40px; + width: 40px; + margin-right: 8px; +} + +.channelNameButton { + display: flex; + flex: 1 1; + border-bottom: 1px solid var(--color-light-gray); +} + +.container { + display: flex; +} + +.channelLogoWrapper { + margin-right: 4px; + flex: none; + width: 24px; + height: 24px; + + svg { + width: 24px; + height: 24px; + } +} + +.channelName { + height: 50px; + display: flex; + align-items: center; + padding-left: 16px; +} + +.channelId { + height: 50px; + display: flex; + align-items: center; + padding-left: 16px; +} + +.imageUrlLogo { + width: 35px; + height: 35px; + border-radius: 50%; +} + +.connectedHint { + display: inline-flex; + flex-direction: row; + border: 1px solid var(--color-soft-green); + padding: 0 8px; + border-radius: 4px; + margin-left: 8px; + width: 110px; + + @include font-s; + text-transform: uppercase; + color: var(--color-soft-green); + svg { + position: relative; + top: -1px; + left: 2px; + height: 8px; + width: auto; + margin-top: 5px; + } +} + +.listButtons { + display: flex; + align-items: center; + height: 50px; + position: absolute; + right: 44px; +} + +.disabledDisconnect { + width: 20%; + display: flex; + height: 60px; + align-items: center; + justify-content: flex-end; + margin: 0 4px; + padding: 0 16px; +} + +.channelConnect { + width: 20%; + display: flex; + height: 60px; + align-items: center; + justify-content: flex-end; +} + +.connectButton button { + margin: 0.85em 0; + padding: 0 0.5em; + color: #fff; + background: var(--color-airy-blue); + + &:hover { + color: #fff; + } + text-decoration: none; +} + +header { + display: flex; + justify-content: space-between; + padding: 0.25em 1.25em; + div { + align-self: center; + } +} + +.closeIcon { + padding-right: 5px; + svg path { + fill: red; + } +} + +.errorContainer { + display: flex; + align-items: center; + box-sizing: border-box; + background: #ebf7ff; + border: 1px solid var(--color-light-gray); + border-radius: 4px; + padding: 6px; + margin-top: 24px; + svg { + fill: #a3afb6; + padding-right: 8px; + padding-left: 4px; + padding-top: 2px; + } +} + +:global { + .add-source span { + opacity: 1 !important; + } + .channelsConnect { + @include font-m; + + background-color: var(--color-airy-blue); + color: white; + border-radius: 4px; + text-align: center; + height: 48px; + border: none; + cursor: pointer; + padding: 8px 16px; + margin: 0 0; + + &:hover { + background-color: var(--color-airy-blue-hover); + } + + &:active { + background: var(--color-airy-blue-pressed); + } + + &:disabled { + cursor: not-allowed; + color: var(--color-light-gray); + background-color: var(--color-dark-elements-gray) !important; + } + + &:focus { + outline: none !important; + } + + &::-moz-focus-inner { + border: 0; + } + } +} + +.disconnectModal { + p { + color: var(--color-text-contrast); + font-family: Lato; + font-size: 16px; + letter-spacing: 0; + line-height: 24px; + margin-bottom: 16px; + } + a { + font-weight: 400; + } +} + +.modalSeparator { + margin-top: 24px; + margin-bottom: 24px; + height: 1px; + background: var(--color-light-gray); +} + +.modalButtons { + height: 24px; + display: flex; + justify-content: center; + align-items: center; + button { + margin: 0 8px; + } +} diff --git a/frontend/ui/src/pages/Channels/ConnectedChannelsList/ChannelListItem.tsx b/frontend/ui/src/pages/Channels/ConnectedChannelsList/ChannelListItem.tsx new file mode 100644 index 0000000000..285d98897d --- /dev/null +++ b/frontend/ui/src/pages/Channels/ConnectedChannelsList/ChannelListItem.tsx @@ -0,0 +1,127 @@ +import React, {useState} from 'react'; +import _, {connect, ConnectedProps} from 'react-redux'; +import {disconnectChannel} from '../../../actions/channel'; +import {SettingsModal, Button} from '@airyhq/components'; +import {Channel, ChannelSource} from 'httpclient'; +import {ReactComponent as FacebookLogo} from 'assets/images/icons/messenger_avatar.svg'; +import {ReactComponent as GoogleLogo} from 'assets/images/icons/google_avatar.svg'; +import {ReactComponent as SMSLogo} from 'assets/images/icons/sms_avatar.svg'; +import {ReactComponent as WhatsappLogo} from 'assets/images/icons/whatsapp_avatar.svg'; +import {ReactComponent as AiryLogo} from 'assets/images/icons/airy_avatar.svg'; +import {ReactComponent as CheckMark} from 'assets/images/icons/checkmark.svg'; +import styles from './ChannelListItem.module.scss'; +import {RouteComponentProps, withRouter} from 'react-router-dom'; + +type ChannelItemProps = { + channel: Channel; +} & ConnectedProps & + RouteComponentProps<{channelId: string}>; + +const mapDispatchToProps = { + disconnectChannel, +}; + +const connector = connect(null, mapDispatchToProps); + +const ChannelItem = (props: ChannelItemProps) => { + const {channel} = props; + const [deletePopupVisible, setDeletePopupVisible] = useState(false); + + const isPhoneNumberSource = () => { + return channel.source === 'twilio.sms' || channel.source === 'twilio.whatsapp'; + }; + + const disconnectChannelRequestPayload = { + source: channel.source, + channelId: channel.id, + }; + + const getSourceLogo = (channel: Channel) => { + switch (channel.source) { + case ChannelSource.facebook: + return ; + case ChannelSource.google: + return ; + case ChannelSource.twilioSMS: + return ; + case ChannelSource.twilioWhatsapp: + return ; + default: + return ; + } + }; + + const ChannelIcon = ({channel}: {channel: Channel}) => { + if (channel?.metadata?.imageUrl) { + return ; + } + return getSourceLogo(channel); + }; + + const editChannel = () => { + return {pathname: `/channels/${channel.source}/${channel.id}`, state: {channel: channel}}; + }; + + const disconnectChannel = () => { + props.disconnectChannel(disconnectChannelRequestPayload); + setDeletePopupVisible(false); + }; + + return ( + <> +
    +
    +
    + +
    + +
    {channel.metadata?.name}
    + {isPhoneNumberSource() &&
    {channel.sourceChannelId}
    } + {channel.connected && ( +
    + Connected +
    + )} + +
    + + +
    +
    +
    + + {deletePopupVisible && ( + setDeletePopupVisible(false)}> +
    +

    + You are about to disconnect a channel. You will not receive any new messages in Airy or be able to send + messages anymore. +

    +

    + If you need help or experience a problem, please reach out to{' '} + support@airy.co. +

    +
    +
    + + +
    +
    + + )} + + ); +}; + +export default withRouter(connector(ChannelItem)); diff --git a/frontend/ui/src/pages/Channels/ConnectedChannelsList/ChannelsList.module.scss b/frontend/ui/src/pages/Channels/ConnectedChannelsList/ChannelsList.module.scss new file mode 100644 index 0000000000..95219f629d --- /dev/null +++ b/frontend/ui/src/pages/Channels/ConnectedChannelsList/ChannelsList.module.scss @@ -0,0 +1,162 @@ +@import './../../../assets/scss/fonts'; +@import './../../../assets/scss/colors'; + +.wrapper { + background: white; + display: block; + border-radius: 10px; + padding-left: 96px; + padding-top: 88px; + width: 100%; + overflow-y: auto; + padding: 32px; + margin: 88px 1.5em 0 100px; + min-height: calc(100vh - 170px); +} + +.headline { + @include font-xl; + font-weight: bold; + margin-bottom: 8px; +} + +.backButton { + display: block; + margin-bottom: 16px; + cursor: pointer; + text-decoration: none; + max-width: 200px; + &:hover { + text-decoration: underline; + } +} + +.backIcon { + path { + fill: var(--color-airy-blue); + } + margin-right: 8px; +} + +.inputContainer { + display: flex; + flex-direction: column; + margin-bottom: 32px; + width: 474px; + margin-top: 16px; + + label { + margin-top: 24px; + } + + input { + @include font-base; + } +} + +.subtitle { + display: flex; + flex-direction: column; + @include font-s; + color: var(--color-airy-blue); + img { + width: 17px; + height: 13px; + } +} + +.connectedChannels { + display: flex; + flex-direction: column; + margin-bottom: 32px; + width: 474px; + margin-top: 16px; +} + +.channelRow { + display: flex; + flex-direction: row; +} + +.connectedHint { + display: inline-flex; + align-items: center; + flex-direction: row; + border: 1px solid var(--color-soft-green); + padding: 0 8px; + border-radius: 4px; + margin-left: 8px; + font-family: 'Lato', sans-serif; + font-size: 0.8rem; + line-height: 1rem; + text-transform: uppercase; + color: var(--color-soft-green); +} + +.headlineRow { + display: flex; + place-content: space-between; +} + +.buttons { + display: flex; + flex-direction: row; + align-items: center; + + button { + align-self: center; + height: 40px; + min-width: 40px; + margin-left: 16px; + background: var(--color-blue-white); + border: none; + border-radius: 4px; + cursor: pointer; + } + + button:hover { + background-color: var(--color-background-blue); + } + + button:last-child { + background: var(--color-airy-blue); + svg { + path { + fill: white; + } + } + } + button:last-child:hover { + background-color: var(--color-airy-blue-hover); + } +} + +.searchFieldButtons { + display: flex; + align-items: center; +} + +.searchField { + min-width: 300px; + animation-name: searchFieldAnimation; + animation-duration: 500ms; + animation-fill-mode: forwards; +} + +@keyframes searchFieldAnimation { + 0% { + margin-left: 0px; + width: 0%; + } + 100% { + margin-left: 16px; + width: 200px; + } +} + +.noSearchMatch { + @include font-m; + font-weight: bold; + color: var(--color-text-contrast); + margin-bottom: 4px; +} diff --git a/frontend/ui/src/pages/Channels/ConnectedChannelsList/ChannelsList.tsx b/frontend/ui/src/pages/Channels/ConnectedChannelsList/ChannelsList.tsx new file mode 100644 index 0000000000..0d00db1724 --- /dev/null +++ b/frontend/ui/src/pages/Channels/ConnectedChannelsList/ChannelsList.tsx @@ -0,0 +1,132 @@ +import React, {useEffect, useState} from 'react'; +import _, {connect, ConnectedProps} from 'react-redux'; +import {withRouter, RouteComponentProps, Link} from 'react-router-dom'; +import { + CHANNELS_FACEBOOK_ROUTE, + CHANNELS_CHAT_PLUGIN_ROUTE, + CHANNELS_ROUTE, + CHANNELS_TWILIO_SMS_ROUTE, + CHANNELS_TWILIO_WHATSAPP_ROUTE, +} from './../../../routes/routes'; +import {ReactComponent as BackIcon} from 'assets/images/icons/arrow-left-2.svg'; +import {ReactComponent as SearchIcon} from 'assets/images/icons/search.svg'; +import {ReactComponent as AddChannelIcon} from 'assets/images/icons/plus.svg'; +import {ReactComponent as CloseIcon} from 'assets/images/icons/close.svg'; +import {StateModel} from './../../../reducers'; +import {Channel, ChannelSource} from 'httpclient'; +import {allChannels} from './../../../selectors/channels'; +import ChannelListItem from './ChannelListItem'; +import {SearchField} from '@airyhq/components'; +import styles from './ChannelsList.module.scss'; + +type ChannelsListProps = {} & ConnectedProps & RouteComponentProps<{source: string}>; + +const mapStateToProps = (state: StateModel, ownProps: RouteComponentProps<{source: string}>) => ({ + channels: Object.values(allChannels(state)).filter( + (channel: Channel) => channel.source === ownProps.match.params.source + ), +}); + +const connector = connect(mapStateToProps, null); + +const ChannelsList = (props: ChannelsListProps) => { + const {channels} = props; + const [name, setName] = useState(''); + const [path, setPath] = useState(''); + const [searchText, setSearchText] = useState(''); + const [showingSearchField, setShowingSearchField] = useState(false); + const source = props.match.params.source; + + const filteredChannels = channels.filter((channel: Channel) => + channel?.metadata?.name?.toLowerCase().includes(searchText.toLowerCase()) + ); + + useEffect(() => { + setPageTitle(); + }, [source, channels]); + + const setPageTitle = () => { + switch (source) { + case ChannelSource.facebook: + setName('Facebook Messenger'); + setPath(CHANNELS_FACEBOOK_ROUTE); + break; + case ChannelSource.google: + setName('Google'); + setPath(''); + break; + case ChannelSource.twilioSMS: + setName('Twilio SMS'); + setPath(CHANNELS_TWILIO_SMS_ROUTE + '/new_account'); + break; + case ChannelSource.twilioWhatsapp: + setName('Twilio Whatsapp'); + setPath(CHANNELS_TWILIO_WHATSAPP_ROUTE + '/new_account'); + break; + case ChannelSource.chatPlugin: + setName('Chat Plugin'); + setPath(CHANNELS_CHAT_PLUGIN_ROUTE + '/new'); + break; + } + }; + + const searchFieldState = () => { + if (showingSearchField) { + setShowingSearchField(false); + setSearchText(''); + } else { + setShowingSearchField(true); + } + }; + + return ( +
    +
    +

    {name}

    +
    +
    + {showingSearchField && ( + setSearchText(value)} + autoFocus={true} + resetClicked={() => setSearchText('')} + /> + )} +
    +
    + + +
    +
    +
    + + + Back to channels + +
    + {filteredChannels.length > 0 ? ( + filteredChannels + .sort((channelA: Channel, channelB: Channel) => + channelA.metadata.name.toLowerCase().localeCompare(channelB.metadata.name.toLowerCase()) + ) + .map((channel: Channel) => ( +
    + +
    + )) + ) : ( +
    +

    Result not found.

    +

    Try to search for a different term.

    +
    + )} +
    +
    + ); +}; + +export default withRouter(connector(ChannelsList)); diff --git a/frontend/ui/src/pages/Channels/Facebook/RequirementsDialog.module.scss b/frontend/ui/src/pages/Channels/Facebook/RequirementsDialog.module.scss new file mode 100644 index 0000000000..c4d4955377 --- /dev/null +++ b/frontend/ui/src/pages/Channels/Facebook/RequirementsDialog.module.scss @@ -0,0 +1,86 @@ +@import 'assets/scss/fonts.scss'; +@import 'assets/scss/colors.scss'; + +.container { + display: flex; + flex-direction: column; + width: 582px; + height: 477px; + background: white; + border-radius: 8px; + position: relative; + background: white; + z-index: 1; + position: fixed; + top: 35%; + left: 50%; + transform: translate(-50%, -50%); +} + +.title { + @include font-xl; + align-self: center; + padding-top: 40px; +} + +.headline { + @include font-base; + padding-top: 40px; + padding-left: 40px; +} + +.body { + @include font-base; + margin: 20px 40px 0px 40px; + + ul { + margin-left: 20px; + } + + li { + padding-top: 10px; + } + + p { + padding-top: 15px; + } + + a { + font-weight: normal; + } +} + +.button { + background-color: var(--color-airy-blue); + width: 205px; + height: 40px; + color: white; + border-radius: 4px; + align-items: center; + margin-top: 32px; + margin-left: 40px; + margin-bottom: 40px; + + button { + @include font-base; + width: 205px; + height: 40px; + border: none; + outline: none; + background: transparent; + color: white; + cursor: pointer; + } +} + +.closeButton { + position: absolute; + right: 17px; + top: 17px; + width: 14px; + height: 14px; + border: none; + background: transparent; + cursor: pointer; + outline: none; +} diff --git a/frontend/ui/src/pages/Channels/Facebook/RequirementsDialog.tsx b/frontend/ui/src/pages/Channels/Facebook/RequirementsDialog.tsx new file mode 100644 index 0000000000..47a16b1b5b --- /dev/null +++ b/frontend/ui/src/pages/Channels/Facebook/RequirementsDialog.tsx @@ -0,0 +1,49 @@ +import React from 'react'; +import styles from './RequirementsDialog.module.scss'; +import close from 'assets/images/icons/close.svg'; +import {Button, SettingsModal} from '@airyhq/components'; + +type RequirementsDialogProps = { + onClose: () => void; + onAddChannel: () => void; +}; + +export const RequirementsDialog = (props: RequirementsDialogProps) => { + return ( + props.onClose()}> +
    +
    + +
    +

    Connect Messenger

    +
    +
    +

    The Facebook source requires the following configuration:

    +
    +
    +
      +
    • + An app id and an app secret so that the platform can send messages back via your Facebook application +
    • +
    • A webhook integration so that the platform can ingest messages from your Facebook pages
    • +
    • A page token for each facebook page you intend to integrate
    • +
    +

    + + Check Airy's Documentation + {' '} + for more information. +

    +
    +
    + +
    +
    +
    +
    + ); +}; diff --git a/frontend/ui/src/pages/Channels/Twilio/RequirementsDialog.module.scss b/frontend/ui/src/pages/Channels/Twilio/RequirementsDialog.module.scss new file mode 100644 index 0000000000..f7d9221c6f --- /dev/null +++ b/frontend/ui/src/pages/Channels/Twilio/RequirementsDialog.module.scss @@ -0,0 +1,92 @@ +@import 'assets/scss/fonts.scss'; +@import 'assets/scss/colors.scss'; + +.container { + display: flex; + flex-direction: column; + width: 582px; + height: 477px; + background: white; + border-radius: 8px; + position: relative; + background: white; + z-index: 1; + position: fixed; + top: 35%; + left: 50%; + transform: translate(-50%, -50%); +} + +.title { + @include font-xl; + align-self: center; + padding-top: 40px; +} + +.headline { + @include font-xl; + font-weight: bold; + padding-top: 40px; + padding-left: 40px; +} + +.button { + background-color: var(--color-airy-blue); + width: 205px; + height: 40px; + color: white; + border-radius: 4px; + align-items: center; + margin-top: 32px; + margin-left: 40px; + margin-bottom: 40px; + + button { + @include font-base; + width: 205px; + height: 40px; + border: none; + outline: none; + background: transparent; + color: white; + cursor: pointer; + } +} + +.closeButton { + position: absolute; + right: 17px; + top: 17px; + width: 14px; + height: 14px; + border: none; + background: transparent; + cursor: pointer; + outline: none; +} +.inviteWrapper { + width: 500px; + margin: 20px 40px 0px 40px; +} + +.firstMessage { + @include font-base; + margin: 30px 20px 20px 0px; +} + +.configMessage { + @include font-base; + color: rgba(235, 32, 97, 0.866); + text-decoration: none; + background-color: var(--color-light-gray); +} + +.secondMessage { + @include font-base; + margin: 30px 20px 20px 0px; +} + +.thirdMessage { + @include font-base; + margin: 24px 0px 58px 0px; +} diff --git a/frontend/ui/src/pages/Channels/Twilio/RequirementsDialog.tsx b/frontend/ui/src/pages/Channels/Twilio/RequirementsDialog.tsx new file mode 100644 index 0000000000..7f4a25c48b --- /dev/null +++ b/frontend/ui/src/pages/Channels/Twilio/RequirementsDialog.tsx @@ -0,0 +1,55 @@ +import React from 'react'; +import styles from './RequirementsDialog.module.scss'; +import close from 'assets/images/icons/close.svg'; +import {Button, SettingsModal} from '@airyhq/components'; + +type RequirementsDialogProps = { + onClose: () => void; + onAddChannel: () => void; +}; + +export const SmsWhatsappDialogue = (props: RequirementsDialogProps) => { + return ( + +
    + +
    +

    Connect with Twilio First

    +

    + Before you connect a number for SMS or Whatsapp, you must add a{' '} + + Twilio Auth Token + {' '} + to the{' '} + + infrastructure/airy.conf + {' '} + file. +

    + +

    After that, you have to buy a number.

    + +

    + Check{' '} + + Airy's documentation + {' '} + for more details. +

    + +
    +
    +
    + ); +}; diff --git a/frontend/ui/src/pages/Channels/Twilio/SmsWhatsappForm.module.scss b/frontend/ui/src/pages/Channels/Twilio/SmsWhatsappForm.module.scss new file mode 100644 index 0000000000..aa4b50fe50 --- /dev/null +++ b/frontend/ui/src/pages/Channels/Twilio/SmsWhatsappForm.module.scss @@ -0,0 +1,82 @@ +@import '../../../../../assets/scss/fonts'; +@import '../../../../../assets/scss/colors'; + +.formContainer { + margin-top: 24px; +} + +.formContent { + display: block; + flex-direction: column; +} + +.formContentNumber { + height: 62px; + width: 474px; + margin: 24px 0px 58px 0px; +} + +.formImageCard { + display: flex; + box-sizing: border-box; + height: 100px; + width: 300px; + border: 1px solid var(--color-light-gray); + border-radius: 8px; + background-color: white; + margin-top: 24px; +} + +.emptyLogo { + display: inline-flex; + height: 40px; + width: 40px; + margin: 16px 8px 42px 16px; + svg { + width: 40px; + height: 40px; + } +} + +.imageUploadText { + display: inline-flex; + height: 24px; + width: 190px; + color: #212428; + font-size: 16px; + line-height: 24px; + margin: 16px 20px 2px 0; +} + +.imageUploadSpecs { + display: inline-flex; + height: 48px; + width: 190px; + color: var(--color-text-gray); + font-size: 16px; + letter-spacing: 0; + line-height: 24px; +} + +.imageUploadFooter { + height: 62px; + width: 474px; + margin: 24px 0px 24px 0px; + color: var(--color-text-gray); +} + +.formContentName { + height: 62px; + width: 474px; + margin: 24px 0px 58px 0px; +} + +.inputField { + @include font-base; + background-color: transparent; + width: 100%; + padding: 4px 8px; + border-radius: 4px; + border: 1px solid var(--color-dark-elements-gray); + margin: 5px 0px 5px 0px; +} diff --git a/frontend/ui/src/pages/Channels/Twilio/SmsWhatsappForm.tsx b/frontend/ui/src/pages/Channels/Twilio/SmsWhatsappForm.tsx new file mode 100644 index 0000000000..454eba7064 --- /dev/null +++ b/frontend/ui/src/pages/Channels/Twilio/SmsWhatsappForm.tsx @@ -0,0 +1,76 @@ +import React from 'react'; +import styles from './SmsWhatsappForm.module.scss'; +import {Button, Input, UrlInputField} from '@airyhq/components'; + +type SmsWhatsappFormProps = { + twilioPhoneNumber: string; + placeholder: string; + urlPlaceholder: string; + namePlaceholder: string; + name: string; + urlName: string; + accountName: string; + text: string; + urlText: string; + imageUrl: string; + twilioNumberInput: string; + twilioUrlInput: string; + twilioNameInput: string; + smsFormButton?: string; + whatsappFormButton?: string; + + handleNameInput: (e: React.ChangeEvent) => void; + handleUrlInput: (e: React.ChangeEvent) => void; + handleNumberInput: (e: React.ChangeEvent) => void; + connectTwilioSms: (e: React.ChangeEvent) => void; +}; + +const SmsWhatsappForm = (props: SmsWhatsappFormProps) => { + return ( +
    +
    +
    + +
    + +
    + +
    + +
    + +
    + +
    +
    + ); +}; + +export default SmsWhatsappForm; diff --git a/frontend/ui/src/pages/Channels/index.tsx b/frontend/ui/src/pages/Channels/index.tsx index 67ba5d807f..8ca7c6f5d2 100644 --- a/frontend/ui/src/pages/Channels/index.tsx +++ b/frontend/ui/src/pages/Channels/index.tsx @@ -1,18 +1,25 @@ import React, {useEffect} from 'react'; import _, {connect, ConnectedProps} from 'react-redux'; import {Route, RouteComponentProps, Switch} from 'react-router-dom'; - import {listChannels} from '../../actions/channel'; import {getClientConfig} from '../../actions/config'; import {StateModel} from '../../reducers/index'; import styles from './index.module.scss'; - -import {allChannels} from '../../selectors/channels'; +import {allChannelsConnected} from '../../selectors/channels'; import {setPageTitle} from '../../services/pageTitle'; - import ChannelsMainPage from './ChannelsMainPage'; +import FacebookConnect from './ChannelsMainPage/Sources/FacebookConnect'; +import ChannelsList from '../Channels/ConnectedChannelsList/ChannelsList'; import ChatPluginConnect from './ChannelsMainPage/Sources/ChatPluginConnect'; -import {CHANNELS_CHAT_PLUGIN_ROUTE} from '../../routes/routes'; +import TwilioSmsConnect from './ChannelsMainPage/Sources/TwilioSmsConnect'; +import TwilioWhatsappConnect from './ChannelsMainPage/Sources/TwilioWhatsappConnect'; +import { + CHANNELS_TWILIO_SMS_ROUTE, + CHANNELS_FACEBOOK_ROUTE, + CHANNELS_CONNECTED_ROUTE, + CHANNELS_CHAT_PLUGIN_ROUTE, + CHANNELS_TWILIO_WHATSAPP_ROUTE, +} from '../../routes/routes'; const mapDispatchToProps = { listChannels, @@ -20,7 +27,7 @@ const mapDispatchToProps = { }; const mapStateToProps = (state: StateModel) => ({ - channels: Object.values(allChannels(state)), + channels: Object.values(allChannelsConnected(state)), config: state.data.config, }); @@ -45,7 +52,11 @@ const Channels = (props: ChannelsConnectProps) => { return ( + + + + ); diff --git a/frontend/ui/src/pages/Inbox/ConversationsFilter/Popup.module.scss b/frontend/ui/src/pages/Inbox/ConversationsFilter/Popup.module.scss index 3309185c1f..390087b8c6 100644 --- a/frontend/ui/src/pages/Inbox/ConversationsFilter/Popup.module.scss +++ b/frontend/ui/src/pages/Inbox/ConversationsFilter/Popup.module.scss @@ -175,6 +175,12 @@ } } +.metadataImage { + width: 24px; + height: 24px; + border-radius: 50%; +} + .checkmarkIcon { flex: none; border-radius: 50%; diff --git a/frontend/ui/src/pages/Inbox/ConversationsFilter/Popup.tsx b/frontend/ui/src/pages/Inbox/ConversationsFilter/Popup.tsx index e89c019dca..6f3ddf2dda 100644 --- a/frontend/ui/src/pages/Inbox/ConversationsFilter/Popup.tsx +++ b/frontend/ui/src/pages/Inbox/ConversationsFilter/Popup.tsx @@ -1,22 +1,16 @@ import React, {useEffect, useState} from 'react'; import _, {connect, ConnectedProps} from 'react-redux'; import {sortBy} from 'lodash-es'; - +import {ReactComponent as AiryLogoIcon} from 'assets/images/icons/airy_avatar.svg'; import {SearchField, LinkButton, Button} from '@airyhq/components'; import {Tag as TagModel, Channel, ConversationFilter} from 'httpclient'; - import {listTags} from '../../../actions/tags'; - import {setFilter, resetFilter} from '../../../actions/conversationsFilter'; - import {StateModel} from '../../../reducers'; - import {IconChannelFilter} from '../../../components/IconChannelFilter'; import DialogCustomizable from '../../../components/DialogCustomizable'; import Tag from '../../../components/Tag'; - import {ReactComponent as CheckmarkIcon} from 'assets/images/icons/checkmark.svg'; - import styles from './Popup.module.scss'; import {allChannels} from '../../../selectors/channels'; @@ -176,11 +170,17 @@ const PopUpFilter = (props: PopUpFilterProps) => {
    ) : (
    - + {channel.metadata?.imageUrl ? ( + + ) : channel.source ? ( + + ) : ( + + )}
    )} -
    {channel.metadata?.name}
    +
    {channel.sourceChannelId}
    ))}
    diff --git a/frontend/ui/src/pages/Inbox/MessageInput/index.module.scss b/frontend/ui/src/pages/Inbox/MessageInput/index.module.scss index 4aa7264c81..58e92dc1f2 100644 --- a/frontend/ui/src/pages/Inbox/MessageInput/index.module.scss +++ b/frontend/ui/src/pages/Inbox/MessageInput/index.module.scss @@ -11,6 +11,7 @@ display: flex; flex-grow: 1; margin-bottom: 14px; + margin-top: 24px; } .messageWrap { @@ -18,13 +19,13 @@ border-color: var(--color-airy-blue); border-radius: 8px; display: flex; - flex-direction: column; align-items: normal; - margin-left: 20px; + margin-left: 14px; } .inputWrap { display: flex; + width: 100%; } .messageTextArea { @@ -44,7 +45,7 @@ .sendDiv { display: flex; - margin: 0px 24px 14px 0px; + margin: 0px 24px 0px 0px; } .sendButton { @@ -84,3 +85,134 @@ .sendButtonText svg { position: relative; } + +.messageActionsContainer { + display: flex; + justify-content: center; + align-items: flex-end; + padding: 0 6px 5px 5px; +} + +.messageActionsContainer svg { + height: 20px; + cursor: pointer; +} + +.messageActionsContainer g, +.sendButton g { + fill: inherit; +} + +.messageActionsContainer .emoji { + height: 24px; + top: 2px; + position: relative; +} + +.iconButton { + display: flex; + justify-content: center; + align-items: center; + cursor: pointer; + position: relative; + margin-left: 4px; + width: 30px; + height: 30px; + + svg { + width: 22px; + pointer-events: none; + path { + fill: #a0abb2; + } + } + + .actionToolTip { + @include font-s; + position: absolute; + background-color: var(--color-text-contrast); + color: white; + border-radius: 4px; + padding: 2px 8px; + display: none; + bottom: 33px; + z-index: 2; + } +} + +.iconButton:hover { + background-color: var(--color-background-blue); + border-radius: 50%; + svg { + path { + fill: #4bb3fd; + } + } + + .actionToolTip { + display: block; + } +} + +.iconButton:focus { + outline: none; +} + +.templateButton { + background: transparent; + border: none; +} + +.emojiDrawer { + position: absolute; + right: 72px; + bottom: 75px; +} + +.templateSelector { + width: 164px; + max-height: 184px; + height: auto; + overflow: hidden; + position: relative; + margin: 0 8px 8px 8px; + border-radius: 16px; +} + +.removeTemplateButton { + position: absolute; + top: 3px; + right: 1px; + border: none; + outline: none; + width: 16px; + height: 16px; + padding: 0; + margin: 0; + line-height: 0; + border-radius: 50%; + border: 1px solid white; + cursor: pointer; + z-index: 1; +} + +.removeTemplateButton svg { + width: 8px; + height: 8px; + margin-left: -1px; + margin-top: -1px; +} + +.removeTemplateButton:after { + content: ''; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; +} + +.removeTemplateButton object { + width: 12px; + height: 12px; +} diff --git a/frontend/ui/src/pages/Inbox/MessageInput/index.tsx b/frontend/ui/src/pages/Inbox/MessageInput/index.tsx index 0c1bb19c40..5f4898deb3 100644 --- a/frontend/ui/src/pages/Inbox/MessageInput/index.tsx +++ b/frontend/ui/src/pages/Inbox/MessageInput/index.tsx @@ -3,40 +3,74 @@ import {connect, ConnectedProps} from 'react-redux'; import {useParams} from 'react-router-dom'; import styles from './index.module.scss'; import {sendMessages} from '../../../actions/messages'; +import TemplateSelector from '../TemplateSelector'; +import 'emoji-mart/css/emoji-mart.css'; +import {Picker} from 'emoji-mart'; +import {SourceMessage} from 'render'; + import {ReactComponent as Paperplane} from 'assets/images/icons/paperplane.svg'; +import {ReactComponent as Smiley} from 'assets/images/icons/smiley.svg'; +import {ReactComponent as TemplateAlt} from 'assets/images/icons/template-alt.svg'; +import {ReactComponent as Close} from 'assets/images/icons/close.svg'; + import {StateModel} from '../../../reducers'; -import {getTextMessagePayload} from 'httpclient'; +import {getTextMessagePayload, RenderedContent, Template} from 'httpclient'; +import {listTemplates} from '../../../actions/templates'; +import {cyMessageSendButton, cyMessageTextArea} from 'handles'; const mapDispatchToProps = {sendMessages}; const mapStateToProps = (state: StateModel) => { return { messages: state.data.messages.all, + listTemplates, }; }; const connector = connect(mapStateToProps, mapDispatchToProps); type MessageInputProps = {channelSource: string}; +interface SelectedTemplate { + message: RenderedContent; + source: string; +} + const MessageInput = (props: MessageInputProps & ConnectedProps) => { const {channelSource} = props; + const [input, setInput] = useState(''); + const [isShowingEmojiDrawer, setIsShowingEmojiDrawer] = useState(false); + const [isShowingTemplateModal, setIsShowingTemplateModal] = useState(false); + const [selectedTemplate, setSelectedTemplate] = useState(null); + const textAreaRef = useRef(null); + const sendButtonRef = useRef(null); + const emojiDiv = useRef(null); const handleChange = (e: React.ChangeEvent): void => { setInput(e.target.value); }; useEffect(() => { - textAreaRef.current.style.height = '0px'; - const scrollHeight = textAreaRef.current.scrollHeight; - textAreaRef.current.style.height = scrollHeight + 'px'; + if (input) { + textAreaRef.current.style.height = '0px'; + const scrollHeight = textAreaRef.current.scrollHeight; + textAreaRef.current.style.height = scrollHeight + 'px'; + } }, [input]); const conversationIdParams = useParams(); const currentConversationId: string = conversationIdParams[Object.keys(conversationIdParams)[0]]; const sendMessage = () => { + if (selectedTemplate) { + setSelectedTemplate(null); + props + .sendMessages({conversationId: currentConversationId, message: selectedTemplate.message.content}) + .then(() => setInput('')); + return; + } + props.sendMessages(getTextMessagePayload(channelSource, currentConversationId, input)).then(() => setInput('')); }; @@ -50,29 +84,156 @@ const MessageInput = (props: MessageInputProps & ConnectedProps { + const handleEmojiDrawer = () => { + if (isShowingTemplateModal) { + setIsShowingTemplateModal(false); + } + if (isShowingEmojiDrawer) { + textAreaRef.current && textAreaRef.current.focus(); + } + + setIsShowingEmojiDrawer(!isShowingEmojiDrawer); + }; + + const handleEmojiKeyEvent = e => { + if (e.key === 'Escape') { + handleEmojiDrawer(); + } + }; + + const handleEmojiClickedOutside = e => { + if (emojiDiv.current === null || emojiDiv.current.contains(e.target)) { + return; + } + + handleEmojiDrawer(); + }; + + useEffect(() => { + if (isShowingEmojiDrawer) { + document.addEventListener('keydown', handleEmojiKeyEvent); + document.addEventListener('click', handleEmojiClickedOutside); + + return () => { + document.removeEventListener('keydown', handleEmojiKeyEvent); + document.removeEventListener('click', handleEmojiClickedOutside); + }; + } + }, [isShowingEmojiDrawer]); + + const toggleTemplateModal = () => { + if (isShowingEmojiDrawer) { + setIsShowingEmojiDrawer(false); + } + setIsShowingTemplateModal(!isShowingTemplateModal); + }; + + const selectTemplate = (template: Template) => { + const jsonTemplate = JSON.parse(template.content) as any; + + if ( + jsonTemplate.message.text && + !jsonTemplate.message.suggestions && + !jsonTemplate.message.quick_replies && + !jsonTemplate.message.containsRichText + ) { + setInput(jsonTemplate.message.text); + setIsShowingTemplateModal(false); + } else { + setInput(''); + setIsShowingTemplateModal(false); + const templateContent = JSON.parse(template.content) as any; + setSelectedTemplate({message: {id: template.id, content: templateContent}, source: template.source}); + } + sendButtonRef.current.focus(); + }; + + const addEmoji = emoji => { + const emojiMessage = emoji.native; + + const message = input + ' ' + emojiMessage; + + setInput(message); + + handleEmojiDrawer(); + }; + + return ( +
    + <> + {isShowingTemplateModal && ( + + )} + {isShowingEmojiDrawer && ( +
    + +
    + )} + + + +
    + ); + }; + return (
    -